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