Шаблон выполнения длительных операций (запуск фоновых заданий, асинхронное выполнение серверных процедур без блокировки пользовательского интерфейса)
1C-admin
08.01.2019
Шаблон для реализации задач с длительным выполнением (через фоновые задания). Реализован с помощью типового функционала БСП, пример сделан с помощью расширений.
Данные шаблоны можно использовать для реализации любых длительных задач и предоставить пользователю возможность выполнять другие свои задачи.
Для выполнения длительной операции ее нужно поместить в:
- общий модуль;
- модуль менеджера: справочника, документа, обработки, отчета и т.д.
Пример процедуры с длительной операцией:
Пример процедуры с длительной операцией:
Процедура ВыполнитьДлительнуюОперацию(СтруктураПараметров, АдресХранилища) Экспорт
РезультатЗаполнения = Новый Структура;
//Вместо этого цикла вставляем нужную долгую операцию.
Для Инд = 1 по 10000 Цикл
а = инд;
КонецЦикла;
ДанныеЗаполнения = Неопределено; //поместить результат выполнения.
РезультатЗаполнения.Вставить("ДанныеДляЗаполненияТаблицДокумента", ДанныеЗаполнения);
ПоместитьВоВременноеХранилище(РезультатЗаполнения, АдресХранилища);
КонецПроцедуры
Новый механизм запуска фоновых заданий (ШаблонЗапускаДлительныхОпераций.cfe):
В новом шаблоне используется метод:
ДлительныеОперации.ВыполнитьВФоне()
&НаСервереБезКонтекста
Функция ЗапуститьДлительнуюОперацию(УникальныйИдентификатор)
ПараметрыВызоваСервера = Новый Массив;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Выполнение длительной операции'");
ФоновоеЗадание = ДлительныеОперации.ВыполнитьВФоне("Обработки.Расш1_ШаблонДлительнойОпераций.ВыполнитьДлительнуюОперацию",
ПараметрыВызоваСервера, ПараметрыВыполнения);
Возврат ФоновоеЗадание;
КонецФункции
Считается что он более функциональный, как по мне еще и проще для реализации. Функция запускает выполнение процедуры в фоновом задании, если это возможно.
При выполнении любого из следующих условий запуск выполняется не в фоне, а сразу в основном потоке:
- если вызов выполняется в файловой базе во внешнем соединении (в этом режиме фоновые задания не поддерживаются);
- если приложение запущено в режиме отладки (параметр /C РежимОтладки) — для упрощения отладки конфигурации;
- если в файловой ИБ имеются активные фоновые задания — для снижения времени ожидания пользователя;
- если выполняется процедура модуля внешней обработки или внешнего отчета.
Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение.
Новый функционал присутствует в версиях БСП от 2.4.х.ххх
Старый механизм запуска фоновых заданий (ШаблонЗапускаДлительныхОпераций_УстаревшийВариант.cfe):
В старом шаблоне использует метод:
ДлительныеОперации.ЗапуститьВыполнениеВФоне()
&НаСервере
Функция РезультатЗаполненияВДлительнойОперации()
СтруктураПараметров = Новый Структура;
НаименованиеЗадания = НСтр("ru = 'Выполнить длительную операцию 'Наименование'");
Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"Обработки.Расш1_ШаблонДлительнойОпераций.ВыполнитьДлительнуюОперацию",
СтруктураПараметров,
НаименованиеЗадания);
АдресХранилища = Результат.АдресХранилища;
Если Результат.ЗаданиеВыполнено Тогда
ЗаполнениеПослеВыполненияДлительнойОперации();
КонецЕсли;
Возврат Результат;
КонецФункции
В текущих релизах БСП ( от 3.0.1.ххх) он считается устаревшим, является менее функциональным аналогом ВыполнитьВФоне, предусмотрен для обратной совместимости.
А для внешних обработок вроде как то можно было выполнить процедуру ведь, почему в основном потоке запускается?
Да, для внешних обработок можно использовать ДлительныеОперации.ВыполнитьВФоне. Пример:https://infostart.ru/public/564617/
(1)