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