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