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

Публикация № 1104751

Разработка - Практика программирования

Фоновый Отчет БСП

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 
 Модуль объекта
 
 Модуль формы

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

Скачать файлы

Наименование Файл Версия Размер
Формирование внешнего отчета в фоне:

.erf 17,15Kb
9
.erf 1.0.1 17,15Kb 9 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ids79 6329 08.08.19 08:55 Сейчас в теме
А как быть с данными расшифровки. Вы уверены, что они будут корректно заполнены при фоновом формировании с использованием своей формы?
4. partizand 80 08.08.19 11:26 Сейчас в теме
(1) Если вы про механизмы СКД, то не уверен. Пока не понимаю СКД досконально.
Процедуры формирования брал с упомянутой мной статьи Пример формирования внешнего отчета программно и в фоновом режиме. Насколько я понимаю механизм работы идентичный.
Беглым ознакомлением нашёл эту статью: https://infostart.ru/public/542223/
По итогу, необходимо будет добавить событие обработки расшифровки. Данные расшифровки возвращаются из фоновой процедуры.
Попробую допилить реализацию. Спасибо за замечание.
10. ids79 6329 08.08.19 22:07 Сейчас в теме
(4)Вообще, данные расшифровки, это реквизит формы отчета, который связан с одноименным параметром формы. Во время стандартной компоновки в него передается адрес на временное хранилище с данными расшифровки. В этом случае, обработка расшифровки работает автоматически. В вашем случае, очень может быть, что придется обрабатывать событие расшифровки табличного поля самостоятельно.
11. partizand 80 09.08.19 11:30 Сейчас в теме
(10) Исправил по вашим замечаниям. Так работает лучше.
Самостоятельно обрабатывать не надо, просто по окончании программного формирования помещаем ДанныеРасшифровки в хранилище.

Спасибо. После экспериментов, удаляя лишние реквизиты, удалил и ДанныеРасшифровки, не понимая зачем они :)
12. ids79 6329 09.08.19 13:21 Сейчас в теме
2. dsdred 1570 08.08.19 09:15 Сейчас в теме
Бегло посмотрел, такое ощущение что чего то не хватает...

П.С. Проще с БСП с ФормыОтчета выдрать один раз и сохранить шаблон.
3. partizand 80 08.08.19 10:49 Сейчас в теме
(2) Может чего-то и не хватает, могу ошибаться

На мой взгляд брать код из формы БСП некорректно. Форма БСП использует внутренний интерфейс БСП, который меняется без предупреждения (он не для вас по сути). Ну и понимание никто не отменял.
5. dsdred 1570 08.08.19 12:12 Сейчас в теме
(3)Я имею ввиду выдрать ту часть что завязана на Длительных операциях (ФЗ)
У меня выдран и я часто просто копи паст делаю.

Сначала делаю код, тестирую, а потом добавляю часть из готового шаблона которая его в ФЗ запускает.
Если в базе БСП нет тогда пишу запуск фонового задания не через длительные операции.
8. partizand 80 08.08.19 13:49 Сейчас в теме
(5) Да, можно и так, согласен
Если у меня есть время, почему бы и не поковыряться :)
По моему опыту копипаст обычно все-равно заканчивается разбором и пониманием, т.к. часто перестаёт работать.
Длительные операции БСП в принципе не сложны для реализации, всего 3 функции. Пример в описании самой процедуры ДлительныеОперации.ВыполнитьВФоне
6. buganov 157 08.08.19 12:26 Сейчас в теме
А чем на кнопке Сформитровать не понравилось "ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);" ?
7. buganov 157 08.08.19 12:29 Сейчас в теме
Если честно, я не совсем понял статью.
1. Не создать форму внешнего отчета, будет открыта форма отчета конфигурации или платформенная, которая формирует отчет в фоне.
2. Для чего здесь нужна БСП, если все формируется одной строкой?
9. partizand 80 08.08.19 14:11 Сейчас в теме
(7)
1. Форма отчета БСП не всегда формирует в фоне. Причины я нашёл в коде БСПшной формы и описал в статье, т.к. этот момент нигде не освещён (или я не нашёл). Вдруг кому пригодится.
Платформенная форма, насколько я понимаю, в фоне отчет не формирует. Или ошибаюсь?
2. Например, расшифровка не работает. И не известны условия формирования в фоне (для меня).

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

Было бы интересно сформулировать 3 вариант фонового формирования отчёта в вашем примере (одной строкой), я бы добавил в статью. Если вы имеете в виду создание своей формы и формирование по СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый), то будем считать это реализованным в варианте 2 :)
13. 7OH 32 15.11.19 12:41 Сейчас в теме
Искал причину формирования отчетов, которые не в составе конфигурации, не в фоне.
Оказалось банально - в общей форме отчета

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


убрать лишнюю проверку (расширением, своей формой, непосредственно - на своё усмотрение).
14. user621646_elena-2509 24.12.19 20:44 Сейчас в теме
partizand, Скопировала приведенный Вами код в новый внешний отчет, но почему-то зависает на формировании и ничего не выводит.
Оставьте свое сообщение

См. также

Форма отчета СКД

Работа с интерфейсом v8::СКД 1cv8.cf Бесплатно (free)

Описание объекта ОбщиеФормы – ФормаОтчета.

01.08.2019    13897    vasilev2015    5