Ожидание завершения фоновой операции на клиенте

БСП (стандартные подсистемы) / Длительные операции

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

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

//Без БСП - обработчик ожидания: клиент раз в 2 секунды спрашивает сервер,
//завершилось ли фоновое задание, и сам рисует индикацию
&НаКлиенте
Процедура РассчитатьДолгБезБСП(Команда)
    ИдентификаторЗадания = ЗапуститьРасчетНаСервере();
    ПодключитьОбработчикОжидания("ПроверитьРасчет", 2, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьРасчет()
    Если ЗаданиеЗавершено(ИдентификаторЗадания) Тогда
        Сообщить("Расчёт завершён");
    Иначе
        ПодключитьОбработчикОжидания("ПроверитьРасчет", 2, Истина);
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаданиеЗавершено(Знач ИдентификаторЗадания)
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(
                          ИдентификаторЗадания);
    Возврат Задание.Состояние <> СостояниеФоновогоЗадания.Активно;
КонецФункции