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