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