При разработке регламентных заданий в конфигурациях на базе «обычных форм», таких как 1С:Управление торговлей 10.3, программисты часто сталкиваются с проблемой: код формирования отчета, который отлично работает на клиенте, «падает» на сервере. Это происходит потому, что в старых конфигурациях логика отчетов (особенно построенных на базе Универсального отчета) тесно переплетена с экранными формами и элементами управления. На сервере же объект Форма недоступен, а попытка вызвать метод ПолучитьФорму() приведет к ошибке.
В этой статье мы разберем, как адаптировать формирование отчета для серверного контекста, научимся программно инициализировать настройки и сохранять результат в файл без участия пользователя.
Рассмотрим типичную ситуацию: в модуле отчета или обработки есть код, который обращается к ЭлементыФормы.ПолеТабличногоДокументаРезультат. Для регламентного задания, которое выполняется в фоновом режиме на сервере, такой подход неприемлем. Выясним причину: серверный процесс 1С:Предприятия работает в неинтерактивном режиме, где графический интерфейс отсутствует в принципе.
Для решения задачи нам потребуется выполнить три основных шага:
ТабличныйДокумент.В УТ 10.3 большинство отчетов используют механизм УниверсальныйОтчет. Обычно в форме вызывается метод УниверсальныйОтчет.ФормаПриОткрытии(), но на сервере мы должны инициализировать настройки вручную. Проанализируем, как это сделать:
// Создаем объект отчета программно
ОтчетОбъект = Отчеты.ВедомостьВзаиморасчетыСКонтрагентами.Создать();
// Вместо работы с формой, инициализируем внутренние механизмы Универсального отчета
ОтчетОбъект.УниверсальныйОтчет.УстановитьНачальныеНастройки();
// Устанавливаем необходимые параметры периода
ОтчетОбъект.УниверсальныйОтчет.ДатаНач = НачалоДня(ТекущаяДата());
ОтчетОбъект.УниверсальныйОтчет.ДатаКон = КонецДня(ТекущаяДата());
Если вам необходимо восстановить ранее сохраненные настройки пользователя (как это обсуждалось на форуме), следует использовать методы общего модуля УправлениеОтчетами или напрямую работать с регистром сведений СохраненныеНастройки. Однако для регламентных заданий чаще всего настройки задаются жестко в коде или берутся из предопределенных параметров.
Теперь рассмотрим самый важный момент — подмену экранной формы программным объектом. Вместо того чтобы выводить данные в ЭлементыФормы, мы создадим новый ТабличныйДокумент и передадим его в процедуру формирования.
Посмотрим на пример кода, который заменяет интерактивное нажатие кнопки «Сформировать»:
// Создаем пустой табличный документ
РезультатТабДок = Новый ТабличныйДокумент;
// Вызываем метод формирования.
// В УТ 10.3 процедура СформироватьОтчет в модуле объекта обычно принимает ТабличныйДокумент
ОтчетОбъект.СформироватьОтчет(РезультатТабДок);
Важное примечание: Если типовой метод СформироватьОтчет внутри себя все равно обращается к форме (через ЭтаФорма или ЭлементыФормы), вам придется создать в модуле объекта свою процедуру, например, СформироватьОтчетДляСервера(), и скопировать туда логику, очищенную от интерактивных вызовов.
После того как РезультатТабДок заполнен, нам остается лишь сохранить его на диск. На сервере крайне важно использовать пути, к которым у службы 1С есть права доступа. Проанализируем процесс сохранения в формате PDF или Excel:
ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmm") + ".pdf";
ПутьКФайлу = "C:\Reports\" + ИмяФайла; // Убедитесь, что папка доступна серверу 1С
Попытка
РезультатТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Сообщить("Отчет успешно сохранен: " + ПутьКФайлу);
Исключение
ЗаписьЖурналаРегистрации("ФормированиеОтчета", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;
Если ваш отчет в УТ 10.3 переведен на Систему Компоновки Данных (СКД), процесс будет выглядеть иначе. Здесь не нужно эмулировать работу формы, так как СКД изначально спроектирована для работы в различных контекстах. Разберем последовательность действий для СКД:
ТабличныйДокумент.Пример реализации для отчета на СКД:
// Получаем настройки по умолчанию
Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// Инициализируем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, Настройки);
// Процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Вывод в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ТабДок.Записать("C:\Temp\Report.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Подведем итоги нашего исследования. Чтобы успешно формировать отчеты в УТ 10.3 на сервере, придерживайтесь следующих правил:
ПолучитьФорму(). Работайте напрямую с Объектом отчета и его свойствами.УстановитьНачальныеНастройки() для инициализации построителя отчета.Новый ТабличныйДокумент вручную.C:\Users\Администратор\Desktop для него, скорее всего, будет недоступен. Используйте общие сетевые ресурсы или временные папки сервера.Используя эти методы, мы сможем автоматизировать получение любой отчетности в фоновом режиме, что значительно повысит эффективность работы системы.