Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 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 Абонемент ($m)

Пример шаблона для многопоточного выполнения фонового задания на основе БСП. Шаблоны сделаны для процедуры и функции.

2 стартмани

03.05.2024    1230    18    Hitcher    3    

12

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

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

01.03.2024    3432    dimanich70    8    

15

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

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

12.02.2024    1114    FilippovRI    0    

17

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

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

07.02.2024    3402    YA_418728146    11    

52
Отзывы
37. quazare 3727 04.04.22 13:11 Сейчас в теме
Всем желающим скачать примеры - можете на моем телеграмм канале
yurazyuraz; d4rkmesa; +2 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1310 29.10.20 08:38 Сейчас в теме
"почему я решил написать данную статью" - одного раза объяснения хватает.
За развитие направления "БСП в картинках" плюс.
Код можно под спойлеры убрать, чтобы общее повествование не разрывалось.
Yan_Malyakov; chrnv; v_den_v; echo77; quazare; +5 Ответить
2. quazare 3727 29.10.20 08:42 Сейчас в теме
(2) в следующих статьях - уберу под спойлеры. БСП - СИЛА!
17. Yashazz 4761 29.10.20 12:40 Сейчас в теме
(2) БСП хрень полная. Кривая, мутная, несогласованная, хаотичная, избыточная, непрозрачная, и документирована скверно.
KolBbl4; 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; +21 2 Ответить
23. davdykin 25 01.11.20 10:36 Сейчас в теме
(17)Согласен, но жизнь есть жизнь, и зачастую использование функций БСП - оправдано, допустим когда они делают какой-то нужный тебе функционал, а писать свой велосипед - выйдет "дорого". Ну и знание функций для получения какой-то информации (допустим контактной, как одна из статей автора), тоже может пригодиться. Так что автору большой плюс за объяснение "этой шайтан машины" на конкретных, полезных, рабочих примерах.
24. Yashazz 4761 01.11.20 14:48 Сейчас в теме
(23) Увы, да, иногда свой велосипед был бы по всем параметрам лучше, но писать некогда.
27. danjer74 4 11.11.20 08:02 Сейчас в теме
(17)
документирована скверно.
- не соглашусь. Скорее отвратительно :)
21. echo77 1865 30.10.20 06:47 Сейчас в теме
(2) Ничего не мешает отредактировать публикацию и сразу опубликовать - она не уйдет на проверку повторно.
3. suepifanov 1013 29.10.20 09:00 Сейчас в теме
Ну имхо тоже не полное описание.
Если уж запуск идет во внешней обработке, то надо запускать процедуру в модуле объекта и учесть варианты когда обработка добавлена во внешние и когда через "Файл-открыть".
Ну и еще нужна команда остановки выполнения)
Jokemas; KoC_one; Lerka2611; JohnyDeath; PowerBoy; mikl79; rpgshnik; SlavaKron; TerveRus; +9 Ответить
19. mikl79 119 29.10.20 13:43 Сейчас в теме
Я не знаю как это сделать для внешней обработки, запускаемой через файл-открыть.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

С некоторых пор стало тупо жаль время тратить на такие изыскания. Копаешься, берёшь за образец, а оно бац, и "более не используется".
AndrewKop; Lerka2611; user925427; +3 Ответить
20. qwinter 682 29.10.20 17:27 Сейчас в теме
(16) особенно переименование функций без изменения функционала веселят)))
dobrynin.i.s; AndrewKop; rulan87; Lerka2611; YanTsys; +5 Ответить
18. mikl79 119 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 Сейчас в теме
СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);


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

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


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


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


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

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


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


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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


Сделать:
	Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
		СтруктураОтвета = Новый Структура;
		СтруктураОтвета.Вставить("ЗавершеноАварийно", Истина);
		Возврат СтруктураОтвета;
	КонецЕсли;
43. YA_514896950 26 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
46. YA_514896950 26 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


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

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

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

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