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

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

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

Разбор основных этапов программного вывода отчета

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

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

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

Для начала рассмотрим, как получить доступ к схеме компоновки данных и загрузить нужные настройки. Предположим, что наш код выполняется в модуле обработки или отчета. Выясним, как программно обратиться к основной схеме компоновки.


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

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

// Если нужно использовать настройки конкретного компоновщика (например, из формы):
// Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();

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

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

Проанализируем работу объекта КомпоновщикМакетаКомпоновкиДанных. Этот объект подготавливает "инструкцию" для процессора компоновки, учитывая особенности платформы и доступные типы данных. Разберем по шагам код генерации макета:


КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

Здесь ДанныеРасшифровки — это необязательный параметр. Если мы формируем отчет для сохранения в файл, расшифровка нам обычно не требуется, поэтому можно передать Неопределено.

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

Теперь рассмотрим самый важный этап — загрузку данных и их обработку. Для этого мы используем ПроцессорКомпоновкиДанных. Этот объект отвечает за выполнение запросов к базе данных и расчет итогов. Посмотрим на пример кода:


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

// Создаем табличный документ, куда будет выведен результат
ТабДок = Новый ТабличныйДокумент;

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

// Выводим результат
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

Шаг 4: Сохранение результата в PDF

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


ПутьКФайлу = "C:\Reports\DailyReport.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);

Обратите внимание: при работе в серверном контексте (например, в регламентном задании), путь к файлу должен быть доступен пользователю, от имени которого запущен агент сервера 1С. Рекомендуется использовать временные папки через функцию ПолучитьИмяВременногоФайла("pdf").

Шаг 5: Автоматизация рассылки отчета по почте

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


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "report_bot@mail.ru";
Профиль.Пароль = "your_strong_password";
Профиль.ИспользоватьSSLSMTP = Истина;

Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "report_bot@mail.ru";
Сообщение.Получатели.Добавить("manager@company.com");
Сообщение.Тема = "Ежедневный отчет от " + Формат(ТекущаяДата(), "ДЛФ=D");
Сообщение.Тексты.Добавить("Добрый день! Во вложении сформированный отчет.");

// Прикрепляем файл, который мы сохранили ранее
Сообщение.Вложения.Добавить(ПутьКФайлу);

Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();

Особенности работы с параметрами и отборами

Часто требуется программно изменить отбор перед выводом. Разберем по шагам, как найти нужный параметр в КомпоновщикеНастроек и установить его значение. Это критически важно, если один и тот же отчет должен формироваться с разными данными для разных получателей.


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

// Установка программного отбора по организации
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
ЭлементОтбора.Использование = Истина;

Проанализировав данный подход, мы видим, что СКД предоставляет мощный API для управления данными. Мы можем динамически менять структуру отчета, добавлять поля или изменять порядок сортировки, не заходя в конструктор макета.

Рекомендации по оптимизации производительности

При формировании очень больших отчетов (десятки тысяч строк) могут возникнуть проблемы с памятью на сервере. Рассмотрим несколько советов, как избежать сбоев:

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

← На главную