При переходе с платформы 1С 7.7 или при переносе рутинных задач пользователей в регламентные задания разработчики часто сталкиваются с задачей: как автоматически запускать отчеты ночью с заданными параметрами, сохранять результат в файл или отправлять его по почте без участия пользователя. В управляемом приложении 1С 8.3 контекст клиентской формы не существует на сервере, поэтому восстановить и сформировать форму целиком невозможно. Разберем, как правильно организовать фоновое формирование отчетов и обработок на платформе 1С 8.3.
Проанализируем главную архитектурную ошибку: попытку сохранить объект формы отчета. В клиент-серверном режиме управляемого приложения форма отвечает исключительно за визуальное отображение. Серверному коду форма не требуется — нужны только значения параметров (период, отборы, списки организаций, флаги) и логика построения отчета.
Чтобы запустить отчет по расписанию, необходимо разделить задачу на три этапа:
ТабличныйДокумент и сохраняет его на диск.Если отчет разработан на СКД, платформа предоставляет полностью независимый от форм механизм работы с настройками. Настройки отчета (НастройкиКомпоновкиДанных и ПользовательскиеНастройкиКомпоновкиДанных) отделены от интерфейса и могут быть легко сохранены в реквизит с типом ХранилищеЗначения.
Рассмотрим, как выглядит серверная процедура формирования отчета СКД в фоновом режиме:
Функция СформироватьОтчетСКД(ОбъектОтчета, СохраненныеНастройки) Экспорт
СхемаКомпоновки = ОбъектОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Применяем сохраненные настройки
Если СохраненныеНастройки <> Неопределено Тогда
Настройки = СохраненныеНастройки;
Иначе
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТабДок;
КонецФункции
Посмотрим на сохранение настроек: когда пользователь интерактивно настраивает отчет на клиенте, достаточно сериализовать текущие настройки компоновщика:
// В модуле формы или команды сохранения задачи
НастройкиДляСохранения = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
Хранилище = Новый ХранилищеЗначения(НастройкиДляСохранения);
Если отчеты и обработки построены без СКД (с использованием запросов и макетов табличных документов вручную), в модуль объекта каждого отчета добавляется унифицированная экспортная функция. Она принимает структуру параметров и возвращает заполненный ТабличныйДокумент.
Разберем пример реализации такой функции в модуле объекта отчета:
Функция СформироватьОтчетПоПараметрам(ПараметрыОтчета) Экспорт
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Период КАК Период,
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.СуммаОборот КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, Организация = &Организация) КАК ПродажиОбороты";
Запрос.УстановитьПараметр("ДатаНачала", ПараметрыОтчета.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ПараметрыОтчета.ДатаОкончания);
Запрос.УстановитьПараметр("Организация", ПараметрыОтчета.Организация);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ТабДок.Вывести(ОбластьШапка);
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Возврат ТабДок;
КонецФункции
Для автоматизации сбора настроек из управляемой формы можно использовать метод ПолучитьРеквизиты(). Он позволяет программно обойти элементы формы и собрать их имена и значения в единую Структуру без необходимости перечислять каждое поле вручную.
Платформа 1С содержит встроенные механизмы хранения пользовательских параметров — ХранилищеОбщихНастроек и ХранилищеСистемныхНастроек. С их помощью можно сохранять варианты настроек в разрезе пользователей и объектов метаданных без создания дополнительных регистров:
// Сохранение структуры параметров
ХранилищеОбщихНастроек.Сохранить("РегламентныеЗаданияОтчетов", ИмяОтчета, СтруктураПараметров);
// Чтение структуры параметров в фоновом задании
Параметры = ХранилищеОбщихНастроек.Загрузить("РегламентныеЗаданияОтчетов", ИмяОтчета);
После получения готового ТабличныйДокумент в регламентном задании выполняется его выгрузка в файл методом Записать():
ПутьКФайлу = "\\server\share\reports\Report_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
При реализации серверного формирования обязательно учитываем следующие нюансы:
rphost). Учетная запись операционной системы, от имени которой запущена служба 1С, должна иметь полные права на запись в целевой каталог или сетевую папку.Предупреждение(), Вопрос(), открытия диалогов файлов и работы с буфером обмена. Любой интерактивный вызов в регламентном задании приведет к аварийному завершению сеанса с ошибкой.УстановитьПривилегированныйРежим(Истина).