Как программно сформировать отчет на сервере и сохранить его в файл в УТ 10.3

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке регламентных заданий в конфигурациях на базе «обычных форм», таких как 1С:Управление торговлей 10.3, программисты часто сталкиваются с проблемой: код формирования отчета, который отлично работает на клиенте, «падает» на сервере. Это происходит потому, что в старых конфигурациях логика отчетов (особенно построенных на базе Универсального отчета) тесно переплетена с экранными формами и элементами управления. На сервере же объект Форма недоступен, а попытка вызвать метод ПолучитьФорму() приведет к ошибке.

В этой статье мы разберем, как адаптировать формирование отчета для серверного контекста, научимся программно инициализировать настройки и сохранять результат в файл без участия пользователя.

Проблема зависимости от формы

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

Для решения задачи нам потребуется выполнить три основных шага:

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

Шаг 1: Инициализация Универсального отчета на сервере

В УТ 10.3 большинство отчетов используют механизм УниверсальныйОтчет. Обычно в форме вызывается метод УниверсальныйОтчет.ФормаПриОткрытии(), но на сервере мы должны инициализировать настройки вручную. Проанализируем, как это сделать:


// Создаем объект отчета программно
ОтчетОбъект = Отчеты.ВедомостьВзаиморасчетыСКонтрагентами.Создать();

// Вместо работы с формой, инициализируем внутренние механизмы Универсального отчета
ОтчетОбъект.УниверсальныйОтчет.УстановитьНачальныеНастройки();

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

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

Шаг 2: Программное формирование результата

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

Посмотрим на пример кода, который заменяет интерактивное нажатие кнопки «Сформировать»:


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

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

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

Шаг 3: Сохранение отчета в файл

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


ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmm") + ".pdf";
ПутьКФайлу = "C:\Reports\" + ИмяФайла; // Убедитесь, что папка доступна серверу 1С

Попытка
    РезультатТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
    Сообщить("Отчет успешно сохранен: " + ПутьКФайлу);
Исключение
    ЗаписьЖурналаРегистрации("ФормированиеОтчета", УровеньЖурналаРегистрации.Ошибка, , , 
        "Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;

Особенности работы с СКД на сервере

Если ваш отчет в УТ 10.3 переведен на Систему Компоновки Данных (СКД), процесс будет выглядеть иначе. Здесь не нужно эмулировать работу формы, так как СКД изначально спроектирована для работы в различных контекстах. Разберем последовательность действий для СКД:

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

Пример реализации для отчета на СКД:


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

// Инициализируем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, Настройки);

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

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

ТабДок.Записать("C:\Temp\Report.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Резюме и практические советы

Подведем итоги нашего исследования. Чтобы успешно формировать отчеты в УТ 10.3 на сервере, придерживайтесь следующих правил:

Используя эти методы, мы сможем автоматизировать получение любой отчетности в фоновом режиме, что значительно повысит эффективность работы системы.

← На главную