Форма отчета. Часть 2 Длительные операции на сервере
Библиотека стандартных подсистем 3.0
Первую часть об общей форме отчета из библиотеки стандартных подсистем можно посмотреть здесь
В второй части я показываю общий подход формирования отчета с использованием механизма длительной обработки данных на сервере. Подробнее о сущности выполнения длительной операции обработки я написал здесь. Согласно общей рекомендации, все длительные серверные вызовы, которые могут выполняться более 8 секунд в обычных сценариях работы пользователя, следует выполнять асинхронно, с помощью фонового задания. В противном случае такие вызовы могут привести к потере работоспособности.
Програмнный код длительной операции формирования отчета выполняется в общих модулях. Его можно посмотреть и изучать в модуле формы ( действие кнопки Сформировать) :
&НаКлиенте
Процедура ОтчетСкомпоноватьРезультат(Команда)
ОчиститьСообщения();
Сформировать();
КонецПроцедурыФорма отчета не блокируется на время его формирования. Пользователь может изменить настройки и переформировать отчет, не дожидаясь окончания его формирования. При закрытии формы отчета, формирование отчета прерывается.
На время выполнения длительной операции формирования отчета пользователю отображается индикатор в поле табличного документа, используя свойство поля табличного документа ОтображениеСостояния:
&НаСервере Процедура ОтобразитьСостояниеОтчета() ОтображениеСостояния = Элементы.ОтчетТабличныйДокумент.ОтображениеСостояния; ОтображениеСостояния.Текст = "Отчет формируется… "; ОтображениеСостояния.Картинка = БиблиотекаКартинок.ДлительнаяОперация48; КонецПроцедуры

Общая форма отчета БСП с асинхронным формированием отчета разработана для использования СКД без использолвания обработчика модуля отчета ПриКомпоновкеРезультата .
Изветсная стандартная форма отчета платформы 1С: Предприятие 8.3 с переопределенной процедурой формирования отчета выглядит так :

При начатии кнопки «Сформировать» вызывается обработчик модуля отчета ПриКомпоновкеРезультата. Вот, пример програмного кода обработчика из демо версии БСП , который не использует механизм длительных операций на сервере
// Пример обработчика ПриКомпоновкеРезультата в модуле отчета Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)СтандартнаяОбработка = Ложь;ДокументРезультат.Очистить();Настройки = КомпоновщикНастроек.ПолучитьНастройки();ВнешниеНаборыДанных = Новый Структура;ВнешниеНаборыДанных.Вставить("НаборДанных", ДатыЗапретаПодготовленные(Настройки.ПараметрыДанных));КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;ПроцессорВывода.УстановитьДокумент(ДокументРезультат);ПроцессорВывода.НачатьВывод();ЭлементРезультата = ПроцессорКомпоновки.Следующий();Пока ЭлементРезультата <> Неопределено ЦиклПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);ЭлементРезультата = ПроцессорКомпоновки.Следующий();КонецЦикла;ПроцессорВывода.ЗакончитьВывод();КонецПроцедуры
См. также