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

30.11.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ДлительныеОперацииПрогресс 1.2.epf
.epf 11,72Kb
296
296 Скачать (1 SM) Купить за 1 850 руб.

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

1800 руб.

21.11.2024    3646    16    15    

18

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

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

27.12.2024    3445    PROSTO-1C    15    

43

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

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    3906    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    997    Iaskeliainen    2    

7

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

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3340    milkers    3    

12

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

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

24.10.2024    1684    PROSTO-1C    0    

18

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

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1374    PROSTO-1C    4    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 314 07.04.16 05:53 Сейчас в теме
На БСП 2.2 не работает

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

{ОбщийМодуль.ОбщегоНазначения.Модуль(7628)}: Неправильный формат параметра ИмяПроцедуры (передано значение: "ИмяМодуля.ИмяЭкспортнойПроцедуры") в ОбщегоНазначения.ВыполнитьМетодКонфигурации:
Не найден общий модуль "ИмяМодуля".
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
8. balanton 314 13.09.17 15:54 Сейчас в теме
(7) Вместо "ИмяМодуля.ИмяЭкспортнойПроцедуры" необходимо подставить имя своей экспортной процедуры.
1c_ssnik; mrChOP93; succub1_5; maksa2005; +4 Ответить
9. nicxxx 255 05.12.17 23:33 Сейчас в теме
Пять баллов :)))
mrChOP93; Sem4cnt; Lyolik; +3 Ответить
10. kolya_tlt 89 06.12.17 09:24 Сейчас в теме
надо курсы уже открывать про эту БСП, так как кажется только разработчики БСП знают её возможности.
michmich; zoikins; user811769; user717534; bendarik; kild; Brawler; +7 Ответить
11. FreeArcher 162 06.12.17 18:28 Сейчас в теме
За режим отладки отдельное спасибо!
12. vladismi 168 11.12.17 17:44 Сейчас в теме
13. bajiepka 12.12.17 10:04 Сейчас в теме
Подскажите, а можно ли данные подход использовать во внешних обработках?
14. balanton 314 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 314 29.10.18 10:26 Сейчас в теме
(18)
насколько мне известно, в БСП недавно появились многопоточные обработчики обновления. для произвольных длительных операций такого функционала пока нет.
20. Franchiser 47 31.10.18 11:40 Сейчас в теме
(19) да, как раз их смотрел, это достаточно легко реализовать для своей формы длительной операции , все процедуры есть в общем модуле ОбновлениеИнформационнойБазы, они также используют ОМ ДлительныеОперации. На ИС есть примеры фонового выполнения обработок, в т.ч. через файл-открыть без внесения кода в общие модули.
21. mwoleg 55 31.03.20 22:52 Сейчас в теме
Лаконично, все здорово функционирует.
Спасибо
22. Pryanishnikov_Vladimir 21.05.20 11:57 Сейчас в теме
В случае успешного выполнения длительной операции, результат будет находиться во временном хранилище, находящемуся по адресу "Результат.АдресРезультата".

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


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

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


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

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


Как быть?

Заменил на:

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


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

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