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

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

При разработке интеграционных механизмов, таких как Web-сервисы, HTTP-сервисы (REST API) или регламентные фоновые задания, часто возникает задача сформировать отчет и передать его во внешнюю систему в виде файла Excel. Главная сложность, с которой сталкиваются разработчики, заключается в том, что на сервере отсутствует контекст клиентской формы и нет прямого доступа к элементам интерфейса, таким как ЭлементыФормы.Результат или вызовам ОткрытьФорму().

Разберем детально, как правильно программно инициализировать схему компоновки данных (СКД), вывести отчет в невидимый табличный документ на стороне сервера и выгрузить его в формат Excel.

Принцип работы с отчетами на стороне сервера

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

Для генерации отчета без интерфейса вместо обращения к элементам формы создается экземпляр объекта ТабличныйДокумент в оперативной памяти, который затем передается в процессор вывода или метод компоновки.

Пошаговое формирование отчета СКД и сохранение в Excel

Рассмотрим стандартный программный цикл компоновки данных. Процесс состоит из нескольких последовательных шагов:

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

Посмотрим на пример серверной процедуры, реализующей этот алгоритм:


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

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

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

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

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

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

// Сохраняем результат во временный файл Excel
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
Попытка
    ТабличныйДокументРезультат.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
    ДвоичныеДанныеОтчета = Новый ДвоичныеДанные(ИмяВременногоФайла);
    
    // Полученные двоичные данные можно вернуть через веб-сервис или сохранить в ХранилищеЗначения
    ГотовыйОтчетXLSX = Новый ХранилищеЗначения(ДвоичныеДанныеОтчета);
Исключение
    УдалитьФайлы(ИмяВременногоФайла);
    ВызватьИсключение;
КонецПопытки;

УдалитьФайлы(ИмяВременногоФайла);

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

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

Посмотрим на пример программного вызова объекта отчета:


// Получаем объект отчета из метаданных
ОтчетОбъект = Отчеты.ЗадолженностьПокупателей.Создать();

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

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

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

// Сохраняем в файл
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокументРезультат.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Важные практические нюансы при серверной выгрузке

  1. Выбор формата сохранения: Рекомендуется использовать перечисление ТипФайлаТабличногоДокумента.XLSX вместо устаревшего ТипФайлаТабличногоДокумента.XLS. Формат XLS имеет жесткое ограничение на 65 536 строк и 256 колонок, что при формировании больших отчетов приведет к обрезанию данных или ошибке переполнения.
  2. Очистка временных файлов: Метод ПолучитьИмяВременногоФайла() только генерирует путь, но не очищает созданный файл автоматически после завершения сеанса. Всегда оборачивайте операции с временными файлами в блоки обработки исключений и вызывайте УдалитьФайлы(), чтобы не заполнять дисковое пространство сервера.
  3. Работа с потоками в памяти: Чтобы избежать создания файлов на диске при высоких нагрузках, можно сохранять табличный документ напрямую в ПотокВПамяти через метод Записать(), после чего извлекать ДвоичныеДанные напрямую из оперативной памяти.
  4. Права доступа в Web-сервисах: Если веб-сервис запускается под системным пользователем с ограниченным доступом, при выполнении запросов компоновки используйте метод УстановитьПривилегированныйРежим(Истина), если бизнес-логика требует выгрузки агрегированных данных независимо от прав текущего подключения.
← На главную