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

Программирование - Практика программирования

Длительная операция прогресс отладка

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

126

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

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

См. также

Специальные предложения

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

там нет.
3. balanton 165 07.04.16 05:53 Сейчас в теме
На БСП 2.2 не работает

Это актуально для БСП, начиная с версии 2.3. Подкорректировал статью. Спасибо.
4. Дмитрий74Чел 18 02.03.17 17:36 Сейчас в теме
Единственная статья на Инфостарте где четко и по делу. Спасибо, Антон.
eashabalin; +1 Ответить
5. Skromnyi 10 02.03.17 22:10 Сейчас в теме
про отладку не знал, спасибо большое!
eashabalin; herfis; +2 Ответить
6. vitonya 78 07.06.17 00:32 Сейчас в теме
За "Отладка длительных операций" - низкий поклон!!!
eashabalin; +1 Ответить
7. Ronin 72 13.09.17 11:51 Сейчас в теме
Не работает!
БСП 2.3.6.53

{ОбщийМодуль.ОбщегоНазначения.Модуль(7628)}: Неправильный формат параметра ИмяПроцедуры (передано значение: "ИмяМодуля.ИмяЭкспортнойПроцедуры") в ОбщегоНазначения.ВыполнитьМетодКонфигурации:
Не найден общий модуль "ИмяМодуля".
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
8. balanton 165 13.09.17 15:54 Сейчас в теме
(7) Вместо "ИмяМодуля.ИмяЭкспортнойПроцедуры" необходимо подставить имя своей экспортной процедуры.
9. nicxxx 202 05.12.17 23:33 Сейчас в теме
10. kolya_tlt 11 06.12.17 09:24 Сейчас в теме
надо курсы уже открывать про эту БСП, так как кажется только разработчики БСП знают её возможности.
bendarik; kadild; Brawler; +3 Ответить
11. FreeArcher 61 06.12.17 18:28 Сейчас в теме
За режим отладки отдельное спасибо!
12. vladismi 160 11.12.17 17:44 Сейчас в теме
13. bajiepka 12.12.17 10:04 Сейчас в теме
Подскажите, а можно ли данные подход использовать во внешних обработках?
14. balanton 165 12.12.17 13:23 Сейчас в теме
(13)
Подскажите, а можно ли данные подход использовать во внешних обработках?

если процедура находится в конфигурации, то проблем нет. вызвать длительную операцию из внешней обработки можно без проблем.
если нужно вызвать длительную операцию, которая находится во внешней обработке, то данный функционал описан в другой статье: https://infostart.ru/public/525648/
15. vis_tmp 28 01.03.18 09:40 Сейчас в теме
Большое спасибо за "РежимОтладки"!
17. Apelsinka 7 18.10.18 13:28 Сейчас в теме
(15) Присоединяюсь))) куча потраченного времени впустую...Кто бы раньше подсказал про "РежимОтладки" ((( Автору - спасибо)
16. Necessitudo 19.06.18 10:13 Сейчас в теме
18. Franchiser 47 28.10.18 15:38 Сейчас в теме
Спасибо за статью. Можно ли запускать выполнение длительной операции в несколько потоков, но чтобы форма длительной операции открывалась одна?
19. balanton 165 29.10.18 10:26 Сейчас в теме
(18)
насколько мне известно, в БСП недавно появились многопоточные обработчики обновления. для произвольных длительных операций такого функционала пока нет.
20. Franchiser 47 31.10.18 11:40 Сейчас в теме
(19) да, как раз их смотрел, это достаточно легко реализовать для своей формы длительной операции , все процедуры есть в общем модуле ОбновлениеИнформационнойБазы, они также используют ОМ ДлительныеОперации. На ИС есть примеры фонового выполнения обработок, в т.ч. через файл-открыть без внесения кода в общие модули.
Оставьте свое сообщение