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