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