Длительные операции на сервере. Часть 3 Ход выполнения длительной операции

Печать (Ctrl+P)

Библиотека стандартных подсистем 3.0

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

 ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, ТекстСобщения); 

Процедура СообщитьПрогресс регистрирует информацию о ходе выполнения длительной операции на сервере и оповещает об этом на клиент.
Во избежание избыточного потребления памяти и ее утечек при выполнении одной длительной операции не следует сообщать прогресс более 100 раз.

Допустим,  что модуле менеджера объекта или в общем модуле имеется обработчик выполнения расчета или любой длительной операции ВыполнитьРасчет, выполняется вызов процедуры СообщитьПрогресс :

Процедура ВыполнитьРасчет(Параметры, АдресРезультата) Экспорт
 Результат = Новый ТаблицаЗнчений;
 Длительность = 10;
 …………………………………… //  пропускаем содержимое обработчика
 Индекс = Индекс+1;    
 Процент =  Цел(Индекс * 100 / Длительность);
 ТекстСобщения = " Этап № " + строка(Индекс) + " Из " + Строка(Длительность);  
 ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, ТекстСобщения);
 …………………………………… //   пропускаем  содержимое обработчика
   ПоместитьВоВременноеХранилище(Товары, АдресРезультата);
 КонецПроцедуры

Функция ПараметрыОжидания  возвращает пустую структуру для параметра ПараметрыОжидания процедуры ОжидатьЗавершение. Для того чтобы выводить ход выполнения длительной операции для пользователя, следует установить свойство ВыводитьПрогрессВыполнения в Истина. ПроцедураПроцедура , которая вызвается

Процедура  оповещения, которая  периодически вызывается на клиенте при вызове на сервере  СообщитьПрогрес  задается в параметре  ОповещениеОПрогрессеВыполнения

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

  &НаСервере 
 Функция НачатьРасчетНаСервере() 
     Уведомление = "";
       НачалоДлительнойОперации = ТекущаяДата(); 
     ПроцентВыполнения=0;
  ТекстСообщенияПользователю= СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"), ТекущаяДатаСеанса(), "Расчет начат..");
 ОбщегоНазначения.СообщитьПользователю(ТекстСообщенияПользователю);
  НаименованиеЗадания = НСтр("ru = 'Выполнение расчета БДР'");
  ВыполняемыйМетод = "Документы._РасчетСтоимости.ВыполнитьРасчет";
  ПараметрыПроцедуры = Новый Структура;
  ПараметрыПроцедуры.Вставить("Период", Период);
  ПараметрыПроцедуры.Вставить("Товары", Объект.Товары.Выгрузить());
  ПараметрыПроцедуры.Вставить("Документы", Объект.Документы.Выгрузить());
  ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
  ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
зврат ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод,      ПараметрыПроцедуры, ПараметрыВыполнения);
  КонецФункции  

Метод Состояние показывает прогресс выполнения длительных фоновых операций :

 &НаКлиент
 Процедура ВыполнитьДействиеПрогрессВыполнения(Прогресс, ДополнительныеПараметры) Экспорт
 ВремяВыполнения= Строка(ТекущаяДата()- НачалоДлительнойОперации) + " Сек";
 ТекстУведомления = НСтр("ru = 'Пожалуйста, подождите...'");
 Пояснение  =   НСтр("ru = 'Расчет стоимости продажи' ")  ;
 Если Прогресс.Прогресс <> Неопределено Тогда 
    Уведомление = Прогресс.Прогресс.Текст;
     ПроцентВыполнения = Прогресс.Прогресс.Процент;
  КонецЕсли;
 ТекстУведомления = ТекстУведомления+ Символы.ПС +  "Время выполнения "+ ВремяВыполнения + " "+ Уведомление; 
Если Прогресс.Сообщения <> Неопределено Тогда
     Для каждого СообщениеПользователю Из Прогресс.Сообщения Цикл
         СообщениеПользователю.Сообщить();
     КонецЦикла;
 КонецЕсли;
 Состояние(ТекстУведомления, ПроцентВыполнения, Пояснение, БиблиотекаКартинок.ДлительнаяОперация48);
 КонецПроцедуры  

После завершения длительной операции вызывается экспортная процедура на клиенте, указанной в параметре процедуре ОжидатьЗавершение.

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

См. также

Previous Article
Next Article

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.