Развитие функциональности БСП поражает, то что раньше приходилось реализовывать через "костыли", теперь можно сделать парой строк кода, используя штатные механизмы БСП. Данная внешняя обработка использует пару процедур общих модулей "Длительные операции", входящих в состав БСП.
На данную тему написано много хороших статей, есть обзорные, например в данной статье хорошо расписана теория. Хороший обзор по практике различных методик фонового выполнения кода во внешних обработках написан здесь.
Отличие данной обработки от других в том, что максимально упрощен код, использующий механизмы БСП для индикации процесса выполнения длительного процесса, и это все реализовано на внешней обработке, которую не нужно встраивать в справочник "Дополнительные отчеты и обработки". Отладку можно производить прям в самом теле обработки, предварительно прописав параметр "РежимОтладки" (раздел "Отладка длительных операций").
Обработка может служить шаблоном-заготовкой для быстрого создания варианта внешней обработки с индикацией статуса выполнения длительной операции. Показан пример передачи параметров выполнения фонового задания, с выводом информации о текущем статусе выполнения
и получения результатов выполнения фонового задания на клиент
Код модуля обработки
&НаСервере
//здесь имитация длительной операции на сервере
Процедура ВыполнитьПримерНаСервере(СтруктураПараметров, АдресРезультата) Экспорт
//проверим структуру входящих параметров (задаются на форме)
Если ТипЗНЧ(СтруктураПараметров) = Тип("Структура")
И НЕ ЗначениеЗаполнено(СтруктураПараметров.ТекущийПользователь) Тогда
Возврат;
КонецЕсли;
ТекущийПользователь = СтруктураПараметров.ТекущийПользователь;
КоличествоИтераций = 0;
МассивИтераций = Новый Массив;
//формируем возвращаемую структуру на клиент
СтруктураВозврата = Новый Структура("ТекущийПользователь, ВремяНачала, ВремяОкончания, КоличествоИтераций, МассивИтераций");
СтруктураВозврата.Вставить("ТекущийПользователь", "Тек. пользователь: "+ ТекущийПользователь);
СтруктураВозврата.Вставить("ВремяНачала", "Время начала: "+ ТекущаяДата());
//имитируем длительную операцию 100 сек - 100%
ВремяЗавершения = ТекущаяДата() + 100; //выполняем 100 сек
Пока ТекущаяДата() < ВремяЗавершения Цикл
Процент = 100 - (ВремяЗавершения - ТекущаяДата());
Если НЕ (Процент % 10) И Процент Тогда
ДлительныеОперации.СообщитьПрогресс(Процент, "Обработано: "+Строка(КоличествоИтераций));
КоличествоИтераций=КоличествоИтераций+1;
МассивИтераций.Добавить(Строка(КоличествоИтераций)+ ". " + ТекущаяДата());
КонецЕсли;
КонецЦикла;
СтруктураВозврата.Вставить("КоличествоИтераций", "Количество итераций: "+КоличествоИтераций);
СтруктураВозврата.Вставить("ВремяОкончания", "Время окончания: "+ ТекущаяДата());
СтруктураВозврата.Вставить("МассивИтераций", МассивИтераций);
//помещаем в ВХ данные для клиента
ПоместитьВоВременноеХранилище(СтруктураВозврата, АдресРезультата);
КонецПроцедуры
создаем форму обработки, в модуль формы помещаем
//здесь понадобится для примера заполнить текущего пользователя,
// параметры естественно могут быть другими, все что можно поместить в структуру
&НаКлиенте
Процедура КомандаПуск(Команда)
ПараметрыЗапуска = Новый Структура("ТекущийПользователь");
ПараметрыЗапуска.Вставить("ТекущийПользователь",ПолучитьТекущийПользователь());
СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
// указываем интервал обновления состояния в секундах, если не указать,
// то интервал будет увеличиваться при каждой итерации в 1.4 раза.
ПараметрыОжидания.Интервал = 10;
ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)
НаименованиеЗадания = НСтр("ru = 'Фоновое задание длительной тестовой операции");
ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла);
ПараметрыЗадания.Вставить("ИмяМетода", "ВыполнитьПримерНаСервере");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", ПараметрыЗапуска);
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыВыполнения.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
Возврат СтруктураФоновогоЗадания;
КонецФункции
// здесь также понадобится обработать возвращаемый массив ЗаполнитьМассивИтераций(Данные.МассивИтераций),
// если например, нужно вывести какой-нибудь список обработанных документов, можно закомментить
&НаКлиенте
Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
ИначеЕсли Результат.Статус = "Ошибка" Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ПодробноеПредставлениеОшибки);
ИначеЕсли Результат.Статус = "Выполнено" Тогда
// обрабатываем результат
Данные = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если ТипЗнч(Данные) = Тип("Структура") Тогда
Сообщить(Данные.ТекущийПользователь);
Сообщить(Данные.ВремяНачала);
Сообщить(Данные.КоличествоИтераций);
Сообщить(Данные.ВремяОкончания);
ЗаполнитьМассивИтераций(Данные.МассивИтераций);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
UPD: По наработкам данной статьи добавлена возможность запуска обработки в клиент-серверном варианте.