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