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

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

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

Понимание архитектуры отчетов без СКД

В конфигурациях на обычных формах отчеты без СКД чаще всего строятся по одной из двух схем:

  1. Логика находится в модуле объекта — процедура формирования является экспортной в модуле объекта отчета (например, СформироватьОтчет(ТабДок)), а параметры запроса берутся из реквизитов самого отчета.
  2. Логика находится в модуле формы — формирование привязано к элементам управления формы отчета, а экспортная процедура вызывается непосредственно из контекста формы.
  3. Отчет построен на базе «Построителя отчета» или «Универсального отчета» — параметры, группировки и отборы настраиваются через специальный объект построителя.

Главная ошибка начинающих разработчиков — попытка выгрузить промежуточные данные в табличную часть обработки. Это лишнее действие: отчет в 1С всегда выводит данные в объект ТабличныйДокумент, который умеет напрямую сохранять результат на диск методом Записать().

Вариант 1. Формирование через модуль объекта

Если алгоритм построения отчета вынесен в модуль объекта, разберем по шагам, как его вызвать:

  1. Создаем экземпляр объекта отчета через менеджер.
  2. Заполняем реквизиты объекта отчета (период, фильтры, организации, склады).
  3. Инициализируем новый ТабличныйДокумент.
  4. Вызываем экспортную процедуру формирования отчета, передав в нее табличный документ.
  5. Сохраняем табличный документ в файл.

Посмотрим на пример программного кода:


ОтчетОбъект = Отчеты.ОтчетМой.Создать();

// Заполняем реквизиты отчета (параметры построения)
ОтчетОбъект.ДатаНачала = НачалоМесяца(ТекущаяДата());
ОтчетОбъект.ДатаОкончания = КонецМесяца(ТекущаяДата());
ОтчетОбъект.Организация = ВыбОрганизация;

ТабДок = Новый ТабличныйДокумент;

// Вызываем процедуру формирования отчета
ОтчетОбъект.СформироватьОтчет(ТабДок);

// Сохраняем полученный результат в файл Excel
ТабДок.Записать("D:\zapic\otchot.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Вариант 2. Формирование отчета через модуль формы без открытия окна

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


ФормаОтчета = Отчеты.ОтчетМой.ПолучитьФорму("ФормаОтчета");

// Инициализируем реквизиты формы
ФормаОтчета.ДатаНач = НачалоДня(ТекущаяДата());
ФормаОтчета.ДатаКон = КонецДня(ТекущаяДата());

ТабДок = Новый ТабличныйДокумент;
Перем ДеревоВывода;

// Вызываем экспортную процедуру с формы
ФормаОтчета.СформироватьОтчет(ТабДок, ДеревоВывода);

// Записываем результат на диск
ТабДок.Записать("D:\zapic\otchot.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Причина ошибки «Дата не может быть записана в базу данных на MS SQL Server»

При программном вызове неинициализированного отчета часто возникает исключение:

«Ошибка в значении типа Дата. Дата 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) для отчетов на базе УниверсальныйОтчет заполнение выполняется через его реквизиты:


ОтчетОбъект = Отчеты.Продажи.Создать();
ОтчетОбъект.УниверсальныйОтчет.ДатаНач = НачалоМесяца(ТекущаяДата());
ОтчетОбъект.УниверсальныйОтчет.ДатаКон = КонецМесяца(ТекущаяДата());
ОтчетОбъект.УниверсальныйОтчет.ДобавитьОтбор("Организация", Истина, ВидСравнения.Равно, ВыбОрганизация);

ТабДок = Новый ТабличныйДокумент;
ОтчетОбъект.СформироватьОтчет(ТабДок);

Особенности сохранения в формат Excel

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

  1. XLS (Excel 97-2003) — задается перечислением ТипФайлаТабличногоДокумента.XLS. Имеет жесткое ограничение: максимум 65 536 строк и 256 колонок.
  2. XLSX (Excel 2007+) — задается перечислением ТипФайлаТабличногоДокумента.XLSX. Поддерживает до 1 048 576 строк, обеспечивает сжатие данных и меньший размер итогового файла.

Если выгрузка отчета выполняется на стороне сервера под управлением Linux, убедитесь, что на сервере установлен пакет базовых шрифтов Microsoft (msttcorefonts / corefonts), иначе результирующий файл Excel может содержать искажения ширины колонок и стилей ячеек.

← На главную