Как программно сформировать отчет на СКД и сохранить его в PDF?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В разработке на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации формирования отчетности. Одной из наиболее востребованных функций является программное формирование отчета на базе Системы компоновки данных (СКД) с последующей отправкой по почте или сохранением в файл, например, в формате PDF. В этой статье мы подробно разберем, как реализовать этот процесс, проанализируем необходимые объекты платформы и составим универсальный программный код.

Общая схема программной компоновки

Для того чтобы программно получить результат отчета, нам необходимо имитировать действия, которые платформа выполняет автоматически при нажатии кнопки "Сформировать". Разберем по шагам, какие объекты нам понадобятся:

  1. Схема компоновки данных — это костяк нашего отчета, где описаны запросы, наборы данных и связи.
  2. Настройки компоновки — текущие настройки пользователя или настройки по умолчанию (отборы, параметры, выбранные поля).
  3. Компоновщик макета — объект, который соединяет схему и настройки в готовый макет для исполнения.
  4. Процессор компоновки — "двигатель", который выполняет запрос к базе данных и подготавливает результат.
  5. Процессор вывода — инструмент, который переносит подготовленные данные в финальный документ (обычно ТабличныйДокумент).

Шаг 1: Получение схемы и настроек

Проанализируем ситуацию, когда отчет уже встроен в конфигурацию. Сначала нам нужно получить саму схему и загрузить настройки, которые мы хотим применить. Рассмотрим пример кода, где мы инициализируем эти объекты:


// Получаем схему из состава метаданных отчета
СхемаСКД = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

// Берем настройки по умолчанию или текущие настройки компоновщика
Настройки = СхемаСКД.НастройкиПоУмолчанию;

Если нам необходимо программно изменить какой-либо параметр, например, дату отчета, мы обращаемся к коллекции ПараметрыДанных. Разберем подробнее, как это сделать:


ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
    ПараметрПериод.Значение = КонецДня(ТекущаяДата());
    ПараметрПериод.Использование = Истина;
КонецЕсли;

Шаг 2: Компоновка макета и выполнение

Теперь, когда у нас есть схема и настроенные параметры, нам нужно создать МакетКомпоновки. На этом этапе платформа преобразует абстрактные инструкции СКД в конкретный набор запросов к СУБД. Выясним причину использования КомпоновщикМакетаКомпоновкиДанных: он учитывает особенности типа генератора (в нашем случае — для табличного документа).


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

Следующим шагом инициализируем ПроцессорКомпоновкиДанных. Обратите внимание, что если в вашем отчете используются внешние наборы данных, их необходимо передать именно в этот момент.


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Шаг 3: Вывод результата в Табличный документ

Для того чтобы данные обрели визуальную форму, мы используем ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Мы создаем пустой ТабличныйДокумент, который и станет контейнером для нашего отчета.


ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);

// Начинаем вывод
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Рассмотрим подробнее альтернативный вариант вывода. Если отчет очень большой, использование метода Вывести() целиком может занять много оперативной памяти. В таких случаях проанализируем возможность поэлементного вывода через цикл Пока, используя метод Следующий() процессора компоновки.

Шаг 4: Сохранение в формате PDF

После того как ТабличныйДокумент заполнен данными, задача по его сохранению решается одним методом Записать(). Платформа 1С поддерживает нативное сохранение в PDF без использования сторонних принтеров или библиотек.


ПутьКФайлу = "C:\Reports\DailyReport.pdf";
Попытка
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
    Сообщить("Отчет успешно сохранен по пути: " + ПутьКФайлу);
Исключение
    Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;

Важные нюансы и рекомендации

При работе с программным выводом СКД следует учитывать несколько критически важных моментов:

Посмотрим на пример установки параметра вывода "Заголовок":


ЭлементВывода = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Title"));
Если ЭлементВывода <> Неопределено Тогда
    ЭлементВывода.Значение = "Ежедневный отчет по продажам";
    ЭлементВывода.Использование = Истина;
КонецЕсли;

Таким образом, мы разобрали полный цикл работы с отчетом: от манипуляции схемой СхемаКомпоновкиДанных до формирования итогового файла. Использование данного подхода позволяет гибко настраивать отчеты "на лету" и автоматизировать выдачу информации без участия пользователя.

← На главную