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