Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1]

22.03.22

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

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

 

Введение

Привет всем! В данной статье предлагаю алгоритм по-шагового разбора примера создания "Длительной операции" на самой последней версии библиотеки стандартных подсистем (БСП) на момент публикации статьи - 3.1.3.303.

Вы спросите - для чего эта статья? уже неоднократно разбиралась эта тема, зачем повторять? К своему удивлению, здесь на ресурсе я не нашел НИ ОДНОЙ реально "работающей" статьи по длительным операциям. В примерах много лишнего, много воды, недосказанности, другие примеры - откровенно устарели.

Моя публикация "подводит черту актуальности" на текущую дату - 28.10.2020 - я привожу рабочий пример с "длительной операцией", с отображением прогресса как на основной форме, так и на форме "длительной операции".

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

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

Не буду использовать расширения - не считаю нужным в этом примере. Так же посмотрим некоторые новые функции БСП для работы с "длительными операциями".

 

Разработка задания с отражением состояния на форме "Длительной операции"

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

&НаСервере
Процедура ПровестиДокументы222(Параметры, АдресРезультата) Экспорт
	
	//МассивВозврат = Новый Массив;
	
	ПоискДляПроведения = Новый Запрос("ВЫБРАТЬ
	                                  |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
	                                  |ИЗ
	                                  |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	                                  |ГДЕ
	                                  |	РеализацияТоваровУслуг.Дата МЕЖДУ &Дата1 И &Дата2
	                                  |	И РеализацияТоваровУслуг.Организация = &Организация
	                                  |
	                                  |УПОРЯДОЧИТЬ ПО
	                                  |	РеализацияТоваровУслуг.Дата");
	
	ПоискДляПроведения.УстановитьПараметр("Дата1", 	Параметры.ДатаНач1);
	ПоискДляПроведения.УстановитьПараметр("Дата2", 	Параметры.ДатаОкон1);
	ПоискДляПроведения.УстановитьПараметр("Организация", Параметры.Орг1);
	
	НашлиДокументы = ПоискДляПроведения.Выполнить().Выгрузить();
	
	ВсегоДокументов = НашлиДокументы.Количество();
	
	ТекДок = 1;
	
	Для Каждого Стр11 ИЗ НашлиДокументы Цикл
				
		Док = Стр11.Ссылка.ПолучитьОбъект();
		
		Док.Проведен 	= Ложь;
		Док.ПометкаУдаления = Ложь;
		
		Попытка
			Док.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
		Исключение
			Док.Записать(РежимЗаписиДокумента.Запись);
		КонецПопытки;
		
		ПроцентВыполнения = (ТекДок/ВсегоДокументов)*100;
		ПроцентВыполнения = Окр(ПроцентВыполнения,0);
		
		//МассивВозврат.Добавить(ПроцентВыполнения);
		
		// сообщаем "процент" и "текст сообщения"
		ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,СокрЛП(Док.Ссылка));
		
		ТекДок = ТекДок + 1;
		
	КонецЦикла;
	
	//ПоместитьВоВременноеХранилище(МассивВозврат, АдресРезультата);
	
КонецПроцедуры	

 

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

На этом разработка общего модуля так быстро завершена и я перейду к программированию внешней обработки, в которой напишем всю "обвязку" к длительной операции процедурыПровестиДокументы222.

Для начала нарисуем форму обработки:

Рис.1 Базовая форма внешней обработки для запуска длительной операции

 

Добавим в форму вот такие реквизиты:

Рис.2 Необходимые реквизиты и их типы

 

Пройдемся по реквизитам : ДатаНачала, ДатаОкончания и Организация - это необходимые реквизиты для запуска процедуры "на удаленке - в фоне".

Индикатор и СтрокаСостояния - вспомогательные реквизиты отображения на форме обработки

ИдЗадания - один из важных реквизитов (он не выводится на форму) - это уникальный идентификатор создаваемого фонового задания, по которому это задание можно будет "отловить" в дальнейшем.

 

Начнем с написания кода кнопки "Запустить операцию" на форме обработки. Он выглядит вот так - можно его просто скопировать и привязать действие к кнопке (как и все далее - будет сразу работать, кстати):

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

В этой процедуре мы заполняем ПараметрыЗапуска  для структуры фонового задания, задаем вывод ПрогрессаВыполнения с интервалом на форму длительной операции. Также, мы "активируем" фоновое задание и "отслеживаем его" с помощью ДлительныеОперацииКлиент.ОжидатьЗавершение().

 

Опишем оповещение "ОбработатьДанные". Это оповещение вызывается при завершении фонового задания. Выглядит вот так:

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

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

 

Теперь, опишем основную функцию внешней обработки ВыполнитьФоновоеЗаданиеНаСервере(). Выглядит она вот так:

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

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

В принципе, все - можно уже работать и получать информацию о статусе фонового задания.

Отмечу сразу, что функция БСП "ВыполнитьВФоне" уже немного устарела. Взамен ее рекомендуют использовать функции - ВыполнитьФункцию и ВыполнитьПроцедуру. Но, о них я напишу чуть позже.

 

Процесс выполнения фонового задания в "стандартном режиме" будет выглядеть вот так:

Рис.3 Отражение статуса выполнения запущенного фонового задания - в данном случае - это проведение документов.

 

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

 

Разработка задания с отражением состояния на форме внешней обработки

Для этого изначально доработаем нашу исходную процедуру - повесим в нее "обработчик ожидания" на отслеживание нашего состояния по заданному уникальному идентификатору

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

 

Так же, заблокируем Интервал и ВыводитьПрогрессВыполнения. И добавим ПараметрыОжидания.ВыводитьОкноОжидания = Ложь (запрет вывода типовой формы длительной операции).

 

Опишем процедуру ПодключитьОбработкиОжидания - ОбработчикОжиданияИндикатор. Выглядит она вот так:

&НаКлиенте 
Процедура ОбработчикОжиданияИндикатор() 
	
	Прогресс = ПрочитатьПрогресс(ИДЗадания);
	Если НЕ ТипЗнч(Прогресс) = Тип("Структура") Тогда
		ЭтаФорма.СтрокаСостояния = "";
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(Прогресс) = Тип("Структура") 
		И Прогресс.Свойство("ЗавершеноАварийно") Тогда
		ОтключитьОбработчикОжидания("ОбработчикОжиданияИндикатор");
		Возврат;
	КонецЕсли;
	
	Если Прогресс.Свойство("ЗаданиеВыполнено") И Прогресс.ЗаданиеВыполнено Тогда
		ЭтаФорма.Индикатор = 100;
		ЭтаФорма.СтрокаСостояния = "Задание завершено.";
	Иначе
		Если Прогресс.Свойство("Процент") Тогда
			ЭтаФорма.Индикатор = Прогресс.Процент;
			
		КонецЕсли;
		
		Если Прогресс.Свойство("Текст") Тогда
			ЭтаФорма.СтрокаСостояния = Прогресс.Текст;
		КонецЕсли;
	КонецЕсли;

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

 

Серверная функция ПрочитатьПрогресс на базе БСП библиотеки - выглядит вот так:

&НаСервере
Функция ПрочитатьПрогресс(Знач ИдентификаторФоновогоЗадания) Экспорт
	
	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторФоновогоЗадания);
	
	Если Задание = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
		ОтключитьОбработчикОжидания("ОбработчикОжиданияИндикатор");
		Возврат Неопределено;
	КонецЕсли;
	
	// используем БСП
	ПрогрессЗадания = ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторФоновогоЗадания);
	
	Если ПрогрессЗадания = Неопределено
	 Или ТипЗнч(ПрогрессЗадания) <> Тип("Структура") Тогда 
		ПрогрессЗадания = Новый Структура;
	КонецЕсли;
	ПрогрессЗадания.Вставить("ЗаданиеВыполнено", ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторФоновогоЗадания));
	
	Возврат ПрогрессЗадания;
	
КонецФункции

 

Итог работы данных изменений и добавлений в обработку будет такой:

Рис.4 Отражение статуса выполнения запущенного фонового задания на форме обработке. Окно выполнения фонового задания отключено. Но, процесс идет и отражается на идентификаторе и передает текущее состояние.

 

Заключение и выводы

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

Хорошо это или плохо - 100 % оценить не могу, но по своему опыту всегда пользователь запускал обработку, которая "лочила" его действия в базе.... так, для надежности чтоли....

Хочу отметить, что в БСП функция ВыполнитьВФоне - является на данный момент немного "устаревшей", но до сих пор применяется во многих типовых конфигурациях. Вместо нее предлагают использовать функции - ВыполнитьФункцию и ВыполнитьПроцедуру. Об этих функциях я напишу во второй части данного материала о фоновых заданиях. Но, забегая вперед, данные функции основаны на той же ВыполнитьВФоне - эти функции своего рода надстройки над основной функцией ВыполнитьВФоне

В своем примере я использовал Платформу 1с 8.3.17.1549 и конфигурацию БСП 3.1.3.303.

Еще раз отмечу - почему я решил написать данную статью - на ресурсе я не нашел ничего действенного, очень много лишнего пишет народ, много воды, не хватает вводных данных.

 

Функции данной статьи вы сможете скопировать к себе в обработку и это все будет работать. Спасибо, что прочитали данную статью.

 

Другие материалы

 

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

 

Так же прошу ознакомиться с другими моими статьями по БСП и типовым конфигурациям:

Работаем с контактной информацией в конфигурациях на БСП

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Типовые методы конфигурации "Зарплата и управление персоналом", которые пригодятся каждому ЗУП программисту и не только

Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Возможности работы со строками при помощи БСП, которые должен знать каждый программист

длительная операция фоновые задания БСП

См. также

БСП. Добавляем отчет в меню Отчеты

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

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3120    John_d    10    

88

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

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

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

01.03.2024    1681    dimanich70    8    

14

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

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

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

12.02.2024    784    FilippovRI    0    

15

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

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

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

07.02.2024    2607    YA_418728146    11    

43

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

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

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

19.01.2024    6238    PROSTO-1C    5    

46

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

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

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

15.01.2024    3883    0    Infostart    0    

21
Отзывы
37. quazare 3602 04.04.22 13:11 Сейчас в теме
Всем желающим скачать примеры - можете на моем телеграмм канале
yurazyuraz; d4rkmesa; +2
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1293 29.10.20 08:38 Сейчас в теме
"почему я решил написать данную статью" - одного раза объяснения хватает.
За развитие направления "БСП в картинках" плюс.
Код можно под спойлеры убрать, чтобы общее повествование не разрывалось.
Yan_Malyakov; chrnv; v_den_v; echo77; quazare; +5
2. quazare 3602 29.10.20 08:42 Сейчас в теме
(2) в следующих статьях - уберу под спойлеры. БСП - СИЛА!
+
17. Yashazz 4722 29.10.20 12:40 Сейчас в теме
(2) БСП хрень полная. Кривая, мутная, несогласованная, хаотичная, избыточная, непрозрачная, и документирована скверно.
distorshion; kako1toxren; Alien_RS_Forever; kamsky93; psa247; kida1; haykking; petr.myazin; user622095_admin; chrnv; AndrewKop; Cthulhu; bocharovki; KoC_one; Hatson; 4erv; Megaiff; davdykin; qwinter; rulan87; +20 2
23. davdykin 25 01.11.20 10:36 Сейчас в теме
(17)Согласен, но жизнь есть жизнь, и зачастую использование функций БСП - оправдано, допустим когда они делают какой-то нужный тебе функционал, а писать свой велосипед - выйдет "дорого". Ну и знание функций для получения какой-то информации (допустим контактной, как одна из статей автора), тоже может пригодиться. Так что автору большой плюс за объяснение "этой шайтан машины" на конкретных, полезных, рабочих примерах.
+
24. Yashazz 4722 01.11.20 14:48 Сейчас в теме
(23) Увы, да, иногда свой велосипед был бы по всем параметрам лучше, но писать некогда.
+
27. danjer74 3 11.11.20 08:02 Сейчас в теме
(17)
документирована скверно.
- не соглашусь. Скорее отвратительно :)
+
21. echo77 1881 30.10.20 06:47 Сейчас в теме
(2) Ничего не мешает отредактировать публикацию и сразу опубликовать - она не уйдет на проверку повторно.
+
3. suepifanov 962 29.10.20 09:00 Сейчас в теме
Ну имхо тоже не полное описание.
Если уж запуск идет во внешней обработке, то надо запускать процедуру в модуле объекта и учесть варианты когда обработка добавлена во внешние и когда через "Файл-открыть".
Ну и еще нужна команда остановки выполнения)
Jokemas; KoC_one; Lerka2611; JohnyDeath; PowerBoy; mikl79; rpgshnik; SlavaKron; TerveRus; +9
19. mikl79 118 29.10.20 13:43 Сейчас в теме
Я не знаю как это сделать для внешней обработки, запускаемой через файл-открыть.

Но через подключенную обработку примерно понимаю как сделать:

1) в общим модуле (можно в расширении) в процедуре (методе) прописать запуск подключенной обработки

2) в обработке подсунуть этот метод (который выполняется в фоне)


п.с. Нажмите "Отмена" и будет остановка
+
22. suepifanov 962 30.10.20 09:30 Сейчас в теме
(19) вот и я помню примерно
Чтобы выполнить обработку в модуле объекта надо вызывать метод ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки. И в зависимости от того, как подключена обработка передавать нужно разные параметры.

Команда отмены имелась в виду на собственной форме, а не в стандартной.
+
4. SlavaKron 29.10.20 09:29 Сейчас в теме
Свою разработку я начну с написания общего серверного модуля
Дальше не стал читать – у меня конфигурация на замке.
+
5. quazare 3602 29.10.20 09:30 Сейчас в теме
(4) ну зря не стал читать - а как же использование расширений?!
rusha77; rpgshnik; +2
8. SlavaKron 29.10.20 09:32 Сейчас в теме
(5) Сами ж пишите
Не буду использовать расширения - не считаю нужным в этом примере.
+
51. psa247 17 05.10.23 18:59 Сейчас в теме
(8) решил поумничать, пичально
+
6. rpgshnik 3645 29.10.20 09:31 Сейчас в теме
Ну раз заявка, что все "не рабочие" и моя лучшая, то покритикуем :)

По тексту:
Выделение жирным шрифтом раздражает глаз.
Про воду, тоже много.

По коду:
Не понравились имена вроде "ПровестиДокументы222" или "Орг1" и т.п. Даже для примера нужно делать красиво.
Описание параметров лучше делать у самой процедуры а не отдельным абзацем, было бы удобно их себе скопировать :)

Серверная функция ПрочитатьПрогресс на базе БСП библиотеки - выглядит вот так:

Она доступна из общего модуля или нужно себе добавлять?

А так да согласен, тоже делал для внешней обработки подобное по публикации (не помню какой, но более менее где хоть понятно было) и хотел убиться об стену :) Будет время проверю вашу.

Молодец, если рабочее :)
Hogyoku; +1
7. ellavs 1027 29.10.20 09:31 Сейчас в теме
За статью +.
Жаль, что так до сих пор нет нормального способа реализации длительных операци именно на клиенте (все примеры реализуют "длительность" только на сервере), уже несколько раз столкнулась с задачами, где выполнение определенных длительных действий могло быть реализовано только на стороне клиента (обращение к объектам, установленным на ПК-клиенте, работа в защищенной сети, в которой находится ПК-клиент и т.п.).
Как то в прошлом году про это спрашивала, было предложено только решение-хак через параллельное открытие другой формы. В новой платформе 8.3.18 упомянули новые способы асинхронности, интересно, решится ли там этот вопрос...
TimkoNzt; rpgshnik; +2
9. quazare 3602 29.10.20 09:36 Сейчас в теме
(7) в последних конфигурациях БСП - разрабатываются общие модули Асинхронность, но они пока пустые. Возможно, это делается за запуска именно на клиенте для новой платформы 8.3.18

посмотрим..... думаю, где-нибудь зимой уже
+
10. RustIG 1556 29.10.20 10:16 Сейчас в теме
(0)
Вы спросите - для чего эта статья? уже неоднократно разбиралась эта тема, зачем повторять? К своему удивлению, здесь на ресурсе я не нашел НИ ОДНОЙ реально "работающей" статьи по длительным операциям. В примерах много лишнего, много воды, недосказанности, другие примеры - откровенно устарели.

Длительные операции используют разработчики типовых конфигураций. Не припомню, чтобы кто-то описал свой опыт использования длительных операций.
Я вот к примеру, написал про распараллеливание матем. расчетов - как вам статья?
https://infostart.ru/1c/articles/1257170/

воды много? :)
+
11. RustIG 1556 29.10.20 10:24 Сейчас в теме
В примерах много лишнего, много воды, недосказанности, другие примеры - откровенно устарели.

я предположу, что в самой БСП тоже много воды, лишнего, недосказанности, ряд процедур наверное устарели - следить за развитием БСП - не лучшее времяпрепровождение по жизни.
а вам, как автору спасибо, что поднимаете тему БСП - чем больше примеров, тем легче программировать
Yashazz; +1
12. quazare 3602 29.10.20 10:27 Сейчас в теме
(11) если вы профессиональный человек - вы должны следить за подобными вещами, кроме того, использовать стандартный методы, стандартные подходы в профессии - это экономит личное время.
+
13. RustIG 1556 29.10.20 10:30 Сейчас в теме
(12)вы за маркировкой следите? за НДС следите? за 2-НДФЛ следите? а финотчетность для руководства составите?
d4rkmesa; EliasShy; YanTsys; +3
25. quazare 3602 06.11.20 11:17 Сейчас в теме
(13) вы хотели знать - слежу ли я за маркировкой. Да, конечно слежу - вот, например, ознакомьтесь с моей публикацией https://infostart.ru/public/1321478/

БСП так - для тренировки мозгов, как кроссворд.
rusha77; +1
26. RustIG 1556 07.11.20 08:42 Сейчас в теме
14. RustIG 1556 29.10.20 10:33 Сейчас в теме
(12) лично у меня много разноплановых проектов - каждый проект это новое погружение в предметную область - скажем так, это другая сторона медали под названием фрилансер 1с... я считаю, что не всем дано и надо следить за развитием БСП... это не плохо, это просто факт жизни...принимаю всех какие они есть, без претензий, друг
+
15. mszsuz 323 29.10.20 11:51 Сейчас в теме
Может кто не знает, но в самой демо-базе БСП есть 2 демо-обработки с примерами использования:
Обработка._ДемоДлительнаяОперация и Обработка._ДемоЗамерДлительнойОперации
user925427; JohnyDeath; suepifanov; RustIG; +4
16. Yashazz 4722 29.10.20 12:38 Сейчас в теме
Беда в том, что все наши публикации про БСП могут внезапно взять и резко устареть. Когда в 1С очередной раз "изменится концепция".

С некоторых пор стало тупо жаль время тратить на такие изыскания. Копаешься, берёшь за образец, а оно бац, и "более не используется".
AndrewKop; Lerka2611; user925427; +3
20. qwinter 671 29.10.20 17:27 Сейчас в теме
(16) особенно переименование функций без изменения функционала веселят)))
dobrynin.i.s; AndrewKop; rulan87; Lerka2611; YanTsys; +5
18. mikl79 118 29.10.20 13:36 Сейчас в теме
Варианты, действительно рабочие, проверил на БСП 3.1.2.416.

Спасибо, буду использовать.

Надеюсь что действительно - оно будет долго работать.

2-й вариант с выводом индикатора на форму хуже чем 1-й:
1) чуть дольше по времени отработал;
2) периодически подвисала система на доли секунд, через 3-5 секунд;
3) нет возможности прервать выполнение
user1532282; quazare; +2
28. user1476964 09.05.21 13:19 Сейчас в теме
СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);


Гммм, может я что то пропустил - но "УникальныйИдентификатор" - это что, где определяется?
klaus38; +1
55. sulfur17 59 13.11.23 12:35 Сейчас в теме
(28) это свойство управляемой формы
+
29. user1476964 09.05.21 13:36 Сейчас в теме
Сорри, проехали, тупанул
+
30. mars207 27 05.10.21 18:42 Сейчас в теме
Благодарю за пример. Буду использовать
+
31. sdemon72 25 11.11.21 09:47 Сейчас в теме
Спасибо, дружище!!!
Вот "от нашего стола - вашему столу" пример только на БСП (без своих подписчиков) с выводом прогресса, состояния и сообщений:

Исполняемая процедура:
Процедура ФоновоеЗадание() Экспорт
	
	МаксИнд = 100000;
	
	Для Инд = 1 По МаксИнд Цикл
		
		ПроцентВыполнения = Инд/МаксИнд*100;
		
		Если ПроцентВыполнения%0.1 = 0 Тогда
			ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,"Выполняется операция: " + ПроцентВыполнения + "%");
		КонецЕсли;
		
		Если ПроцентВыполнения%10 = 0 Тогда
			ОбщегоНазначения.СообщитьПользователю("Выполнено " + ПроцентВыполнения + "%");
		КонецЕсли;
	
	КонецЦикла;
	
КонецПроцедуры
Показать


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


Запуск (серверная часть):
&НаСервере
Функция ВыполнитьОперациюНаСервере()
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
	
	ПараметрыВыполнения.КлючФоновогоЗадания = "НашеФоновоеЗадание";
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Наше фоновое задание'");
	
	Результат = ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения,"Обработки.НашиФоновыеЗадания.ФоновоеЗадание"); 
	Возврат Результат;
	
КонецФункции
Показать


Вывод прогресса и сообщений:
&НаКлиенте
Процедура ОповещениеПрогрессДлительнойОперации(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено
		И Результат.Статус = "Выполняется" Тогда
		Если Результат.Свойство("Прогресс")
			И Результат.Прогресс <> Неопределено Тогда
			ПрогрессОперации = Результат.Прогресс.Процент;
			СостояниеОперации = Результат.Прогресс.Текст;
		КонецЕсли;
	КонецЕсли;
	
	Если Результат.Свойство("Сообщения")
		И Результат.Сообщения <> Неопределено Тогда
		Для Каждого Сообщение Из Результат.Сообщения Цикл
			Сообщение.Сообщить();
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры
Показать


Вывод завершения задания:
&НаКлиенте
Процедура ОповещениеЗавершениеДлительнойОперации(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено
		Или Результат.Статус = "Отменено" Тогда
		ИдентификаторФоновогоЗадания = Неопределено;;
		СостояниеОперации = "Выполнение операции отменено";
	ИначеЕсли Результат.Статус = "Выполнено" Тогда
		ПрогрессОперации = 100;
		ИдентификаторФоновогоЗадания = Неопределено;
		СостояниеОперации = "Задание выполнено успешно";
	ИначеЕсли Результат.Статус = "Ошибка" Тогда
		ИдентификаторФоновогоЗадания = Неопределено;
		СостояниеОперации = "Ошибка при выполнении задания";
		ШаблонСообщения = НСтр("ru = 'Не удалось выполнить задание.'");
		ШаблонСообщения = ШаблонСообщения + Символы.ПС + Результат.ПодробноеПредставлениеОшибки;
		ОбщегоНазначенияКлиент.СообщитьПользователю(ШаблонСообщения);
	КонецЕсли;
	
КонецПроцедуры
Показать


Прерываение задания:
&НаСервере
Процедура ОстановитьЗаданиеНаСервере()
	Если ИдентификаторФоновогоЗадания <> Неопределено Тогда
		ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторФоновогоЗадания);
		ИдентификаторФоновогоЗадания = Неопределено;
	КонецЕсли;
КонецПроцедуры


Все процедуры, кроме первой, размещены в форме обработки. Реквизиты "ПрогрессОперации" и "СостояниеОперации" связаны с элементами формы типов "Прогресс" и "Текст" соответственно. Реквизит ИдентификаторФоновогоЗадания используется только для прерывания заданий
KilloN; AnPet; headMade; Miket78; YA_514896950; Merkalov; begemot; Oxygraphis; sizeoff; +9
32. burgomister 59 13.11.21 15:59 Сейчас в теме
"Свою разработку я начну с написания общего серверного модуля" - а куда ж его разместить? Это внешняя обработка. Конфигурация на поддержке. Не понял. Если разместить в модуль объекта,, пишет - неверное имя параметра.
+
33. quazare 3602 13.11.21 19:29 Сейчас в теме
(32) прошел год с момента написания данной статьи, и она немножечко устарела - сейчас я ее перечитал, но принципы остались теже.

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

Касаемого вашего вопроса - используйте расширения.
+
34. burgomister 59 14.11.21 19:23 Сейчас в теме
(33) Спасибо. На базовой расширения нельзя. Так что использовал вариант из PUBID_1112877. Он работает без расширения.
+
35. Salavat 13 30.12.21 14:54 Сейчас в теме
...я не нашел НИ ОДНОЙ реально "работающей" статьи по длительным операциям. В примерах много лишнего, много воды, недосказанности, другие примеры - откровенно устарели...


Вобщем (моя точка зрения, после попытки повторить) - и эта статья - несильно отличается других (которые Не Работали у меня, тоже) примеров.

Ну да - воды, слегка поменьше, но - результата, всё-равно не дало.

Конкретизирую -

Мне интересен Прогресс - для внешних обработок.
(Без всяких регистраций в Доп.Обработках - просто открыть и просто Индикатор (и/или Окно - без особой разницы) Прогресса получить.

Первый Описанный Способ ("на форме "Длительной операции""), вроде похож на рабочий, но - Не Доступна процедура из Модуля Внешней Обработки!
(Если подскажете вариант синтаксиса написания для ВыполняемыйМетод, чтобы работало - буду благодарен)

Второй Способ - Просто не Рабочий.
(возможно - причина, как и у других авторов/источников, воды много лишней, в которой распутаться мне не удалось, тоже, но - результат аналогичен им((((...)
+
36. Salavat 13 30.12.21 14:58 Сейчас в теме
Вобщем - если подскажете, как прицепить на внешнюю обработку - Индикатор Прогресса, Работающий с длительными операциями на сервере -

- Буду Благодарен.
(подозреваю, нетолько я!)

И да, всем в Новом Году - Всего хорошего!!
EugeneSemyonov; +1
37. quazare 3602 04.04.22 13:11 Сейчас в теме
Всем желающим скачать примеры - можете на моем телеграмм канале
yurazyuraz; d4rkmesa; +2
38. user1277564 04.09.22 09:26 Сейчас в теме
Добрый день, я начинающий программист, подскажите пожалуйста, как передать данные из таблицы значений в процедуру фонового задания ?
суть такая что предварительно пользователь выбрать настройки, ему на экране с помощью запроса вывелись документы, он какие то документы удалил, какие то наоборот добавил в таблице значений. И после он хочет нажать кнопку - изменить количество( в каждом документе, по 200+ строк тч). И посему я хочу передать в фоновое задание итоговую таблицу значений. в ней строки обработать. Не могу сообразить, дайте пожалуйста совет.
+
39. HolyRadiance 25.10.22 05:25 Сейчас в теме
А вот этот модуль где находится?
ДлительныйМодуль

У вас процедура, которая должна выполняться в фоне, находится, как я понимаю, в модуле формы внешней обработки. Как указать к ней путь?
Hogyoku; +1
41. HolyRadiance 25.10.22 09:37 Сейчас в теме
(39) сам отвечу. Понял неправильно у автора для фонового исполнения используется процедура в общем модуле. Для использование процедуры внешней обработки необходимо указать такой путь:

ВнешняяОбработка.НазваниеОбработки.МодульОбъекта.НазваниеМетодаМодуляОбъекта
user1105830; NaAc; +2
40. HolyRadiance 25.10.22 09:34 Сейчас в теме
ОтключитьОбработчикОжидания("ОбработчикОжиданияИндикатор");

Данный метод недоступен на сервере.
+
42. Korolev 49 02.12.22 16:39 Сейчас в теме
(40)

Вместо
	Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
		ОтключитьОбработчикОжидания("ОбработчикОжиданияИндикатор");
		Возврат Неопределено;
	КонецЕсли;


Сделать:
	Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
		СтруктураОтвета = Новый Структура;
		СтруктураОтвета.Вставить("ЗавершеноАварийно", Истина);
		Возврат СтруктураОтвета;
	КонецЕсли;
+
43. YA_514896950 24 02.03.23 16:09 Сейчас в теме
скопировал в обработку процедуры из начала статьи, длительную операцию вынес в модуль обработки
при вызове просто подвисает, индикации прогресса нет

Скрытый текст


Скрытый текст
yurazyuraz; +1
45. yurazyuraz 13.03.23 16:11 Сейчас в теме
(43)
тоже пробовал , не работает
может быть конечно что то сделано не так.


Платформа 8.3.18.1334
БП 3.0.95.24
БСП 3.1.3.494
Salavat; +1
46. YA_514896950 24 13.03.23 17:22 Сейчас в теме
(45)
(45)
Я потом нашел рабочий на сто процентов пример для внешней обработки. Можете скачать одну из моих последних публикаций)
Все оказалось проще чем я думал
+
44. yurazyuraz 13.03.23 16:10 Сейчас в теме
Платформа 8.3.18.1334
БП 3.0.95.24
БСП 3.1.3.494


пример не работает
Salavat; +1 1
47. yurazyuraz 13.03.23 17:47 Сейчас в теме
(46)
Вот эта публикация ? My Webpage

Увы нет 10 стармани :)
+
48. YA_514896950 24 13.03.23 18:21 Сейчас в теме
49. Serg2000mr 317 27.05.23 22:15 Сейчас в теме
(0) В комментарии-описании к функции СообщитьПрогресс() есть следующее:
Регистрирует информацию о ходе выполнения длительной операции.
Во избежание избыточного потребления памяти и ее утечек при выполнении одной длительной операции
не следует сообщать прогресс более 100 раз.

Думаю, нужно это учесть в коде процедуры ПровестиДокументы
Salavat; +1
50. Salavat 13 28.05.23 12:19 Сейчас в теме
(49) Согласен.
Более того - такие мелкие шажочки (каждое из которых - действительно ресурсы требует) - просто бессмысленны.
Да - так, размер кода, меньше выходит.
Но, в результате же (например - для выборки из 1000 документов) - придётся сообщать 1000 раз.
Причём "движение" прогресса - рассмотреть трудновато будет.

Именно поэтому - шаг прогрессы обычно делают <=10 (в крайнем случае 5) %.от общего количества.
+
52. psa247 17 06.10.23 07:13 Сейчас в теме
Все работает на УТ (11.5.12.73), 8.3.22.1709. Спасибо!
quazare; +1
53. assa 61 20.10.23 13:46 Сейчас в теме
Платформа 8.3.18.1433
БСП 3.1.2.223
Отличная статья. Перед тем, как нашел ее, скачал две обработки, ни одна не сработала. Здесь пошагово все расписано, получилось почти с первого раза потому, что с начала взял интервал день. Взял за месяц и все сработало так, как здесь написано. Может быть кто подскажет, как обратиться к функции модуля объекта этой же обработки?
quazare; +1
54. st8899 05.11.23 19:56 Сейчас в теме
надо исправить заголовок на "Гарантированно НЕ работает"...)
A_I; pleasure; +2
56. birusik 8 18.03.24 12:09 Сейчас в теме
Публикация очень помогла, понятно и четко
+
57. quazare 3602 18.03.24 17:10 Сейчас в теме
(56) спасибо - подписывайтесь на мой тг-канал - там много интересного!
+
Оставьте свое сообщение