Длительные операции на сервере. Часть 2
Библиотека стандартных подсистем 3.0
В этой второй части я показываю практический пример длительной обработки данных в фоновом режиме из моих прикладных решений на базе Библиотеки стандартных подсистем.
Программный код длительной обработки данных при использовании БСП должен находится в модуле менеджера объекта или в общих модулях . В этом примере, я расположил процедуру ВыполнитьДействие
в модуле менеджера обработки _РасчетБДР :
#
Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение ТогдаПроцедура ВыполнитьДействие(Параметры, АдресРезультата) Экспорт
ДатаНач = НачалоНедели(Параметры.ДатаНачала);
ДатаКон = КонецНедели(Параметры.ДатаОкончания);
ПропуститьПроверку = Параметры.ПропуститьПроверку;
ТабДок= Новый ТабличныйДокумент;
Если Не ПропуститьПроверку Тогда
ТабличныйДокумент = БюджетированиеСервер.ПолучитьТабличныйДокументПоверкиРасчетаБДР(ДатаНач,ДатаКон);
КонецЕсли;
_БюджетированиеСервер.РасчетДанныхБюджета(ДатаНач,ДатаКон );
ПоместитьВоВременноеХранилище(ТабличныйДокумент, АдресРезультата);
КонецПроцедуры
#
КонецЕсли
Форма обработи имеет следующий вид:
После ответа Да на вопрос стартует длительную операцию обработки данных в фоновом режиме. в соответствий со следующим програмным кодом:
&НаКлиенте Процедура ПослеЗакрытияВопроса(Результат, Параметры) ЭкспортЕсли Результат = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
ОчиститьСообщения();
//1. Отображение состояниеОтображениеСостояния = Элементы.ТабличныйДокумент.ОтображениеСостояния;
ОтображениеСостояния.Видимость = Истина;
ОтображениеСостояния.Картинка = БиблиотекаКартинок.ДлительнаяОперация48;
ОтображениеСостояния.Текст = НСтр("ru = 'Выполняется расчет БДР в фоновом режиме. Ждите....'");
// 2. Запуск фонового задания на сервере.ДлительнаяОперация = НачатьРасчетБДРНаСервере();
//2. Подключение обработчика завершения фонового задания.ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания =Ложь;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьДействиеЗавершение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры &НаСервере Функция НачатьРасчетБДРНаСервере() ТекстСообщенияПользователю= СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"), ТекущаяДатаСеанса(), "Расчет начат.."); ОбщегоНазначения.СообщитьПользователю(ТекстСообщенияПользователю);НаименованиеЗадания = НСтр("ru = 'Выполнение расчета БДР'");
ВыполняемыйМетод = "Обработки._РасчетБДР.ВыполнитьДействие";
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДатаНачала", Период.ДатаНачала);
ПараметрыПроцедуры.Вставить("ДатаОкончания", Период.ДатаОкончания);
ПараметрыПроцедуры.Вставить("ПропуститьПроверку", ПропуститьПроверку);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
Возврат ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод,ПараметрыПроцедуры, ПараметрыВыполнения);
КонецФункции // 3. Обработка результата выполнения фонового задания. &НаКлиенте Процедура ВыполнитьДействиеЗавершение(Результат, ДополнительныеПараметры) ЭкспортОтображениеСостояния = Элементы.ТабличныйДокумент.ОтображениеСостояния;
ОтображениеСостояния.Видимость = Ложь;
Если Результат = Неопределено Тогда // отменено пользователем
Возврат;
КонецЕсли;
ВывестиРезультат(Результат);
Если Результат.Статус = "Ошибка" Тогда
ПоказатьПредупреждение(,Результат.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры &НаСервере Процедура ВывестиРезультат(Результат)ТекстСообщения = "Задание Выполнено";
Если Результат.Статус = "Выполнено" Тогда
ТабличныйДокумент = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
ИначеЕсли Результат.Статус = "Ошибка" Тогда
ТекстСообщения = Результат.ПодробноеПредставлениеОшибки;
КонецЕсли;
Если Результат.Сообщения <> Неопределено Тогда
Для каждого СообщениеПользователю Из Результат.Сообщения
Цикл
СообщениеПользователю.Сообщить();
КонецЦикла;
КонецЕсли;
ТекстСообщенияПользователю= СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"), ТекущаяДатаСеанса(), ТекстСообщения);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщенияПользователю);
КонецПроцедуры
Отметим, что в модуле ОбщегоНазначенияКлиентСервер имеется следующая процедура :
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(ПолеТабличногоДокумента, Состояние );
Процедура управляет состоянием поля табличного документа. Одноко, в этой процедуре отсутствует возможность передачи текст состояния и поэтому в теле процедуры ПослеЗакрытияВопроса я использовал следующий фрагмент кода:
//1. Отображение состояниеОтображениеСостояния = Элементы.ТабличныйДокумент.ОтображениеСостояния; ОтображениеСостояния.Видимость = Истина;
ОтображениеСостояния.Картинка = БиблиотекаКартинок.ДлительнаяОперация48;
ОтображениеСостояния.Текст = НСтр("ru = 'Выполняется расчет БДР в фоновом режиме. Ждите....'");
Посмотрим также некоторые функции и процедуры общих модулей ДлительныеОперации, ДлительныеОперацииКлиент в моем распоряжении при использовании БСП.
Ожидать завершения выполнения процедуры (ОжидатьЗавершение)
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания);
Ожидать завершения выполнения процедуры в фоновом задании и открыть форму ожидания длительной операции.
Применяется совместно с функцией длительныеОперации.ВыполнитьВФоне для повышения отзывчивости пользовательского интерфейса, заменяя длительный серверный вызов на запуск фонового задания.
Параметры:
ДлительнаяОперация – Структура – см. возвращаемое значение функции ДлительныеОперации.ВыполнитьВФоне.
ОповещениеОЗавершении – ОписаниеОповещения – оповещение, которое вызывается при завершении фонового задания.
Фрагмент кода из примера :
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания =Ложь;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьДействиеЗавершение", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
Оповещение, которое вызывается при завершении фонового задания
Параметры процедуры-обработчика оповещения:
Результат – Структура, Неопределено – структура со свойствами или Неопределено, если задание было отменено.
Свойства:
Статус – Строка – “Выполнено”, если задание было успешно выполнено; “Ошибка”, если задание завершено с ошибкой.
АдресРезультата – Строка – адрес временного хранилища, в которое будет помещен (или уже помещен) результат работы процедуры.
АдресДополнительногоРезультата – Строка – если установлен параметр ДополнительныйРезультат, содержит адрес дополнительного временного хранилища, в которое будет помещен (или уже помещен) результат работы процедуры.
КраткоеПредставлениеОшибки – Строка – краткая информация об исключении, если Статус = “Ошибка”.
ПодробноеПредставлениеОшибки – Строка – подробная информация об исключении, если Статус = “Ошибка”.
Сообщения – ФиксированныйМассив, Неопределено – массив объектов СообщениеПользователю, сформированных в процедуре-обработчике длительной операции.
ДополнительныеПараметры – Произвольный – произвольные данные, переданные в описании оповещения.
ПараметрыОжидания – Структура – см. ДлительныеОперацииКлиент.ПараметрыОжидания.
Фрагмент из примера :
&НаКлиенте Процедура ВыполнитьДействиеЗавершение(Результат, ДополнительныеПараметры) ЭкспортОтображениеСостояния = Элементы.ТабличныйДокумент.ОтображениеСостояния;
ОтображениеСостояния.Видимость = Ложь;
Если Результат = Неопределено Тогда // отменено пользователем
Возврат;
КонецЕсли;
ВывестиРезультат(Результат);
Если Результат.Статус = "Ошибка" Тогда
ПоказатьПредупреждение(,Результат.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
функция ПараметрыОжидания
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
Возвращает пустую структуру для параметра ПараметрыОжидания процедуры
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
Функция ПараметрыОжидания(ФормаВладелец) ЭкспортРезультат = Новый Структура;
Результат.Вставить("ФормаВладелец", ФормаВладелец);
Результат.Вставить("ТекстСообщения", "");
Результат.Вставить("ВыводитьОкноОжидания", Истина);
Результат.Вставить("ВыводитьПрогрессВыполнения", Ложь);
Результат.Вставить("ОповещениеОПрогрессеВыполнения", Неопределено);
Результат.Вставить("ВыводитьСообщения", Ложь);
Результат.Вставить("Интервал", 0);
Результат.Вставить("ПолучатьРезультат", Ложь);
ОповещениеПользователя = Новый Структура;
ОповещениеПользователя.Вставить("Показать", Ложь);
ОповещениеПользователя.Вставить("Текст", Неопределено);
ОповещениеПользователя.Вставить("НавигационнаяСсылка", Неопределено);
ОповещениеПользователя.Вставить("Пояснение", Неопределено);
Результат.Вставить("ОповещениеПользователя", ОповещениеПользователя);
Возврат Результат;
КонецФункции
Описание структуры, которую возвращает функция ПарметрыОжидания :
ФормаВладелец – УправляемаяФорма, Неопределено – форма, из которой вызывается длительная операция.
ТекстСообщения – Строка – текст сообщения, выводимый на форме ожидания. Если не задан, то выводится “Пожалуйста, подождите…”.
ВыводитьОкноОжидания – Булево – если Истина, то открыть окно ожидания с визуальной индикацией длительной операции. Если используется собственный механизм индикации, то следует указать Ложь.
ВыводитьПрогрессВыполнения – Булево – выводить прогресс выполнения в процентах на форме ожидания.
ОповещениеОПрогрессеВыполнения – ОписаниеОповещения – оповещение, которое периодически вызывается при проверке готовности фонового задания. Параметры процедуры-обработчика оповещения:
Прогресс – Структура, Неопределено – структура со свойствами или Неопределено, если задание было отменено. Свойства:
Статус – Строка – “Выполняется”, если задание еще не завершилось; “Выполнено”, если задание было успешно выполнено;
“Ошибка”, если задание завершено с ошибкой; “Отменено”, если задание отменено пользователем или администратором.
ИдентификаторЗадания – УникальныйИдентификатор – идентификатор запущенного фонового задания.
Прогресс – Структура, Неопределено – результат функции ДлительныеОперации.ПрочитатьПрогресс, если ВыводитьПрогрессВыполнения = Истина.
Сообщения – ФиксированныйМассив, Неопределено – если ВыводитьСообщения = Истина, массив объектов СообщениеПользователю, очередная порция сообщений, сформированных в процедуре-обработчике длительной операции.
ДополнительныеПараметры – Произвольный – произвольные данные, переданные в описании оповещения.
ВыводитьСообщения – Булево – выводить в оповещения о завершении и прогресс сообщения, сформированные в процедуре-обработчике длительной операции.
Интервал – Число – интервал в секундах между проверками готовности длительной операции. По умолчанию 0 – после каждой проверки интервал увеличивается с 1 до 15 секунд с коэффициентом 1.4.
ОповещениеПользователя – Структура – содержит свойства:
Показать – Булево – если Истина, то по завершении длительной операции вывести оповещение пользователя.
Текст – Строка – текст оповещения пользователя.
НавигационнаяСсылка – Строка – навигационная ссылка оповещения пользователя.
Пояснение – Строка – пояснение оповещения пользователя.
ПолучатьРезультат – Булево – Служебный параметр. Не предназначен для использования.
См. также