Как реализовать автоматическое формирование отчетов и обработок по расписанию в 1С:Предприятии 8.3?

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

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

Отказ от контекста формы в пользу данных

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

Чтобы запустить отчет по расписанию, необходимо разделить задачу на три этапа:

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

Формирование отчетов на базе Системы компоновки данных (СКД)

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

Рассмотрим, как выглядит серверная процедура формирования отчета СКД в фоновом режиме:


Функция СформироватьОтчетСКД(ОбъектОтчета, СохраненныеНастройки) Экспорт

    СхемаКомпоновки = ОбъектОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Применяем сохраненные настройки
    Если СохраненныеНастройки <> Неопределено Тогда
        Настройки = СохраненныеНастройки;
    Иначе
        Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
    КонецЕсли;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    ТабДок = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат ТабДок;

КонецФункции

Посмотрим на сохранение настроек: когда пользователь интерактивно настраивает отчет на клиенте, достаточно сериализовать текущие настройки компоновщика:


// В модуле формы или команды сохранения задачи
НастройкиДляСохранения = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
Хранилище = Новый ХранилищеЗначения(НастройкиДляСохранения);

Универсальный запуск произвольных отчетов и обработок

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

Разберем пример реализации такой функции в модуле объекта отчета:


Функция СформироватьОтчетПоПараметрам(ПараметрыОтчета) Экспорт

    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("Макет");
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПродажиОбороты.Период КАК Период,
        |   ПродажиОбороты.Номенклатура КАК Номенклатура,
        |   ПродажиОбороты.СуммаОборот КАК Сумма
        |ИЗ
        |   РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День, Организация = &Организация) КАК ПродажиОбороты";
        
    Запрос.УстановитьПараметр("ДатаНачала", ПараметрыОтчета.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ПараметрыОтчета.ДатаОкончания);
    Запрос.УстановитьПараметр("Организация", ПараметрыОтчета.Организация);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    ТабДок.Вывести(ОбластьШапка);
    
    Пока Выборка.Следующий() Цикл
        ОбластьСтрока.Параметры.Заполнить(Выборка);
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
    
    Возврат ТабДок;

КонецФункции

Для автоматизации сбора настроек из управляемой формы можно использовать метод ПолучитьРеквизиты(). Он позволяет программно обойти элементы формы и собрать их имена и значения в единую Структуру без необходимости перечислять каждое поле вручную.

Сохранение настроек через стандартные хранилища

Платформа 1С содержит встроенные механизмы хранения пользовательских параметров — ХранилищеОбщихНастроек и ХранилищеСистемныхНастроек. С их помощью можно сохранять варианты настроек в разрезе пользователей и объектов метаданных без создания дополнительных регистров:


// Сохранение структуры параметров
ХранилищеОбщихНастроек.Сохранить("РегламентныеЗаданияОтчетов", ИмяОтчета, СтруктураПараметров);

// Чтение структуры параметров в фоновом задании
Параметры = ХранилищеОбщихНастроек.Загрузить("РегламентныеЗаданияОтчетов", ИмяОтчета);

Сохранение файла на сервере и важные ограничения

После получения готового ТабличныйДокумент в регламентном задании выполняется его выгрузка в файл методом Записать():


ПутьКФайлу = "\\server\share\reports\Report_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

При реализации серверного формирования обязательно учитываем следующие нюансы:

  1. Права доступа к файловой системе: Сохранение на диск выполняет служба кластера серверов 1С (процесс rphost). Учетная запись операционной системы, от имени которой запущена служба 1С, должна иметь полные права на запись в целевой каталог или сетевую папку.
  2. Отсутствие интерактивных вызовов: В модулях объектов и общих модулях, задействованных в формировании, не должно быть методов Предупреждение(), Вопрос(), открытия диалогов файлов и работы с буфером обмена. Любой интерактивный вызов в регламентном задании приведет к аварийному завершению сеанса с ошибкой.
  3. Ограничение доступа (RLS): Фоновое задание выполняется в контексте пользователя, указанного в настройках регламентного задания. Если в базе включен RLS, отчет покажет только разрешенные этому пользователю данные. При необходимости сформировать полный отчет используется вызов УстановитьПривилегированныйРежим(Истина).
← На главную