При разработке обработок интеграции, выгрузки данных и регламентных задач часто возникает необходимость сформировать существующий в конфигурации отчет в фоновом режиме (без интерактивного открытия формы) и сохранить результат в файл формата Microsoft Excel. Если отчет создан без использования Системы компоновки данных (СКД) в обычном приложении 1С, стандартные методы работы с компоновщиком макета не подойдут. Рассмотрим подробно, как правильно инициализировать отчет, передать входные параметры и выгрузить сформированный табличный документ.
В конфигурациях на обычных формах отчеты без СКД чаще всего строятся по одной из двух схем:
СформироватьОтчет(ТабДок)), а параметры запроса берутся из реквизитов самого отчета.Главная ошибка начинающих разработчиков — попытка выгрузить промежуточные данные в табличную часть обработки. Это лишнее действие: отчет в 1С всегда выводит данные в объект ТабличныйДокумент, который умеет напрямую сохранять результат на диск методом Записать().
Если алгоритм построения отчета вынесен в модуль объекта, разберем по шагам, как его вызвать:
ТабличныйДокумент.Посмотрим на пример программного кода:
ОтчетОбъект = Отчеты.ОтчетМой.Создать();
// Заполняем реквизиты отчета (параметры построения)
ОтчетОбъект.ДатаНачала = НачалоМесяца(ТекущаяДата());
ОтчетОбъект.ДатаОкончания = КонецМесяца(ТекущаяДата());
ОтчетОбъект.Организация = ВыбОрганизация;
ТабДок = Новый ТабличныйДокумент;
// Вызываем процедуру формирования отчета
ОтчетОбъект.СформироватьОтчет(ТабДок);
// Сохраняем полученный результат в файл Excel
ТабДок.Записать("D:\zapic\otchot.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Если процедура СформироватьОтчет находится исключительно в модуле формы отчета, мы можем программно получить объект формы без вызова метода Открыть(). Форма отработает в памяти, заполнит табличный документ и вернет его:
ФормаОтчета = Отчеты.ОтчетМой.ПолучитьФорму("ФормаОтчета");
// Инициализируем реквизиты формы
ФормаОтчета.ДатаНач = НачалоДня(ТекущаяДата());
ФормаОтчета.ДатаКон = КонецДня(ТекущаяДата());
ТабДок = Новый ТабличныйДокумент;
Перем ДеревоВывода;
// Вызываем экспортную процедуру с формы
ФормаОтчета.СформироватьОтчет(ТабДок, ДеревоВывода);
// Записываем результат на диск
ТабДок.Записать("D:\zapic\otchot.xlsx", ТипФайлаТабличногоДокумента.XLSX);
При программном вызове неинициализированного отчета часто возникает исключение:
«Ошибка в значении типа Дата. Дата 02.01.0001 не может быть записана в базу данных на MS SQL Server с нулевым смещением дат».
Выясним причину: в СУБД Microsoft SQL Server минимальная поддерживаемая дата типа DATETIME — 01.01.1753. Если база 1С создана со смещением дат 0, пустая дата 1С (0001-01-01) не может быть передана в SQL-запрос. В интерактивном режиме формы часто автоматически подставляют текущую дату при открытии, а при программном создании реквизиты дат остаются пустыми.
Для устранения ошибки необходимо явно заполнять все реквизиты дат объекта или формы перед запуском формирования:
ОтчетОбъект.ДатаНачала = НачалоДня(ТекущаяДата());
ОтчетОбъект.ДатаКонца = КонецДня(ТекущаяДата());
Если отчет использует ПостроительОтчета, параметры и отборы передаются через встроенные коллекции построителя:
ОтчетОбъект = Отчеты.ОтчетМой.Создать();
// Передача параметров в запрос построителя
ОтчетОбъект.ПостроительОтчета.Параметры.Вставить("ДатаНач", НачалоДня(ТекущаяДата()));
ОтчетОбъект.ПостроительОтчета.Параметры.Вставить("ДатаКон", КонецДня(ТекущаяДата()));
// Установка отбора
ОтборНоменклатура = ОтчетОбъект.ПостроительОтчета.Отбор.Найти("Номенклатура");
Если ОтборНоменклатура <> Неопределено Тогда
ОтборНоменклатура.Использование = Истина;
ОтборНоменклатура.Значение = ВыбНоменклатура;
ОтборНоменклатура.ВидСравнения = ВидСравнения.Равно;
КонецЕсли;
ТабДок = Новый ТабличныйДокумент;
ОтчетОбъект.СформироватьОтчет(ТабДок);
В типовых конфигурациях (УТ 10.3, УПП 1.3, КА 1.1) для отчетов на базе УниверсальныйОтчет заполнение выполняется через его реквизиты:
ОтчетОбъект = Отчеты.Продажи.Создать();
ОтчетОбъект.УниверсальныйОтчет.ДатаНач = НачалоМесяца(ТекущаяДата());
ОтчетОбъект.УниверсальныйОтчет.ДатаКон = КонецМесяца(ТекущаяДата());
ОтчетОбъект.УниверсальныйОтчет.ДобавитьОтбор("Организация", Истина, ВидСравнения.Равно, ВыбОрганизация);
ТабДок = Новый ТабличныйДокумент;
ОтчетОбъект.СформироватьОтчет(ТабДок);
Проанализируем доступные форматы выгрузки:
ТипФайлаТабличногоДокумента.XLS. Имеет жесткое ограничение: максимум 65 536 строк и 256 колонок.ТипФайлаТабличногоДокумента.XLSX. Поддерживает до 1 048 576 строк, обеспечивает сжатие данных и меньший размер итогового файла.Если выгрузка отчета выполняется на стороне сервера под управлением Linux, убедитесь, что на сервере установлен пакет базовых шрифтов Microsoft (msttcorefonts / corefonts), иначе результирующий файл Excel может содержать искажения ширины колонок и стилей ячеек.