Длительные операции на сервере. Часть 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 для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.