Отчёт на разных листах (а-ля EXCEL), управляемые формы + выгрузка в Excel без COM

Столкнулся с задачей вывода отчёта на разных листах (а-ля Excel), предлагаю мини статью со своим скромным опытом по этому вопросу. Если есть решение лучше, напишите об этом в комментариях.

Для примера сделаем простейший отчёт, который будет выводить содержимое групп номенклатуры на разные листы.

1

Добавим на форму кнопку «сформировать» реквизит Список групп с типом значений «СправочникСсылка.Номенклатура»

(можно и без реквизита обойтись, но так проще) Листов у нас будет столько, сколько элементов списка. Всё остальное будем добавлять (и удалять) на форму программно.

Отчёту добавим схему СКД, в которой будем получать список номенклатуры переданной группы (через параметр «ГруппаТоваров».)

Создаём группу формы «листы» (для начала проверим, если она уже создана, то удалим её)

Если Элементы.Найти("Листы") <> Неопределено Тогда
Элементы.Удалить(Элементы.Листы);
КонецЕсли;
ЭлементЛисты = Элементы.Добавить("Листы",Тип("ГруппаФормы"));
ЭлементЛисты.Вид = ВидГруппыФормы.Страницы;
ЭлементЛисты.Заголовок = "Листы";
ЭлементЛисты.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСнизу; //По фэншую, как в Экселе

Дальше перебираем группы номенклатуры,  формируем отчёт из скд, создаём листы (удаляем, если нужно, старые),  создаём табличные документы на листах и выводим туда сформированные отчёты.

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

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

 Готовый отчёт  можно скачать ниже. В качестве бонуса туда я прикрутил кнопку, которая сохраняет результат в Excel так же на разные листы.

И добавил выгрузку в эксель без COM объекта с помощью объекта ПакетОтображаемыхДокументов   описанная в этой замечательной статье

2

Приветствуются комментарии. Доброй ночи и удачи.

13 Comments

  1. Ibrogim

    Жду комментариев и конструктивной критики )

    Reply
  2. v3rter

    УТ 11?

    Reply
  3. Ibrogim

    (2)Это принцип (схема), будет работать на любых управляемых формах. А если вы про прикреплённый отчёт, то он будет в любой конфигурации на УФ работать, где есть иерархический справочник «номенклатура»

    Reply
  4. Dmitri93

    Круто) интересная задумка) а типового механизма подобного разве нет?

    Reply
  5. Ibrogim

    (4),Типового не нашёл, если есть, расскажите о нём

    Reply
  6. necropunk

    Удобно. Типового такого тоже ничего подобного не припомню, интересный пример, спасибо.

    Reply
  7. rhtr

    Молодчик!

    Reply
  8. serega_new

    Тема!

    Reply
  9. Ibrogim

    (8)(7) Спасибо )

    Reply
  10. RinGo

    Красиво! Сам думал над этой темой… Спасибо за сэкономленное время!

    Reply
  11. vlastapov

    Да, для пользователей будет привычнее, да еще и выгрузка в EXEL

    Reply
  12. Asmody

    Рекомендую при сохранении книги вставить нечто такое:

    win = book.Windows.item(1);
    win.TabRatio = 0.6;
    win.ScrollWorkbookTabs(, 0);
    book.Sheets(1).Select();
    book.SaveAs(ДиалогВыбораФайла.ПолноеИмяФайла,-4143);
    xlsApp.DisplayAlerts = 1;
    xlsApp.Workbooks.Close();
    xlsApp.Quit();
    

    Показать

    и «развернуть» вставку листов в книгу.

    Тогда при открытии книги в Excel листы будут в «правильном» порядке и будут видны «ярлычки».

    Reply
  13. Ibrogim

    (12) ок, спасибо, попробую

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *