Система компоновки данных (СКД) — это мощнейший инструмент платформы 1С:Предприятие 8, который позволяет создавать сложные отчёты практически без написания кода. Однако в реальной практике программиста часто возникают задачи, когда стандартного вывода через форму отчета недостаточно. Например, когда необходимо сформировать отчет в фоновом задании, отправить его по электронной почте или программно изменить параметры перед выводом. В этой статье мы подробно разберем, как реализовать программное формирование отчета на СКД «от и до».
Для того чтобы программно получить результат работы схемы компоновки данных, нам необходимо последовательно задействовать несколько объектов платформы. Процесс можно сравнить с конвейерной лентой, где каждый объект выполняет свою строго определенную роль. Проанализируем эти этапы:
СхемаКомпоновкиДанных.КомпоновщикНастроек для установки параметров и отборов.МакетКомпоновки с помощью КомпоновщикМакета.ПроцессорКомпоновкиДанных.ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент (или в коллекцию значений).Рассмотрим ситуацию, когда отчет уже существует в конфигурации. Нам нужно получить его схему. Проанализируем код получения схемы и инициализации настроек:
// Получаем схему из макета отчета
СхемаСКД = Отчеты.НашОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем настройки по умолчанию или из настроек текущего объекта
Настройки = СхемаСКД.НастройкиПоУмолчанию;
// Если нужно использовать настройки пользователя с формы:
// Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Важно понимать, что НастройкиПоУмолчанию — это те настройки, которые вы задали в конфигураторе на закладке «Настройки» схемы СКД. Если отчет вызывается из модуля формы, мы можем взять текущие настройки компоновщика формы.
Разберем подробнее, как управлять параметрами. Часто требуется установить период или конкретную организацию программно, не полагаясь на действия пользователя. Для этого мы обращаемся к коллекции ПараметрыДанных в наших настройках.
// Установка значения параметра "Период"
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрПериод.Использование = Истина;
КонецЕсли;
// Установка отбора по Организации
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
ЭлементОтбора.Использование = Истина;
Обратите внимание на использование объекта ПолеКомпоновкиДанных. Это критически важный момент: при программной работе с отборами мы не можем просто передать строку, нам нужно обернуть имя поля в специальный тип данных платформы.
Выясним причину, по которой нельзя сразу вывести данные. Перед выводом платформа должна подготовить «инструкцию» для процессора — макет компоновки. На этом этапе 1С сопоставляет настройки со схемой, учитывает доступные права и функциональные опции. Для этого используется КомпоновщикМакета.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Генерация макета
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);
Объект ДанныеРасшифровки (тип ДанныеРасшифровкиКомпоновкиДанных) необходим, если вы планируете выводить результат в табличный документ на форме и хотите, чтобы по двойному клику открывались документы или справочники.
Теперь перейдем к самому процессу получения данных. ПроцессорКомпоновкиДанных отвечает за выполнение запросов к базе данных и расчет итогов. После этого ПроцессорВывода сформирует визуальное представление (табличный документ).
Проанализируем финальный блок кода:
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Готовим табличный документ для результата
ТабДок = Новый ТабличныйДокумент;
// Выводим результат
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Теперь ТабДок содержит готовый отчет.
// Его можно показать пользователю или сохранить в файл:
// ТабДок.Записать("C:\Reports\Report.pdf", ТипФайлаТабличногоДокумента.PDF);
Иногда нам не нужно показывать отчет пользователю, а нужно получить данные СКД (со всеми итогами, группировками и вычисляемыми полями) в виде ТаблицаЗначений или ДеревоЗначений для дальнейшей обработки в коде. В этом случае мы заменим ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент на ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.
Посмотрим на пример:
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Теперь в ТаблицаРезультат лежат данные отчета
При работе с программным выводом СКД следует учитывать несколько важных моментов:
СхемаКомпоновкиДанных и процессоры недоступны.Инициализировать процессора компоновки в виде структуры.Мы детально рассмотрели процесс программного управления СКД. Этот подход позволяет автоматизировать построение отчетности любой сложности, интегрировать выгрузки в сторонние системы и создавать гибкие инструменты анализа данных, выходящие за рамки стандартных возможностей пользовательского интерфейса 1С:Предприятие.