Как программно выполнить отчет на СКД и сохранить результат в файл?

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

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

Основные этапы программного выполнения СКД

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

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

Вариант 1: Полный программный цикл (максимальная гибкость)

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


// 1. Создаем объект отчета и получаем его схему
ИмяОтчета = "ПродажиПоСкладам";
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
СхемаСКД = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

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

// 3. Подготовка макета компоновки
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

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

// 6. Сохранение на диск
ПутьКФайлу = "C:\Reports\Report_Sales.xlsx";
РезультатТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Разберем важный нюанс: в методе КомпоновщикМакета.Выполнить() третьим параметром мы передаем ДанныеРасшифровки. Если вы формируете отчет в фоновом задании или просто сохраняете его в файл без намерения открывать и «кликать» по ячейкам, этот параметр можно оставить пустым, однако для корректной работы объект лучше инициализировать.

Вариант 2: Использование метода СкомпоноватьРезультат (упрощенный)

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


// Создаем объект и табличный документ
ОтчетОбъект = Отчеты.МойОтчет.Создать();
Результат = Новый ТабличныйДокумент;

// Устанавливаем настройки, если это необходимо
// Например, используем текущие настройки компоновщика настроек отчета
Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();

// Вызываем стандартный метод компоновки
ОтчетОбъект.СкомпоноватьРезультат(Результат);

// Сохраняем результат
Результат.Записать("C:\Temp\Report.pdf", ТипФайлаТабличногоДокумента.PDF);

Метод СкомпоноватьРезультат удобен тем, что он автоматически выполняет все те шаги (создание процессоров, макетов), которые мы описывали в первом варианте. Однако помните, что этот метод доступен на сервере, в толстом клиенте или внешнем соединении.

Работа с настройками и параметрами

Часто возникает вопрос: как правильно передать в программно вызываемый отчет те настройки, которые пользователь уже сделал в форме? Для этого проанализируем коллекцию КомпоновщикНастроек. Метод ПолучитьНастройки() возвращает фактические настройки, учитывающие и то, что задано в схеме, и то, что пользователь изменил в «пользовательских настройках» на форме.

Проанализируем пример передачи настроек из одного отчета в другой:


// Допустим, мы находимся в форме Отчета №1 и хотим вызвать Отчет №2
НастройкиВторогоОтчета = Отчеты.Отчет2.Создать().КомпоновщикНастроек.ПолучитьНастройки();

// Копируем отборы из текущего отчета (в котором нажата кнопка)
Для Каждого ЭлементОтбора Из ЭтотОбъект.Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
    // Здесь можно реализовать логику копирования фильтров
КонецЦикла;

Вывод результата в коллекцию значений (Таблица значений)

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


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

// Теперь ТЗ_Результат содержит все колонки и строки, сформированные СКД
Для Каждого Строка Из ТЗ_Результат Цикл
    Сообщить(Строка.Номенклатура);
КонецЦикла;

Важно: При выводе в коллекцию значений иерархия СКД может быть потеряна, если не настроить структуру вывода соответствующим образом. Обычно такой метод используется для получения «плоских» таблиц данных.

Нюансы при работе на Управляемых Формах (УФ)

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

  1. Сформировать ТабличныйДокумент на сервере.
  2. Поместить его во временное хранилище или вернуть на клиент как значение.
  3. На клиенте вызвать метод Записать().

Однако, если задача — записать файл на диск сервера (например, в общую сетевую папку), то весь код от начала до конца выполняется на сервере. Не забывайте проверять права доступа службы, под которой запущен сервер 1С, к целевым папкам на диске.

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

← На главную