gifts2017

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

Опубликовал Антон Балабанов (balanton) в раздел Программирование - Практика программирования

В статье описан способ исполнения длительных операций в конфигурациях, в которых используется библиотека стандартных подсистем, с визуализацией прогресса исполнения и отображения хода обработки данных. Также дается краткое описание процесса отладки длительных операций в текущем сеансе.

Введение

Статья предназначена для программистов и администраторов, работающих с большими объемами данных. При этом в самой обработке есть понимание объема обрабатываемых данных и, как следствие, возможно отображение прогресса и хода обработки.

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

Использовалась БСП версии 2.3. На более ранних версиях это не работает, там нет такого программного интерфейса.

Прогресс выполнения

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

Процедура, являющаяся обработчиком команды, отображаемой на форме.

В ней производится передача исполнения на сервер в процедуру, инициирующую запуск длительной операции. После чего начинается ожидание завершения длительной операции.

Теперь в своей форме не надо описывать обработчики ожидания и запоминать идентификаторы заданий. Достаточно передать описание оповещения, которое вызовется при окончании фонового задания.

Если задание не завершится в течение 2 секунд, то вызовется форма ожидания, на которой будет отображаться прогресс выполнения операции и описание текущего действия.

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

Серверная процедура, инициирующая запуск длительной операции

В данной процедуре формируются параметры запуска, и инициируется запуск длительной операции методом ВыполнитьВФоне.

&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере()
	
	СтруктураПараметров = Новый Структура;
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Наименование фонового задания'");
	
	ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне(
		"ИмяМодуля.ИмяЭкспортнойПроцедуры",
		СтруктураПараметров,
		ПараметрыВыполнения);
	
	Возврат ДлительнаяОперация;
	
КонецФункции

Сообщение о прогрессе

В самой процедуре длительной операции "ИмяМодуля.ИмяЭкспортнойПроцедуры" необходимо сообщать о прогрессе выполнения и описание текущего действия.

Данные сообщения собирает родительский сеанс и выводит в форму ожидания.

Процедура ИмяЭкспортнойПроцедуры(СтруктураПараметров, АдресРезультата) Экспорт
	//...
	ДлительныеОперации.СообщитьПрогресс(Окр(ПроцентВыполнения, 0), Описание);
	//...
КонецПроцедуры

Процедура обработки результата

Данная процедура инициируется после завершения длительной операции. При завершении операции с ошибками есть возможность обработать их.

В случае успешного выполнения длительной операции, результат будет находиться во временном хранилище, находящемуся по адресу "Результат.АдресРезультата".

&НаКлиенте
Процедура ВыполнитьПроцедуруФоновоВыполнено(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	ИначеЕсли Результат.Статус = "Ошибка" Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ПодробноеПредставлениеОшибки);
	ИначеЕсли Результат.Статус = "Выполнено" Тогда
		// обрабатываем результат
		//ОбработатьРезультат(Результат.АдресРезультата);
	КонецЕсли;

КонецПроцедуры

Вот такая форма будет вызвана типовым кодом БСП:

Прогресс типовой

Работаем над юзабилити

В текущем окне ожидания завершения длительной операции, на мой взгляд, есть следующие недостатки:

  1. Нет наглядности индикации прогресса. Выводится только текст, хотя есть возможность отображать индикатор.
  2. Нет оценки оставшегося времени выполнения операции.
  3. При нажатии на "Отмена" не отменяется фоновое задание, а просто закрывается форма.
Поэтому можно воспользоваться немного видоизмененной формой:
 
Форма с индикацией
 
Для того, чтобы заменить вызов стандартной формы на данную, необходимо:
  1. Перенести форму "ДлительнаяОперацияНовая" из обработки, приложенной к статье, в общие формы конфигурации.
  2. Заменить имя вызываемой формы ожидания в процедуре "ДлительныеОперацииКлиент.ОжидатьЗавершение" с "ОбщаяФорма.ДлительнаяОперация" на "ОбщаяФорма.ДлительнаяОперацияНовая".

Отладка длительных операций

И небольшой бонус (может кому будет полезным) - для отладки длительных операций в текущем сеансе достаточно запустить 1С:Предприятие с параметром запуска "РежимОтладки". Об этом кратко упоминается в документации. В этом случае не будет запущено фоновое задание, а переданную функцию система запустит в текущем сеансе. Это отлаживать намного удобнее.

Запуск в режиме отладки

Скачать файлы

Наименование Файл Версия Размер
ДлительныеОперацииПрогресс 1.2.epf 31
.epf 11,72Kb
18.02.16
31
.epf 11,72Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Иван Петров (dgolovanov) 17.02.16 13:26
За "Отладка длительных операций" - отдельное спасибо.
2. Игорь Нешик (ineshyk) 07.04.16 01:11
На БСП 2.2 не работает.
вот этого
 ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    
    // указываем необходимость вывода прогресса состояния
    ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
    
    // указываем интервал обновления состояния в секундах, если не указать, 
    // то интервал будет увеличиваться при каждой итерации в 1.4 раза.
    ПараметрыОжидания.Интервал = 2;
    
    ДлительныеОперацииКлиент.ОжидатьЗавершение(
        ДлительнаяОперация,
        Новый ОписаниеОповещения("ВыполнитьПроцедуруФоновоВыполнено", ЭтотОбъект),
        ПараметрыОжидания);
...Показать Скрыть

там нет.
3. Антон Балабанов (balanton) 07.04.16 05:53
На БСП 2.2 не работает

Это актуально для БСП, начиная с версии 2.3. Подкорректировал статью. Спасибо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа