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