Фоновое формирование отчета СКД на УФ средствами БСП

16.05.17

Разработка - СКД

В узких кругах широко известна проблема, когда штатное фоновое формирование отчета СКД на управляемых формах перестает работать при выполнении нештатной компоновки (переопределении события ПриКомпоновкеРезультата). В этом случае клиент ожидает ответа сервера и сеанс 1С "висит", что жутко неудобно при формировании затратных по времени отчетов. Также нет возможности прервать такое выполнение. Когда мириться с этим стало тяжело, стал искать решения, но почему-то подходящего готового рецепта не нашел. Если плохо искал, значит, будет еще один в копилку.
С помощью штатных функций БСП по контролю выполнения длительных фоновых операций удалось получить на удивление лаконичное и достаточно универсальное решение. Опасался, что выйдет более "развесисто". Поэтому на радостях спешу поделиться.
(Важно! Как мне справедливо заметили в комментариях - при использовании подсистемы БСП "Варианты отчетов" проблемы не существует, т.к. общая форма отчетов этой подсистемы уже реализует аналогичную концепцию и "велосипедить" смысла нет. Публикация пригодится тем, кто использует выборочное внедрение подсистем БСП и подсистема "Варианты отчетов" у него, как и у меня, отсутствует. Ну или еще в каком экзотическом случае.)

Начну с недоработок (при желании - устранимых).

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

2) по аналогичной причине (лень) не реализована фоновая расшифровка - для этого необходимо перехватывать штатную расшифровку

Возможно, перечисленные недоработки будут устранены позднее.

Да, еще момент. Предполагается, что дорабатываемый отчет имеет стандартные наименования своих компонентов - поле табличного документа на форме называется "Результат", есть строковый реквизит формы "ДанныеРасшифровки", основной реквизит формы называется "Отчет".

Итак. Сам алгоритм, исполняемый в фоновом задании, размещается в модуле менеджера целевого отчета. Тут все просто и никакой магии:

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

Замечу, что выполняется штатная компоновка отчета со всем тем, что напихано в ПриКомпоновкеРезультата.

Осталось это выполнить в фоне, получить результат и красиво все показать пользователю.
Очевидно, что для этого нужно перехватить событие компоновки на клиенте. К сожалению, человеческого способа это сделать нет. Придется подсовывать свою команду вместо стандартной. Отключаем в доступных командах отчета штатное "Сформировать", выводим на форму кнопку со своей командой. Оформляем, чтобы выглядела аналогично.
Подсказка - если кнопка появляется в панели отчета после каких-то стандартных команд типа выбора варианта - просто добавьте эти стандартные команды в панель явно - тогда их расположением можно будет управлять.
Обработчик нашей команды "Сформировать":
&НаКлиенте
Процедура Сформировать(Команда)
	
	ФоновоеФормированияОтчета = ЗапускФормированияОтчетаСервер();
	Если ФоновоеФормированияОтчета <> Неопределено Тогда
		НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершениеФоновогоФормированияОтчетаКлиент", ЭтотОбъект);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеФормированияОтчета, ОбработчикЗавершения, НастройкиОжидания);
	КонецЕсли;	
	
КонецПроцедуры

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

Теперь собственно запуск фонового задания по протоколу БСП:
&НаСервере
Функция ЗапускФормированияОтчетаСервер()
	
	ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
	МетаданныеОтчета = ОтчетОбъект.Метаданные();
	ИмяОтчета = МетаданныеОтчета.Имя;
	
	Если НЕ Метаданные.Отчеты.Содержит(МетаданныеОтчета) Тогда // если отчет внешний, то выполняем компоновку стандартно
		СкомпоноватьРезультат();
		Возврат Неопределено;
	КонецЕсли;
	
	Если ПустаяСтрока(ДанныеРасшифровки) Тогда
		ДанныеРасшифровки = ПоместитьВоВременноеХранилище(Новый ДанныеРасшифровкиКомпоновкиДанных, УникальныйИдентификатор);
	КонецЕсли;
	
	ПараметрыФормирования = Новый Структура;
	ПараметрыФормирования.Вставить("ИмяОтчета", ИмяОтчета);
	ПараметрыФормирования.Вставить("АдресДанныхРасшифровки", ДанныеРасшифровки);
	ПараметрыФормирования.Вставить("НастройкиКомпоновщика", Отчет.КомпоновщикНастроек.ПолучитьНастройки());
	
	НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	
	Возврат ДлительныеОперации.ВыполнитьВФоне(СтрШаблон("Отчеты.%1.ВыполнитьКомпоновкуВФоне", ИмяОтчета), ПараметрыФормирования, НастройкиЗапуска);
	
КонецФункции

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

&НаКлиенте
Процедура ЗавершениеФоновогоФормированияОтчетаКлиент(РезультатФоновойЗадачи, ДополнительныеПараметры) Экспорт
	
	Если РезультатФоновойЗадачи <> Неопределено И РезультатФоновойЗадачи.Статус = "Выполнено" Тогда
		Результат = ПолучитьИзВременногоХранилища(РезультатФоновойЗадачи.АдресРезультата);
		Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
		Элементы.Результат.ОтображениеСостояния.Текст = "";
	КонецЕсли;
	
КонецПроцедуры

Это все. Как видим - благодаря БСП нужно добавить лишь небольшое количество достаточно универсального кода (тестировалось под БСП 2.3.2.45).

СКД УФ БСП фоновое отчет

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159730    876    399    

862

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8741    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

3 стартмани

05.02.2024    7015    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3159    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10843    23    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    8062    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vasilev2015 2723 17.05.17 13:50 Сейчас в теме
2. KliMich 17.05.17 19:47 Сейчас в теме
Респект!
Кратко и содержательно
3. Новенький_2209 18.05.17 14:59 Сейчас в теме
Краткость - сестра таланта! Спасибо!
4. unichkin 1579 19.05.17 01:46 Сейчас в теме
Плюс за пример работы с длительными операциями. Но вообще при разработке отчетов на БСП лучше избегать создания формы - тогда автоматически решается куча проблем, в т.ч. и фоновое формирование. И кстати - с формой все-равно можно будет работать, правда только программно.
starik-2005; +1 Ответить
5. herfis 513 19.05.17 09:20 Сейчас в теме
(4) Спасибо за замечание! В самом деле - если используется подсистема вариантов отчетов и отчет ее использует, то проблема уже решена в общей форме отчетов этой подсистемы. Там делается тоже самое - подменяется стандартная команда и выполняется компоновка в фоне. Так что при полном использовании БСП моя публикация является велосипедом. Я совсем упустил этот момент, т.к. активно дорабатываю самописку с выборочным внедрением БСП (без подсистемы "Вариантов отчетов"). Сейчас отражу это в публикации.
trumanl; starik-2005; +2 Ответить
6. trumanl 12 11.08.17 12:20 Сейчас в теме
(5) как выше замечено, респект в том числе за то, что дошел до этого собственным умом!
8. 7OH 70 25.12.19 16:51 Сейчас в теме
(4) БСП 3.0.1 - фоновое формирование происходит только если отчет внутренний.
если внешний или безопасный режим - тогда не фоновое построение.
формы отчета нет - только схема - чтобы использовать все плюшки типовой формы.
Подскажите - как у вас оно формирует внешние отчеты в фоне типовыми методами ?
9. herfis 513 26.12.19 10:09 Сейчас в теме
(8) Сабж тоже не для внешних отчетов. Внешние там тоже не в фоне.
10. 7OH 70 02.11.20 12:58 Сейчас в теме
(4) а не подскажете - как при использовании общей формы "попросить" БСП выполнить свою функцию после формирования ?
7. kotlovD 88 23.05.19 11:52 Сейчас в теме
Спасибо! Все внедрение заняло 5 минут, вместе с чтением статьи)
Оставьте свое сообщение