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