Длительные операции на сервере. Часть 2

Печать (Ctrl+P)

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

В этой второй части я показываю практический пример длительной обработки данных в фоновом режиме из моих прикладных решений на базе  Библиотеки стандартных подсистем.

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

 #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

 Процедура ВыполнитьДействие(Параметры, АдресРезультата) Экспорт
  ДатаНач = НачалоНедели(Параметры.ДатаНачала); 
  ДатаКон = КонецНедели(Параметры.ДатаОкончания);
 ПропуститьПроверку = Параметры.ПропуститьПроверку;
 ТабДок= Новый ТабличныйДокумент; 
 Если Не ПропуститьПроверку Тогда 
 ТабличныйДокумент = БюджетированиеСервер.ПолучитьТабличныйДокументПоверкиРасчетаБДР(ДатаНач,ДатаКон);
 КонецЕсли;
_БюджетированиеСервер.РасчетДанныхБюджета(ДатаНач,ДатаКон );
 ПоместитьВоВременноеХранилище(ТабличныйДокумент, АдресРезультата);
 КонецПроцедуры

 #КонецЕсли

Форма обработи имеет следующий вид:

После ответа Да на вопрос стартует длительную операцию обработки данных в фоновом режиме. в соответствий со следующим програмным кодом:

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

// 2. Запуск фонового задания на сервере.  
ДлительнаяОперация = НачатьРасчетБДРНаСервере();

 //2. Подключение обработчика завершения фонового задания. 
 ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
 ПараметрыОжидания.ВыводитьОкноОжидания =Ложь;
 ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьДействиеЗавершение", ЭтотОбъект);
 ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
 КонецПроцедуры

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

 // 3. Обработка результата выполнения фонового задания.

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

Отметим, что в модуле ОбщегоНазначенияКлиентСервер имеется следующая процедура :

 ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(ПолеТабличногоДокумента, Состояние );

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

//1. Отображение состояние
 ОтображениеСостояния = Элементы.ТабличныйДокумент.ОтображениеСостояния; ОтображениеСостояния.Видимость = Истина;
 ОтображениеСостояния.Картинка = БиблиотекаКартинок.ДлительнаяОперация48;
 ОтображениеСостояния.Текст = НСтр("ru = 'Выполняется расчет БДР  в фоновом режиме. Ждите....'");

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

Ожидать завершения выполнения процедуры (ОжидатьЗавершение)

 
 ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания); 

Ожидать завершения выполнения процедуры в фоновом задании и открыть форму ожидания длительной операции.
Применяется совместно с функцией длительныеОперации.ВыполнитьВФоне для повышения отзывчивости пользовательского интерфейса, заменяя длительный серверный вызов на запуск фонового задания.

Параметры:
ДлительнаяОперация – Структура – см. возвращаемое значение функции ДлительныеОперации.ВыполнитьВФоне.
ОповещениеОЗавершении – ОписаниеОповещения – оповещение, которое вызывается при завершении фонового задания.

Фрагмент кода из примера :

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

Оповещение, которое вызывается при завершении фонового задания


Параметры процедуры-обработчика оповещения:
Результат – Структура, Неопределено – структура со свойствами или Неопределено, если задание было отменено.

Свойства:
Статус – Строка – “Выполнено”, если задание было успешно выполнено; “Ошибка”, если задание завершено с ошибкой.
АдресРезультата – Строка – адрес временного хранилища, в которое будет помещен (или уже помещен) результат работы процедуры.
АдресДополнительногоРезультата – Строка – если установлен параметр ДополнительныйРезультат, содержит адрес дополнительного временного хранилища, в которое будет помещен (или уже помещен) результат работы процедуры.
КраткоеПредставлениеОшибки – Строка – краткая информация об исключении, если Статус = “Ошибка”.
ПодробноеПредставлениеОшибки – Строка – подробная информация об исключении, если Статус = “Ошибка”.
Сообщения – ФиксированныйМассив, Неопределено – массив объектов СообщениеПользователю, сформированных в процедуре-обработчике длительной операции.
ДополнительныеПараметры – Произвольный – произвольные данные, переданные в описании оповещения.
ПараметрыОжидания – Структура – см. ДлительныеОперацииКлиент.ПараметрыОжидания.

Фрагмент из примера :

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

функция ПараметрыОжидания

ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);

Возвращает пустую структуру для параметра ПараметрыОжидания процедуры

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

 ОповещениеПользователя = Новый Структура;
 ОповещениеПользователя.Вставить("Показать", Ложь);
 ОповещениеПользователя.Вставить("Текст", Неопределено); 
ОповещениеПользователя.Вставить("НавигационнаяСсылка", Неопределено);
 ОповещениеПользователя.Вставить("Пояснение", Неопределено);

 Результат.Вставить("ОповещениеПользователя", ОповещениеПользователя);
 Возврат Результат;
 КонецФункции
 

Описание структуры, которую возвращает функция ПарметрыОжидания :
ФормаВладелец – УправляемаяФорма, Неопределено – форма, из которой вызывается длительная операция.
ТекстСообщения – Строка – текст сообщения, выводимый на форме ожидания. Если не задан, то выводится “Пожалуйста, подождите…”.
ВыводитьОкноОжидания – Булево – если Истина, то открыть окно ожидания с визуальной индикацией длительной операции. Если используется собственный механизм индикации, то следует указать Ложь.
ВыводитьПрогрессВыполнения – Булево – выводить прогресс выполнения в процентах на форме ожидания.
ОповещениеОПрогрессеВыполнения – ОписаниеОповещения – оповещение, которое периодически вызывается при проверке готовности фонового задания. Параметры процедуры-обработчика оповещения:
Прогресс – Структура, Неопределено – структура со свойствами или Неопределено, если задание было отменено. Свойства:
Статус – Строка – “Выполняется”, если задание еще не завершилось; “Выполнено”, если задание было успешно выполнено;
“Ошибка”, если задание завершено с ошибкой; “Отменено”, если задание отменено пользователем или администратором.
ИдентификаторЗадания – УникальныйИдентификатор – идентификатор запущенного фонового задания.
Прогресс – Структура, Неопределено – результат функции ДлительныеОперации.ПрочитатьПрогресс, если ВыводитьПрогрессВыполнения = Истина.
Сообщения – ФиксированныйМассив, Неопределено – если ВыводитьСообщения = Истина, массив объектов СообщениеПользователю, очередная порция сообщений, сформированных в процедуре-обработчике длительной операции.
ДополнительныеПараметры – Произвольный – произвольные данные, переданные в описании оповещения.
ВыводитьСообщения – Булево – выводить в оповещения о завершении и прогресс сообщения, сформированные в процедуре-обработчике длительной операции.
Интервал – Число – интервал в секундах между проверками готовности длительной операции. По умолчанию 0 – после каждой проверки интервал увеличивается с 1 до 15 секунд с коэффициентом 1.4.
ОповещениеПользователя – Структура – содержит свойства:
Показать – Булево – если Истина, то по завершении длительной операции вывести оповещение пользователя.
Текст – Строка – текст оповещения пользователя.
НавигационнаяСсылка – Строка – навигационная ссылка оповещения пользователя.
Пояснение – Строка – пояснение оповещения пользователя.
ПолучатьРезультат – Булево – Служебный параметр. Не предназначен для использования.

См. также

Previous Article
Next Article

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

Ваш адрес email не будет опубликован.

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