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

16.05.17

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    254132    1401    421    

1153

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6238    327    shapa_pro    25    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    18395    ovetgana    112    

110

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    10700    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10231    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16360    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14004    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10761    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vasilev2015 2845 17.05.17 13:50 Сейчас в теме
2. KliMich 17.05.17 19:47 Сейчас в теме
Респект!
Кратко и содержательно
3. Новенький_2209 18.05.17 14:59 Сейчас в теме
Краткость - сестра таланта! Спасибо!
4. unichkin 1622 19.05.17 01:46 Сейчас в теме
Плюс за пример работы с длительными операциями. Но вообще при разработке отчетов на БСП лучше избегать создания формы - тогда автоматически решается куча проблем, в т.ч. и фоновое формирование. И кстати - с формой все-равно можно будет работать, правда только программно.
starik-2005; +1 Ответить
5. herfis 522 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 522 26.12.19 10:09 Сейчас в теме
(8) Сабж тоже не для внешних отчетов. Внешние там тоже не в фоне.
10. 7OH 70 02.11.20 12:58 Сейчас в теме
(4) а не подскажете - как при использовании общей формы "попросить" БСП выполнить свою функцию после формирования ?
7. kotlovD 89 23.05.19 11:52 Сейчас в теме
Спасибо! Все внедрение заняло 5 минут, вместе с чтением статьи)
Для отправки сообщения требуется регистрация/авторизация