Как настроить формирование внешнего отчета в фоновом режиме при запуске из дополнительных отчетов?

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

При разработке внешних отчетов в системе «1С:Предприятие 8.3» разработчики часто сталкиваются с различием в поведении отчета: если открыть файл через главное меню Файл → Открыть, отчет формируется в фоновом режиме, не блокируя пользовательский интерфейс, а при открытии того же отчета из справочника Дополнительные отчеты и обработки (подсистема БСП) компоновка результата выполняется синхронно, намертво замораживая сеанс пользователя.

Разберем причины такого поведения платформы и библиотечных механизмов, а также рассмотрим несколько способов реализации фонового формирования внешнего отчета.

Причины различий в поведении отчета

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

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

Способ 1. Отключение безопасного режима при регистрации отчета

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


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
    ПараметрыРегистрации.Наименование = "Отчет по продажам (внешний)";
    ПараметрыРегистрации.Версия = "1.0";
    
    // Отключаем безопасный режим для возможности запуска фоновых потоков
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = "Открыть отчет";
    Команда.Идентификатор = "ОткрытьОтчет";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    Команда.ПоказыватьОповещение = Ложь;

    Возврат ПараметрыРегистрации;

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

После изменения кода модуля отчет необходимо заново загрузить или обновить в справочнике Дополнительные отчеты и обработки. Установка параметра БезопасныйРежим в значение Ложь снимает ограничения на создание фоновых потоков из внешнего объекта.

Способ 2. Интеграция со стандартной формой отчетов БСП

Для правильного формирования отчета в фоне без отключения механизмов безопасности рекомендуется использовать типовую форму отчетов БСП (ОбщаяФорма.ФормаОтчета) и подсистему «Варианты отчетов». Разберем по шагам, как это реализовать:

  1. В свойствах внешнего отчета в дереве метаданных укажем стандартное хранилище вариантов — ХранилищеВариантовОтчетов.
  2. Удалим собственную основную форму отчета, чтобы платформа использовала стандартную общую форму конфигурации.
  3. В модуле объекта внешнего отчета определим процедуру настройки формы:

Процедура ОпределитьНастройкиФормы(Форма, ИтогНастроек) Экспорт

    ИтогНастроек.ФормироватьПриОткрытии = Ложь;
    ИтогНастроек.События.ПриКомпоновкеРезультата = Истина;

КонецПроцедуры

В функции регистрации дополнительного отчета обязательно укажем флаг использования настроек формы:

ПараметрыРегистрации.Вставить("ОпределитьНастройкиФормы", Истина);

В таком варианте формирование отчета будет полностью управляться БСП в стандартном неблокирующем окне с анимацией ожидания и возможностью отмены операции.

Способ 3. Фоновое выполнение через подсистему «Длительные операции»

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

Рассмотрим подробнее вызов длительной операции из формы внешнего отчета:


&НаКлиенте
Процедура СформироватьОтчетВФоне()

    ПараметрыПроцедуры = Новый Структура;
    ПараметрыПроцедуры.Вставить("НастройкиКомпоновки", Отчет.КомпоновщикНастроек.ПолучитьНастройки());
    
    ПараметрыВыполнения = ДлительныеОперацииКлиент.ПараметрыВыполненияФункции(ЭтотОбъект);
    ПараметрыВыполнения.ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеФоновогоФормирования", ЭтотОбъект);
    
    // Запуск фонового метода через ссылку на внешний отчет
    ДлительнаяОперация = ДлительныеОперацииКлиент.ВыполнитьФункцию(
        ПараметрыВыполнения,
        "ДополнительныеОтчетыИОбработки.ВыполнитьФункцию",
        ПараметрыПроцедуры
    );

КонецПроцедуры

На стороне сервера внутри фонового потока БСП выполнит повторное подключение двоичных данных отчета через метод ВнешниеОтчеты.Подключить() с использованием ОписаниеЗащитыОтОпасныхДействий, что гарантирует стабильное исполнение кода даже на платформах версий 8.3.10 и выше.

Способ 4. Перенос отчета в расширение конфигурации

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

Отчеты, находящиеся в расширениях:

  1. Являются полноценными объектами метаданных и компилируются в основном контексте сервера.
  2. Не требуют вызовов ВнешниеОтчеты.Подключить() и передачи двоичных данных в поток.
  3. Поддерживают метод СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый) напрямую из формы без каких-либо ограничений прав.
← На главную