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

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

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

Разберем основные объекты СКД

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

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

Шаг 1: Инициализация схемы и настроек

Рассмотрим первый этап. Нам нужно получить саму схему. Чаще всего она хранится в макете отчета. Выясним, как правильно обратиться к ней и инициализировать компоновщик настроек.


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

// Инициализируем настройки (берем настройки по умолчанию или загружаем сохраненные)
Настройки = СхемаСКД.НастройкиПоУмолчанию;

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

Обратите внимание, что при работе с параметрами крайне важно устанавливать свойство Использование в значение Истина, иначе платформа проигнорирует переданное значение.

Шаг 2: Создание макета компоновки

Проанализируем процесс создания макета. На этом этапе 1С преобразует абстрактные настройки СКД в конкретный набор инструкций для SQL-сервера или внутреннего движка БД. Мы используем КомпоновщикМакетаКомпоновкиДанных.


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);

Параметр ДанныеРасшифровки здесь может быть равен Неопределено, если мы формируем отчет в фоновом задании и нам не нужна интерактивность.

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

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


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

// Подготовим табличный документ для вывода
ТабДок = Новый ТабличныйДокумент;

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

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

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

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


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

Важный момент: если код выполняется на сервере под управлением Linux, убедитесь, что в системе установлены шрифты (например, msttcorefonts), иначе текст в PDF может отображаться некорректно или превратиться в "квадраты".

Дополнительные советы по оптимизации

Посмотрим на ситуацию с точки зрения производительности. При формировании тяжелых отчетов через СКД рекомендуется:

Таким образом, мы разобрали полный цикл работы с отчетом. Данный подход универсален и применим практически для любой конфигурации на платформе 1С:Предприятие 8.3, будь то 1С:ERP, 1С:Бухгалтерия или самописная система. Программное управление СКД дает разработчику полный контроль над данными и представлением, позволяя автоматизировать самые сложные бизнес-процессы.

← На главную