Исполнение плана производства / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПользовательскиеНастройкиМодифицированы = Ложь;
	
	ПараметрСценарий = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "Сценарий");
	
	Если НЕ ЗначениеЗаполнено(ПараметрСценарий.Значение) Тогда
		ВызватьИсключение НСтр("ru= 'Не заполнено значение параметра ""Сценарий"".'");
	КонецЕсли; 
	
	СтруктураЗначений = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПараметрСценарий.Значение, "Периодичность, ПланированиеПоНазначениям");
	Периодичность = СтруктураЗначений.Периодичность;
	ИспользоватьНазначения = СтруктураЗначений.ПланированиеПоНазначениям;
	КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек, "ИспользоватьНазначения", ИспользоватьНазначения);
	
	Период = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "ПериодВыпуска").Значение; // СтандартныйПериод -
	
	ДатаОкончания = ПланированиеКлиентСервер.РассчитатьДатуОкончанияПериода(Период.ДатаНачала, Периодичность);
	
	Если ДатаОкончания < Период.ДатаОкончания Тогда
		ИспользоватьИтоги = Истина;
	Иначе
		ИспользоватьИтоги = Ложь;
	КонецЕсли; 
	
	Параметр = Новый ПараметрКомпоновкиДанных("ГоризонтальноеРасположениеОбщихИтогов");
	ПараметрГоризонтальноеРасположениеОбщихИтогов = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти(Параметр);
	
	Если ИспользоватьИтоги Тогда
		ПараметрГоризонтальноеРасположениеОбщихИтогов.Значение = РасположениеИтоговКомпоновкиДанных.Начало;
	Иначе
		ПараметрГоризонтальноеРасположениеОбщихИтогов.Значение = РасположениеИтоговКомпоновкиДанных.Нет;
	КонецЕсли;
	
	СегментыСервер.ВключитьОтборПоСегментуНоменклатурыВСКД(КомпоновщикНастроек);
	
	НастроитьСхемуПоТипуПроцесса();
	НастроитьСхемуКомпоновкиДанныхКА();

	Планирование.ИсполнениеПлановПриКомпоновкеРезультата(СхемаКомпоновкиДанных, КомпоновщикНастроек, 
		ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка);

	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

	КоллекцияЭлементовСтруктуры = НастройкиОтчета.Структура;
	
	Если ТипЗнч(КоллекцияЭлементовСтруктуры[0]) = Тип("ТаблицаКомпоновкиДанных") Тогда
		
		Если КоллекцияЭлементовСтруктуры[0].Колонки[0].Имя = "Расшифровка" Тогда
			ИмяЭлементаСтруктуры = КоллекцияЭлементовСтруктуры[0].Колонки[0].Имя;
			ПолеГруппировкиЭлементаСтруктуры = КоллекцияЭлементовСтруктуры[0].Колонки[0].ПоляГруппировки.Элементы[0].Поле;
		Иначе
			ИмяЭлементаСтруктуры = КоллекцияЭлементовСтруктуры[0].Строки[0].Имя;
			ПолеГруппировкиЭлементаСтруктуры = КоллекцияЭлементовСтруктуры[0].Строки[0].ПоляГруппировки.Элементы[0].Поле;
		КонецЕсли;
		
	Иначе
		
		ИмяЭлементаСтруктуры = КоллекцияЭлементовСтруктуры[0].Имя;
		ПолеГруппировкиЭлементаСтруктуры = КоллекцияЭлементовСтруктуры[0].ПоляГруппировки.Элементы[0].Поле;
		
	КонецЕсли;
	
	// Переопределение структуры отчета при расшифровке по полю Регистратор
	Если ИмяЭлементаСтруктуры = "Расшифровка" Тогда
		
		ПолеРегистратор = Новый ПолеКомпоновкиДанных("Регистратор");
		
		Если ПолеГруппировкиЭлементаСтруктуры = ПолеРегистратор Тогда
			
			Планирование.ПереопределитьНастройкиРасшифровкиОтчета(СхемаКомпоновкиДанных, КомпоновщикНастроек, ДанныеРасшифровки);
			
			НастройкиОтчета = ДанныеРасшифровки.Настройки;
			МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
			
		КонецЕсли;
	КонецЕсли;

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	// Сообщим форме отчета, что настройки модифицированы
	Если ПользовательскиеНастройкиМодифицированы Тогда
		КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Вставить(
			"ПользовательскиеНастройкиМодифицированы", Истина);
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Планирование.ИсполнениеПлановОбработкаПроверкиЗаполнения(КомпоновщикНастроек, Отказ);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Настройки общей формы отчета подсистемы "Варианты отчетов".
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения - Форма отчета.
//   КлючВарианта - Строка - Имя предопределенного варианта отчета или уникальный идентификатор пользовательского.
//   Настройки - См. ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Настройки.События.ПриСозданииНаСервере = Истина;
	Настройки.События.ПриЗагрузкеВариантаНаСервере = Истина;
	Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;
	
КонецПроцедуры

// Вызывается в обработчике одноименного события формы отчета после выполнения кода формы.
//
// Параметры:
//   ЭтаФорма - ФормаКлиентскогоПриложения - Форма отчета.
//   Отказ - Булево - Передается из параметров обработчика "как есть".
//   СтандартнаяОбработка - Булево - Передается из параметров обработчика "как есть".
//
// См. также:
//   "ФормаКлиентскогоПриложения.ПриСозданииНаСервере" в синтакс-помощнике.
//
Процедура ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Экспорт
	
	Параметры = ЭтаФорма.Параметры;
	
	// Дополнительные команды
	НастройкиОтчета = ЭтаФорма.НастройкиОтчета;
	
	Если Параметры.Свойство("Расшифровка")
	   И Параметры.Расшифровка <> Неопределено Тогда
		
		// Исправление варианта отчета при расшифровке
		Если ЭтоАдресВременногоХранилища(Параметры.Расшифровка.Данные) Тогда
			
			ДанныеРасшифровки = ПолучитьИзВременногоХранилища(Параметры.Расшифровка.Данные);
			
			Если Параметры.Свойство("КлючВарианта") И Параметры.КлючВарианта = Неопределено Тогда
				Параметры.КлючВарианта = ДанныеРасшифровки.Настройки.ДополнительныеСвойства.КлючВарианта;
			КонецЕсли;
			
			ЭтаФорма.КлючТекущегоВарианта = ДанныеРасшифровки.Настройки.ДополнительныеСвойства.КлючВарианта;
			
		КонецЕсли;
		
		НастройкиОтчета.ВариантСсылка = ВариантыОтчетов.ВариантОтчета(НастройкиОтчета.ОтчетСсылка, ЭтаФорма.КлючТекущегоВарианта);
		
	КонецЕсли;
	
КонецПроцедуры

// Вызывается в одноименном обработчике формы отчета после выполнения кода формы.
//
Процедура ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт
	
	Параметры = Форма["Параметры"];
	
	Если НЕ УправлениеДаннымиОбИзделиях.ДоступноОписаниеТипаПроизводственногоПроцесса() Тогда
		КомпоновкаДанныхСервер.УдалитьПараметрИзПользовательскихНастроекОтчета(
			КомпоновщикНастроек,
			"ТипПроизводственногоПроцесса");
	КонецЕсли;
	
	Если Параметры.Свойство("Расшифровка")
	   И Параметры.Расшифровка <> Неопределено Тогда
		
		Если ЭтоАдресВременногоХранилища(Параметры.Расшифровка.Данные) Тогда
			
			ДопустимыеОтклоненияКоличества = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "ДопустимыеОтклоненияПроцент");
			Если ДопустимыеОтклоненияКоличества <> Неопределено Тогда
				ДопустимыеОтклоненияКоличества.Использование = Ложь;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

// Вызывается в одноименном обработчике формы отчета после выполнения кода формы.
//
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
	
	Если НЕ УправлениеДаннымиОбИзделиях.ДоступноОписаниеТипаПроизводственногоПроцесса() Тогда
		КомпоновкаДанныхСервер.УдалитьПараметрИзПользовательскихНастроекОтчета(
			КомпоновщикНастроек,
			"ТипПроизводственногоПроцесса");
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура НастроитьСхемуПоТипуПроцесса()
	
	Если УправлениеДаннымиОбИзделиях.ДоступноОписаниеТипаПроизводственногоПроцесса() Тогда
		
		ТипПроцесса = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "ТипПроизводственногоПроцесса").Значение;
		
		Если ТипПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка Тогда
			
			КомпоновкаДанныхСервер.ОтключитьВыбранноеПолеВПользовательскихНастройках(КомпоновщикНастроек, "Факт.Количество");
			КомпоновкаДанныхСервер.ОтключитьВыбранноеПолеВПользовательскихНастройках(КомпоновщикНастроек, "ИсполнениеПлана.Количество");
			КомпоновкаДанныхСервер.ОтключитьВыбранноеПолеВПользовательскихНастройках(КомпоновщикНастроек, "ПользовательскиеПоля.Поле1");
			
		Иначе
			
			ВыбранныеПоля = КомпоновщикНастроек.Настройки.Выбор;
			
			ИдентификаторПользовательскойНастройкиВыбранныхПолей = ВыбранныеПоля.ИдентификаторПользовательскойНастройки;
			ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
			
			ПользовательскиеНастройкиВыбранныхПолей = ПользовательскиеНастройки.Элементы.Найти(
				ИдентификаторПользовательскойНастройкиВыбранныхПолей);
			
			Если ПользовательскиеНастройкиВыбранныхПолей <> Неопределено Тогда
				
				МассивЭлементов      = Новый Массив;
				МассивЗначенийПоиска = Новый Массив;
				МассивЗначенийПоиска.Добавить(Новый ПолеКомпоновкиДанных("Факт.Количество"));
				МассивЗначенийПоиска.Добавить(Новый ПолеКомпоновкиДанных("ИсполнениеПлана.Количество"));
				МассивЗначенийПоиска.Добавить(Новый ПолеКомпоновкиДанных("ПользовательскиеПоля.Поле1"));
				
				Для Каждого ЗначениеПоиска Из МассивЗначенийПоиска Цикл
					НайтиВыбранноеПолеРекурсивно(ПользовательскиеНастройкиВыбранныхПолей.Элементы, МассивЭлементов, ЗначениеПоиска);
				КонецЦикла;
				
				Для Каждого Элемент Из МассивЭлементов Цикл
					Элемент.Использование = Истина;
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЕсли;
		
	Иначе
		
		Параметр = КомпоновкаДанныхСервер.ПолучитьПараметрСКД(СхемаКомпоновкиДанных, "ТипПроизводственногоПроцесса");
		Параметр.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто;
		
		КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек, "ТипПроизводственногоПроцесса", Неопределено, Ложь);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура НастроитьСхемуКомпоновкиДанныхКА()
	
	КомпоновкаДанныхСервер.ОтключитьВыбранноеПолеВПользовательскихНастройках(КомпоновщикНастроек, "Заказано.Количество");
	
КонецПроцедуры

// Заполняет массив элементов компоновки.
//
// Параметры:
//   КоллекцияЭлементов - КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных, КоллекцияВыбранныхПолейКомпоновкиДанных, КоллекцияЭлементовОтбораКомпоновкиДанных, КоллекцияЭлементовПорядкаКомпоновкиДанных - Описание
//   МассивЭлементов - Массив - Массив элементов выбранных полей.
//   ЗначениеПоиска - ПолеКомпоновкиДанных - Значение поиска.
//
Процедура НайтиВыбранноеПолеРекурсивно(КоллекцияЭлементов, МассивЭлементов, ЗначениеПоиска)
	
	Для каждого Элемент Из КоллекцияЭлементов Цикл
		
		Если ТипЗнч(Элемент) = Тип("ВыбранноеПолеКомпоновкиДанных") Тогда
			Если Элемент.Поле = ЗначениеПоиска Тогда
				МассивЭлементов.Добавить(Элемент);
			КонецЕсли;
		ИначеЕсли ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда
			Продолжить;
		Иначе
			НайтиВыбранноеПолеРекурсивно(Элемент.Элементы, МассивЭлементов, ЗначениеПоиска);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#КонецЕсли

Связанные материалы