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

30.11.17

Разработка - БСП (Библиотека стандартных подсистем)

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

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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1282    dimanich70    6    

13

Заполнение поля адреса в своей обработке [БСП]

Механизмы платформы 1С БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    687    FilippovRI    0    

15

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2348    YA_418728146    11    

40

1С:БСП Дополнительные реквизиты и сведения

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Бесплатно (free)

В этой статье расскажем об архитектуре, использовании и особенностях реализации подсистемы «Свойства» из инструментария разработчика «1С:Библиотека стандартных подсистем» (1С: БСП).

19.01.2024    5159    PROSTO-1C    5    

45

Бесплатный митап 9 февраля «Библиотеки и фреймворки на 1С и всё, что с этим связано»

БСП (Библиотека стандартных подсистем) Мероприятия Бесплатно (free)

Митап посвящен вопросам создания, использования и поддержке переиспользуемого кода при разработке решений на платформе 1С:Предприятие 8.

15.01.2024    3798    0    Infostart    0    

20

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    4828    mrXoxot    11    

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

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

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

{ОбщийМодуль.ОбщегоНазначения.Модуль(7628)}: Неправильный формат параметра ИмяПроцедуры (передано значение: "ИмяМодуля.ИмяЭкспортнойПроцедуры") в ОбщегоНазначения.ВыполнитьМетодКонфигурации:
Не найден общий модуль "ИмяМодуля".
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
8. balanton 308 13.09.17 15:54 Сейчас в теме
(7) Вместо "ИмяМодуля.ИмяЭкспортнойПроцедуры" необходимо подставить имя своей экспортной процедуры.
1c_ssnik; mrChOP93; succub1_5; maksa2005; +4 Ответить
9. nicxxx 254 05.12.17 23:33 Сейчас в теме
Пять баллов :)))
mrChOP93; Sem4cnt; Lyolik; +3 Ответить
10. kolya_tlt 86 06.12.17 09:24 Сейчас в теме
надо курсы уже открывать про эту БСП, так как кажется только разработчики БСП знают её возможности.
michmich; zoikins; user811769; user717534; bendarik; kild; Brawler; +7 Ответить
11. FreeArcher 158 06.12.17 18:28 Сейчас в теме
За режим отладки отдельное спасибо!
12. vladismi 168 11.12.17 17:44 Сейчас в теме
13. bajiepka 12.12.17 10:04 Сейчас в теме
Подскажите, а можно ли данные подход использовать во внешних обработках?
14. balanton 308 12.12.17 13:23 Сейчас в теме
(13)
Подскажите, а можно ли данные подход использовать во внешних обработках?

если процедура находится в конфигурации, то проблем нет. вызвать длительную операцию из внешней обработки можно без проблем.
если нужно вызвать длительную операцию, которая находится во внешней обработке, то данный функционал описан в другой статье: https://infostart.ru/public/525648/
1c_ssnik; teflon; +2 Ответить
15. vis_tmp 32 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 308 29.10.18 10:26 Сейчас в теме
(18)
насколько мне известно, в БСП недавно появились многопоточные обработчики обновления. для произвольных длительных операций такого функционала пока нет.
20. Franchiser 47 31.10.18 11:40 Сейчас в теме
(19) да, как раз их смотрел, это достаточно легко реализовать для своей формы длительной операции , все процедуры есть в общем модуле ОбновлениеИнформационнойБазы, они также используют ОМ ДлительныеОперации. На ИС есть примеры фонового выполнения обработок, в т.ч. через файл-открыть без внесения кода в общие модули.
21. mwoleg 54 31.03.20 22:52 Сейчас в теме
Лаконично, все здорово функционирует.
Спасибо
22. Pryanishnikov_Vladimir 21.05.20 11:57 Сейчас в теме
В случае успешного выполнения длительной операции, результат будет находиться во временном хранилище, находящемуся по адресу "Результат.АдресРезультата".

Что попадает в результат? У меня при получении результата из хранилище тип значения НЕОПРЕДЕЛЕНО. Как в процедуре что выполняется в фоне что-то подсунуть в результат?
23. balanton 308 28.05.20 08:20 Сейчас в теме
(22)
то попадает в результат? У меня при получении результата из хранилище тип значения НЕОПРЕДЕЛЕНО. Как в процедуре что выполняется в фоне что-то подсунуть в результат?


у вас в длительную операцию передается пустое хранилище в качестве параметра

Функция ЗапуститьВыполнениеВФоне(...) Экспорт
	
	АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы);
	...
	ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилища);


необходимо в это же хранилище и помещать нужные данные

Процедура МояПроцедура(СтруктураПараметров, АдресХранилища) Экспорт
	
	...
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	
КонецПроцедуры
24. improg 568 30.04.22 18:01 Сейчас в теме
(0) Добрый день, версия БСП 2.3.5.9 сделал как в статье не вышел диалог прогресса, затем скачал вашу обработку, адаптировал ошибок нет, но все равно окно прогресса не появилось, подскажите что делаю не так?
25. balanton 308 02.05.22 08:23 Сейчас в теме
(24) возможно, у вас включён режим отладки длительных операций. Попробуйте войти не через конфигуратор.
26. user613549_scratch_sv 02.06.22 14:18 Сейчас в теме
Фигасе!
Оно даже в файловом варианте работает.
27. user635667 137 10.07.23 12:38 Сейчас в теме
1С Розница 3.0. Не работает новая форма длительно операции. Я добавил ее в расширение. В расширение добавил модуль "ДлительныеОперацииКлиент". В нем сделал Вместо "ОжидатьЗавершение". Там заменил название формы. Новая форма открывается, но затем выпадает ошибка:
Слишком много фактических параметров
{ЕГАИС_Егор ОбщаяФорма.ДлительнаяОперацияНовая.Форма(177)}:	Возврат ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания, Ложь, Параметры.ВыводитьПрогрессВыполнения,
{ЕГАИС_Егор ОбщаяФорма.ДлительнаяОперацияНовая.Форма(86)}:	Результат = ПроверитьЗаданиеВыполнено();


Как быть?

Заменил на:

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);	
Возврат ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания,Задание);


Ошибка ушла, но индикатор процентов не работает, показывает просто 0 все время.

И второй вопрос - есть информация как это все реализовать в несколько потоков? Может кто дополнит статью?
Прикрепленные файлы:
28. orcdunaev 21.01.24 18:24 Сейчас в теме
Добрый день!
Показывает только первое сообщение прогресса, т.е. 0%. Дальнейшие вызовы ДлительныеОперации.СообщитьПрогресс идут куда-то в пустоту.
Код сделан по статье (без своей формы прогресса, со стандартной), но выполняемый метод фонового задания - в модуле менеджера обработки в расширении.
Никто не сталкивался?
Оставьте свое сообщение