Формирование внешнего отчета в фоне

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

При доработке типового отчета БП, возник вопрос, как сделать формирование внешнего отчета в фоне. Результатами исследования захотелось поделится. Использовалась БСП версии 3.0.1.

Сразу стоит отметить, что отчет просто открытый через Файл — Открыть запустить в фоне нельзя (если только он до этого не был добавлен в справочник ДополнительныеОтчетыИОбработки)

Для дополнительного отчета (добавленного в справочник ДополнительныеОтчетыИОбработки) есть два варианта реализации:

1. Использование типовой формы отчета из БСП.

Для этого не указываем (и не создаем) основную форму отчета. Условием формирования в фоновым режиме для формы отчета БСП является его отключенный "Безопасный режим". Т.е. в функции СведенияОВнешнейОбработке указываем 

ПараметрыРегистрации.БезопасныйРежим = Ложь; // !!! Что бы выполнялось в фоне на сервере через БСП форму отчета

Есть прекрасная статья по этому варианту Подсистема "Варианты отчетов". Используете ли Вы ее правильно? Там "Безопасный режим" в примере сброшен, написано про фоновое формирование, но не описана взаимосвязь.

2. Использование своей формы отчета

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

Есть статья Пример формирования внешнего отчета программно и в фоновом режиме, реализующая этот вариант. Но в ней есть ряд недоработок. Используется устаревшая процедура ДлительныеОперации.ЗапуститьВыполнениеВФоне.

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

Привожу свою реализацию формирования отчета со своей формой в фоновом режиме. Первый вариант (с формой БСП) легко реализуем и так. Достаточно отключить основную форму от отчета.

В ней я так же уделил внимание работе со своевременным освобождением памяти хранилища. Иначе, если пользователь, не закрывая форму отчета, много раз нажмет сформировать, памяти может не хватить.

Все действия и поведение системы подробно описаны в комментариях. Понять в контексте кода проще, чем абстрактные описания.

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

 

 Модуль объекта

 

 Модуль формы

Update: исправил работу с данными расшифровки по замечанию в комментарии (добавлена пара строчек в модуль формы и реквизит формы ДанныеРасшифровки). 

13 Comments

  1. ids79

    А как быть с данными расшифровки. Вы уверены, что они будут корректно заполнены при фоновом формировании с использованием своей формы?

    Reply ↓
  2. dsdred

    Бегло посмотрел, такое ощущение что чего то не хватает…

    П.С. Проще с БСП с ФормыОтчета выдрать один раз и сохранить шаблон.

    Reply ↓
  3. partizand

    (2) Может чего-то и не хватает, могу ошибаться

    На мой взгляд брать код из формы БСП некорректно. Форма БСП использует внутренний интерфейс БСП, который меняется без предупреждения (он не для вас по сути). Ну и понимание никто не отменял.

    Reply ↓
  4. partizand

    (1) Если вы про механизмы СКД, то не уверен. Пока не понимаю СКД досконально.

    Процедуры формирования брал с упомянутой мной статьи Пример формирования внешнего отчета программно и в фоновом режиме. Насколько я понимаю механизм работы идентичный.

    Беглым ознакомлением нашёл эту статью: https://infostart.ru/public/542223/

    По итогу, необходимо будет добавить событие обработки расшифровки. Данные расшифровки возвращаются из фоновой процедуры.

    Попробую допилить реализацию. Спасибо за замечание.

    Reply ↓
  5. dsdred

    (3)Я имею ввиду выдрать ту часть что завязана на Длительных операциях (ФЗ)

    У меня выдран и я часто просто копи паст делаю.

    Сначала делаю код, тестирую, а потом добавляю часть из готового шаблона которая его в ФЗ запускает.

    Если в базе БСП нет тогда пишу запуск фонового задания не через длительные операции.

    Reply ↓
  6. buganov

    А чем на кнопке Сформитровать не понравилось «ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);» ?

    Reply ↓
  7. buganov

    Если честно, я не совсем понял статью.

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

    2. Для чего здесь нужна БСП, если все формируется одной строкой?

    Reply ↓
  8. partizand

    (5) Да, можно и так, согласен

    Если у меня есть время, почему бы и не поковыряться 🙂

    По моему опыту копипаст обычно все-равно заканчивается разбором и пониманием, т.к. часто перестаёт работать.

    Длительные операции БСП в принципе не сложны для реализации, всего 3 функции. Пример в описании самой процедуры ДлительныеОперации.ВыполнитьВФоне

    Reply ↓
  9. partizand

    (7)

    1. Форма отчета БСП не всегда формирует в фоне. Причины я нашёл в коде БСПшной формы и описал в статье, т.к. этот момент нигде не освещён (или я не нашёл). Вдруг кому пригодится.

    Платформенная форма, насколько я понимаю, в фоне отчет не формирует. Или ошибаюсь?

    2. Например, расшифровка не работает. И не известны условия формирования в фоне (для меня).

    БСП не обязательно, конечно. Отчёт писался для реальной базы БП, где присутствует БСП и используется БСПшная форма отёта (см. п.1). Вариант 2 в статье родился из дальнейшего интереса к теме, что бы закрыть вопрос фонового формирования отчётов. И заодно так же будут работать фоновые обработки.

    Было бы интересно сформулировать 3 вариант фонового формирования отчёта в вашем примере (одной строкой), я бы добавил в статью. Если вы имеете в виду создание своей формы и формирование по СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый), то будем считать это реализованным в варианте 2 🙂

    Reply ↓
  10. ids79

    (4)Вообще, данные расшифровки, это реквизит формы отчета, который связан с одноименным параметром формы. Во время стандартной компоновки в него передается адрес на временное хранилище с данными расшифровки. В этом случае, обработка расшифровки работает автоматически. В вашем случае, очень может быть, что придется обрабатывать событие расшифровки табличного поля самостоятельно.

    Reply ↓
  11. partizand

    (10) Исправил по вашим замечаниям. Так работает лучше.

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

    Спасибо. После экспериментов, удаляя лишние реквизиты, удалил и ДанныеРасшифровки, не понимая зачем они 🙂

    Reply ↓
  12. ids79

    (11)Пожалуйста.

    Reply ↓
  13. 7OH

    Искал причину формирования отчетов, которые не в составе конфигурации, не в фоне.

    Оказалось банально — в общей форме отчета

    ФоновоеЗаданиеЗапустить(ФормированиеПриОткрытии, НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный);

    убрать лишнюю проверку (расширением, своей формой, непосредственно — на своё усмотрение).

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *