На уже успешно завершённом собственном задании показываем старый объектный вызов. Старый вызов менеджера допускается только в отдельной пустой учебной базе без активных задач.
Где и как запускать
Полный серверный неглобальный общий модуль УчебныеФоновыеЗадачи отдельной собственной учебной конфигурации.
Подготовка
Создайте отдельную собственную учебную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую базу или копию с включёнными заданиями обмена, рассылки и обработчиками бизнес-данных.
Создайте неглобальный общий модуль УчебныеФоновыеЗадачи: Сервер = Истина, Глобальный = Ложь, Привилегированный = Ложь. Вставьте полный модуль одного урока; имя модуля используется в строке запуска.
ВыполнитьПример() вызывайте из серверного обработчика своей учебной команды обычного сеанса 1С. Не запускайте из COM/внешнего соединения с файловой базой или из другого фонового задания файловой базы.
Нужны права запуска собственных фоновых заданий. Не включайте привилегированный режим для обхода отказа. Передаются только сериализуемые числа и строка режима.
Задание считает собственные числа в памяти и публикует СообщениеПользователю. Документы, регистры, файлы, интернет и настройки пользователей не меняются. История собственных заданий остаётся в базе по правилам платформы.
Выполнить возвращает объект задания, а не результат вычисления. Трёхсекундный таймаут ограничивает одно ожидание; он не отменяет задание и не доказывает успешное завершение.
Процедура Рассчитать(Количество, Цена, Режим) Экспорт
Если Количество < 0 Или Количество > 1000000 Или Количество <> Цел(Количество) Тогда
ВызватьИсключение "guide-owned: количество должно быть целым от 0 до 1000000";
КонецЕсли;
Если Цена < 0 Тогда
ВызватьИсключение "guide-owned: цена не может быть отрицательной";
КонецЕсли;
Если Режим = "Книга" Тогда
Сумма = Количество * Цена;
ИначеЕсли Режим = "Пакет" Тогда
Сумма = 0;
Для Номер = 1 По Количество Цикл
Сумма = Сумма + Цена;
КонецЦикла;
Иначе
ВызватьИсключение "guide-owned: неизвестный режим";
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "guide-owned: сумма " + Формат(Сумма, "ЧГ=0");
Сообщение.Сообщить();
КонецПроцедуры
Процедура ВыполнитьПример() Экспорт
Параметры = Новый Массив;
Параметры.Добавить(3);
Параметры.Добавить(250);
Параметры.Добавить("Книга");
Ключ = "guide-owned-" + Строка(Новый УникальныйИдентификатор);
Задание = ФоновыеЗадания.Выполнить("УчебныеФоновыеЗадачи.Рассчитать", Параметры, Ключ, "guide-owned: расчёт книги");
Сообщить("Собственный идентификатор: " + Строка(Задание.УникальныйИдентификатор));
Задание = Задание.ОжидатьЗавершенияВыполнения(3);
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Сообщить("Таймаут: собственное задание ещё активно, успех не подтверждён");
Возврат;
КонецЕсли;
Если Задание.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда
Сообщить("Устаревшее ожидание не запускается: собственное задание не завершилось успешно");
Возврат;
КонецЕсли;
Задание.ОжидатьЗавершения();
Отбор = Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно);
Активные = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если Активные.Количество() <> 0 Тогда
Сообщить("Общее устаревшее ожидание не запускается: обнаружены активные задания");
Возврат;
КонецЕсли;
Попытка
ФоновыеЗадания.ОжидатьЗавершения(3);
Сообщить("Устаревшие вызовы возвращены; для нового кода используйте ожидание собственного массива");
Исключение
Сообщить("Общее ожидание завершилось ошибкой: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедурыРазбор по шагам
Современным ограниченным ожиданием подтвердить завершение собственной задачи. При любом другом статусе немедленно выйти.
Вызвать старый метод объекта без аргументов только на уже завершённой задаче: у этого вызова нельзя задать таймаут.
Прочитать список активных задач в собственной изолированной базе. При наличии любой активной задачи не вызывать старый менеджер.
Старому менеджеру передать только таймаут 3. У него нет параметра массива своих задач, поэтому для новых решений выбирайте ОжидатьЗавершенияВыполнения.
Как проверить результат
Если собственная задача не завершилась успешно, оба старых вызова пропускаются.
Если появились активные задачи, старый менеджер пропускается. Запускайте урок без других сеансов: проверка списка и последующий вызов не атомарны.
Ожидаемый результат
Показаны реальные устаревшие сигнатуры и их ограничения, а не придуманный вариант ОжидатьЗавершения(Свои, 3).
На что обратить внимание
Оба старых метода не рекомендуются с 8.3.13. У объекта нет аргумента таймаута; не вызывайте его на активной задаче.
Старый менеджер не ограничен собственным массивом и может заметить чужую ошибку или новую задачу. Поэтому этот урок предназначен исключительно для отдельной учебной базы без других сеансов.
Не переносите общий старый вызов в рабочую команду ожидания расчёта. Современный урок с собственным массивом решает эту задачу точнее.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.