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