При разработке внешних отчетов в системе «1С:Предприятие 8.3» разработчики часто сталкиваются с различием в поведении отчета: если открыть файл через главное меню Файл → Открыть, отчет формируется в фоновом режиме, не блокируя пользовательский интерфейс, а при открытии того же отчета из справочника Дополнительные отчеты и обработки (подсистема БСП) компоновка результата выполняется синхронно, намертво замораживая сеанс пользователя.
Разберем причины такого поведения платформы и библиотечных механизмов, а также рассмотрим несколько способов реализации фонового формирования внешнего отчета.
Проанализируем ситуацию и выясним, почему возникает такое различие:
ФоновыеЗадания.Выполнить). Однако новый серверный поток не имеет доступа к объекту внешнего отчета из сеанса пользователя — ему необходимо заново подключить двоичные данные отчета через ВнешниеОтчеты.Подключить(). Если механизмы безопасности или параметры регистрации это запрещают, БСП автоматически переключается на синхронный режим.Самый простой и распространенный способ восстановить фоновую обработку отчета — скорректировать параметры регистрации в модуле объекта внешнего отчета. Посмотрим на пример реализации экспортной функции СведенияОВнешнейОбработке():
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Наименование = "Отчет по продажам (внешний)";
ПараметрыРегистрации.Версия = "1.0";
// Отключаем безопасный режим для возможности запуска фоновых потоков
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Открыть отчет";
Команда.Идентификатор = "ОткрытьОтчет";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
После изменения кода модуля отчет необходимо заново загрузить или обновить в справочнике Дополнительные отчеты и обработки. Установка параметра БезопасныйРежим в значение Ложь снимает ограничения на создание фоновых потоков из внешнего объекта.
Для правильного формирования отчета в фоне без отключения механизмов безопасности рекомендуется использовать типовую форму отчетов БСП (ОбщаяФорма.ФормаОтчета) и подсистему «Варианты отчетов». Разберем по шагам, как это реализовать:
ХранилищеВариантовОтчетов.
Процедура ОпределитьНастройкиФормы(Форма, ИтогНастроек) Экспорт
ИтогНастроек.ФормироватьПриОткрытии = Ложь;
ИтогНастроек.События.ПриКомпоновкеРезультата = Истина;
КонецПроцедуры
В функции регистрации дополнительного отчета обязательно укажем флаг использования настроек формы:
ПараметрыРегистрации.Вставить("ОпределитьНастройкиФормы", Истина);
В таком варианте формирование отчета будет полностью управляться БСП в стандартном неблокирующем окне с анимацией ожидания и возможностью отмены операции.
Если внешний отчет имеет собственную сложную форму и выполняет нестандартную компоновку данных (например, когда в событии ПриКомпоновкеРезультата параметр СтандартнаяОбработка установлен в Ложь), необходимо использовать программный выпуск фонового задания через модуль ДлительныеОперации.
Рассмотрим подробнее вызов длительной операции из формы внешнего отчета:
&НаКлиенте
Процедура СформироватьОтчетВФоне()
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("НастройкиКомпоновки", Отчет.КомпоновщикНастроек.ПолучитьНастройки());
ПараметрыВыполнения = ДлительныеОперацииКлиент.ПараметрыВыполненияФункции(ЭтотОбъект);
ПараметрыВыполнения.ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеФоновогоФормирования", ЭтотОбъект);
// Запуск фонового метода через ссылку на внешний отчет
ДлительнаяОперация = ДлительныеОперацииКлиент.ВыполнитьФункцию(
ПараметрыВыполнения,
"ДополнительныеОтчетыИОбработки.ВыполнитьФункцию",
ПараметрыПроцедуры
);
КонецПроцедуры
На стороне сервера внутри фонового потока БСП выполнит повторное подключение двоичных данных отчета через метод ВнешниеОтчеты.Подключить() с использованием ОписаниеЗащитыОтОпасныхДействий, что гарантирует стабильное исполнение кода даже на платформах версий 8.3.10 и выше.
Если политика безопасности информационной базы строго запрещает отключение безопасного режима для внешних обработок, а БСП не позволяет запустить длительную операцию, наиболее надежным архитектурным решением является перенос отчета во внедряемое расширение конфигурации (cfe).
Отчеты, находящиеся в расширениях:
ВнешниеОтчеты.Подключить() и передачи двоичных данных в поток.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый) напрямую из формы без каких-либо ограничений прав.