При разработке интеграционных механизмов, таких как Web-сервисы, HTTP-сервисы (REST API) или регламентные фоновые задания, часто возникает задача сформировать отчет и передать его во внешнюю систему в виде файла Excel. Главная сложность, с которой сталкиваются разработчики, заключается в том, что на сервере отсутствует контекст клиентской формы и нет прямого доступа к элементам интерфейса, таким как ЭлементыФормы.Результат или вызовам ОткрытьФорму().
Разберем детально, как правильно программно инициализировать схему компоновки данных (СКД), вывести отчет в невидимый табличный документ на стороне сервера и выгрузить его в формат Excel.
Проанализируем архитектуру работы с табличными документами в платформе 1С:Предприятие. Объект ТабличныйДокумент доступен как на клиенте, так и на сервере. Разница заключается лишь в том, что на сервере его невозможно интерактивно отобразить пользователю через метод Показать(). Однако все операции по заполнению документа, выводу результатов компоновки и сохранению в файл на сервере выполняются в полном объеме.
Для генерации отчета без интерфейса вместо обращения к элементам формы создается экземпляр объекта ТабличныйДокумент в оперативной памяти, который затем передается в процессор вывода или метод компоновки.
Рассмотрим стандартный программный цикл компоновки данных. Процесс состоит из нескольких последовательных шагов:
КомпоновщикМакетаКомпоновкиДанных.ПроцессорКомпоновкиДанных).ТабличныйДокумент).ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.Посмотрим на пример серверной процедуры, реализующей этот алгоритм:
// Создаем переменные для компоновки
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Формируем макет компоновки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Создаем табличный документ в памяти сервера
ТабличныйДокументРезультат = Новый ТабличныйДокумент;
// Выводим результат отчета в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
// Сохраняем результат во временный файл Excel
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
Попытка
ТабличныйДокументРезультат.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанныеОтчета = Новый ДвоичныеДанные(ИмяВременногоФайла);
// Полученные двоичные данные можно вернуть через веб-сервис или сохранить в ХранилищеЗначения
ГотовыйОтчетXLSX = Новый ХранилищеЗначения(ДвоичныеДанныеОтчета);
Исключение
УдалитьФайлы(ИмяВременногоФайла);
ВызватьИсключение;
КонецПопытки;
УдалитьФайлы(ИмяВременногоФайла);
Если требуется сформировать существующий в конфигурации отчет без ручного создания процессоров компоновки и вывода, разберем более лаконичный путь. Платформа 1С предоставляет встроенный метод объекта отчета — СкомпоноватьРезультат().
Посмотрим на пример программного вызова объекта отчета:
// Получаем объект отчета из метаданных
ОтчетОбъект = Отчеты.ЗадолженностьПокупателей.Создать();
// При необходимости загружаем нужный вариант настроек или изменяем параметры
Схема = ОтчетОбъект.СхемаКомпоновкиДанных;
Настройки = Схема.ВариантыНастроек.Основной.Настройки;
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
// Создаем результирующий документ
ТабличныйДокументРезультат = Новый ТабличныйДокумент;
// Выполняем формирование (автоматически отработает обработчик ПриКомпоновкеРезультата)
ОтчетОбъект.СкомпоноватьРезультат(ТабличныйДокументРезультат);
// Сохраняем в файл
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокументРезультат.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
ТипФайлаТабличногоДокумента.XLSX вместо устаревшего ТипФайлаТабличногоДокумента.XLS. Формат XLS имеет жесткое ограничение на 65 536 строк и 256 колонок, что при формировании больших отчетов приведет к обрезанию данных или ошибке переполнения.ПолучитьИмяВременногоФайла() только генерирует путь, но не очищает созданный файл автоматически после завершения сеанса. Всегда оборачивайте операции с временными файлами в блоки обработки исключений и вызывайте УдалитьФайлы(), чтобы не заполнять дисковое пространство сервера.ПотокВПамяти через метод Записать(), после чего извлекать ДвоичныеДанные напрямую из оперативной памяти.УстановитьПривилегированныйРежим(Истина), если бизнес-логика требует выгрузки агрегированных данных независимо от прав текущего подключения.