Данная публикация основана на теории из Асинхронная концепция программирования
Работает на Платформе 3.14+ и на версии БСП: 3.0+.
Расположение выполняемой Процедуры - зависит от ситуации.
Данный пример демонстрирует, что Процедуру можно вызывать как из Общего модуля так и из Модуля менеджера - обработки расположенной в Конфигурации или в Расширении.
1. В общем модуле или Модуле менеджера Обработки нужно создать Экспортную Процедуру:
Процедура НашаДлительнаяОперация(Параметры, Заглушка) Экспорт
// Имитация продолжительного действия (Длительность сек.).
ДатаНачалаОперации = ТекущаяДата();
Пока ТекущаяДата()-ДатаНачалаОперации<Параметры.Длительность Цикл
КонецЦикла;
КонецПроцедуры
2. Нужно создать внешнюю обработку и добавить форму, на форме создать:
2.1. Реквизит - Длительность и ФоновоеЗадание
2.2. Команды - ТестОМ и ТестОбработка
2.3. Обработчик события - ПриСозданииНаСервере
3. В модуль формы вставить следующий код:
&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаКлиенте
Перем ФормаДлительнойОперации;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ФоновоеЗадание = Новый Структура("
|ИмяЗадания,
|ИдентификаторЗадания,
|АдресХранилища");
КонецПроцедуры
&НаКлиенте
Процедура ТестОМ(Команда)
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("Длительность", Длительность);
ЗапуститьФоновоеЗадание("Фоновое задание", ПараметрыЗадания, "ОбщийМодульСервер.НашаДлительнаяОперация");
КонецПроцедуры
&НаКлиенте
Процедура ТестОбработка(Команда)
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("Длительность", Длительность);
ЗапуститьФоновоеЗадание("Фоновое задание", ПараметрыЗадания, "Обработки.Обработка.НашаДлительнаяОперация");
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьФоновоеЗадание(ИмяЗадания, ПараметрыЗадания, Модуль)
ЗаданиеВыполнено = ЗапуститьФоновоеЗаданиеНаСервере(ИмяЗадания, ПараметрыЗадания, Модуль);
Если ЗаданиеВыполнено Тогда
ОбработатьЗавершениеЗаданияНаКлиенте(Ложь);
Иначе
ОткрытьФормуДлительнойОперации();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗапуститьФоновоеЗаданиеНаСервере(ИмяЗадания, ПараметрыЗадания, Модуль)
РезультатЗапускаЗадания = ЗапуститьЗаданиеНаСервере(ИмяЗадания, ПараметрыЗадания, Модуль);
ФоновоеЗадание.ИмяЗадания = ИмяЗадания;
ФоновоеЗадание.ИдентификаторЗадания = РезультатЗапускаЗадания.ИдентификаторЗадания;
ФоновоеЗадание.АдресХранилища = РезультатЗапускаЗадания.АдресХранилища;
Возврат РезультатЗапускаЗадания.ЗаданиеВыполнено;
КонецФункции
&НаСервере
Функция ЗапуститьЗаданиеНаСервере(НаименованиеЗадания, ПараметрыЗадания, Модуль)
РезультатЗапускаЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
Модуль,
ПараметрыЗадания,
НаименованиеЗадания);
Возврат РезультатЗапускаЗадания;
КонецФункции
&НаКлиенте
Процедура ОбработатьЗавершениеЗаданияНаКлиенте(ОбновитьДанные = Истина)
ЗавершениеФоновогоЗадания(ФоновоеЗадание.АдресХранилища, ОбновитьДанные);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуДлительнойОперации()
ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
ПараметрыОбработчикаОжидания.КоэффициентУвеличенияИнтервала = 1.2;
ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина);
ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(
ЭтаФорма, ФоновоеЗадание.ИдентификаторЗадания);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеФоновогоЗадания(АдресХранилища, ОбновитьДанные)
Результат = ЗавершениеЗаданияНаСервере(АдресХранилища);
КонецПроцедуры
&НаСервере
Функция ЗавершениеЗаданияНаСервере(АдресХранилища)
Результат = ПолучитьИзВременногоХранилища(АдресХранилища);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания()
Попытка
Если ФормаДлительнойОперации.Открыта() Тогда
Если ЗаданиеВыполнено(ФоновоеЗадание.ИдентификаторЗадания) Тогда
ОбработатьЗавершениеЗаданияНаКлиенте();
ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
Иначе
ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания",
ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина);
КонецЕсли;
КонецЕсли;
Исключение
ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаданиеВыполнено(ИдентификаторЗадания)
Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
КонецФункции