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