Запуск почти любых процедур и функций конфигураций в асинхронном режиме - БСП - Длительные операции [Часть 2]

22.03.22

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

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

Введение

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

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

Согласно последним рекомендациям БСП (версия 3.1.3.303) предлагается использовать более современные функции для работы с длительными операциями - это ВыполнитьПроцедуру и ВыполнитьФункцию.

Но, а кто хочет научиться работать с функционалом длительных операций вообще в рамках БСП - прошу ознакомиться с первой частью моей статьи - Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1].

Итак, перейдем к рассмотрению функции БСП ВыполнитьПроцедуру:

 

Рабочий пример функционала БСП "ВыполнитьПроцедуру"

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

В общем виде "на входе" данная функция выглядит вот так (до 7 параметров):

ВыполнитьПроцедуру(Знач ПараметрыВыполнения = Неопределено, ИмяПроцедуры, Знач Параметр1 = Неопределено,
	Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено,
	Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено) Экспорт

а вот и код обработки:

 
 Код внешней обработки с примером "ВыполнитьПроцедуру"

 

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

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

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

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

 

Вышенаписанного кода достаточно. Все будет работать.

 

Структура выполняемой процедуры для длительной операции "ВыполнитьПроцедуру"

В данном разделе, я привожу пример процедуры для общего серверного модуля, чтобы код из раздела выше - отработал. Это - самая обычная процедура - фактически - это любая процедура из конфигурации (расширения):

 
 Процедура общего модуля для длительной операции

 

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

 

 

Рабочий пример функционала БСП "ВыполнитьФункцию"

Теперь, рассмотрим еще одну функцию выполнения длительной операции "ВыполнитьФункцию". В общем виде она выглядит вот так - до 7-ми входящих параметров:

Функция ВыполнитьФункцию(Знач ПараметрыВыполнения, ИмяФункции, Знач Параметр1 = Неопределено,
	Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено,
	Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено) Экспорт
 
 Код внешней обработки с примером "ВыполнитьФункцию"

 

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


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


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

    Если Результат = Неопределено Тогда
      Возврат;
    КонецЕсли;
    Сообщить(ПолучитьИЗВременногоХранилища(Результат.АдресРезультата));

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


 

 

Структура выполняемой процедуры для длительной операции "ВыполнитьФункцию"

Функция в общем модуле будет выглядеть вот так (тоже "любая" функция из конфигурации или расширения):

 
 Функция общего модуля для длительной операции

 

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

 

Для примера использования данной функции - я возвращаю в ней количество элементов в массиве.

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

 

Выводы и итоги

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

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

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

 

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

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

 

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

Честный знак - запрос содержания упаковки по ее коду [табачная продукция]

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

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

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

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

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

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

См. также

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

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

24.10.2024    1089    PROSTO-1C    0    

12

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

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

08.10.2024    978    PROSTO-1C    4    

10

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

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

04.10.2024    1830    MadRave    11    

24

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

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

10.09.2024    1819    MadRave    1    

17

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

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1254    n_mezentsev    10    

8

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

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4105    John_d    10    

52

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

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5354    PROSTO-1C    12    

52
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Plotks2017 273 30.10.20 13:28 Сейчас в теме
А в чем преимущество перед ВыполнитьВФоне? +- одно и тоже.
davdykin; +1 Ответить
2. mikl79 119 30.10.20 13:43 Сейчас в теме
Не понятно, зачем они нужны эти 2 функции!

Какая разница, передать структуру данных в одном параметре через ВыполнитьВФоне
или передать кучу параметров через ВыполнитьПроцедуру и ВыполнитьФункцию

Если знаете, лучше опишите как запустить в фоне внешнюю обработку через файл-открыть
5. Xershi 1555 30.10.20 20:29 Сейчас в теме
(2) уже описано. Если речь про их методы. Предварительно добавить в доп обработку.
3. quazare 3800 30.10.20 14:56 Сейчас в теме
как ни странно, разница в передаче параметров конечно. все кто не ознакомился с первой частью описания - можете сделать здесь https://infostart.ru/1c/articles/1260411/
4. suepifanov 1071 30.10.20 17:50 Сейчас в теме
(2) ну видимо не надо "готовить" функцию специально для фонового выполнения. Можно использовать и для обычного вызова и для фонового.
ubnkfl; PowerBoy; Xershi; quazare; +4 Ответить
6. Гость 14.07.23 08:57
В параметрах запуска передается структура. А если потребуется таблицу значений передать?
7. quazare 3800 14.07.23 10:44 Сейчас в теме
(6) на счет "таблицы значений" не уверен - но, вы можете скачать примеры https://infostart.ru/1c/tools/1318496/ - чтобы понять как происходит процесс
Оставьте свое сообщение