ФоновоеЗадание.ПолучитьСообщенияПользователю

Методы · GetUserMessages

Получает массив объектов СообщениеПользователю, которые были выведены в процессе работы фонового задания. Получение сообщений может выполняться как в процессе работы задания, так и по его завершении.

Синтаксис

ПолучитьСообщенияПользователю(<УдалятьПолученные>)
Полное описание, параметры и ограничения

ФоновоеЗадание.ПолучитьСообщенияПользователю (BackgroundJob.GetUserMessages)

ФоновоеЗадание (BackgroundJob)

ПолучитьСообщенияПользователю (GetUserMessages)

Доступен, начиная с версии 8.2.

Синтаксис:
ПолучитьСообщенияПользователю(<УдалятьПолученные>)
Параметры:

<УдалятьПолученные> (необязательный)
Тип: Булево.
Признак необходимости удаления полученных сообщений.
Истина - удалять.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: ФиксированныйМассив.

Описание:

Получает массив объектов СообщениеПользователю, которые были выведены в процессе работы фонового задания. Получение сообщений может выполняться как в процессе работы задания, так и по его завершении.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.2.

Методическая информация

Практические примеры

Прочитать сообщение «сумма 750» и очистить только очередь собственного задания

Рабочий метод создаёт СообщениеПользователю. После завершения дважды читаем без удаления, затем подтверждаем получение с удалением.

Где и как запускать

Полный серверный неглобальный общий модуль УчебныеФоновыеЗадачи отдельной собственной учебной конфигурации.

Подготовка

  1. Создайте отдельную собственную учебную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую базу или копию с включёнными заданиями обмена, рассылки и обработчиками бизнес-данных.

  2. Создайте неглобальный общий модуль УчебныеФоновыеЗадачи: Сервер = Истина, Глобальный = Ложь, Привилегированный = Ложь. Вставьте полный модуль одного урока; имя модуля используется в строке запуска.

  3. ВыполнитьПример() вызывайте из серверного обработчика своей учебной команды обычного сеанса 1С. Не запускайте из COM/внешнего соединения с файловой базой или из другого фонового задания файловой базы.

  4. Нужны права запуска собственных фоновых заданий. Не включайте привилегированный режим для обхода отказа. Передаются только сериализуемые числа и строка режима.

  5. Задание считает собственные числа в памяти и публикует СообщениеПользователю. Документы, регистры, файлы, интернет и настройки пользователей не меняются. История собственных заданий остаётся в базе по правилам платформы.

  6. Выполнить возвращает объект задания, а не результат вычисления. Трёхсекундный таймаут ограничивает одно ожидание; он не отменяет задание и не доказывает успешное завершение.

Процедура Рассчитать(Количество, Цена, Режим) Экспорт
    Если Количество < 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);
КонецПроцедуры

Разбор по шагам

  1. Посчитать 3 × 250 в собственном фоновом методе и отправить СообщениеПользователю.

  2. Дождаться терминального состояния и продолжить только при успешном завершении: активная задача ещё может добавлять сообщения.

  3. Получить сообщения с Ложь и проверить собственный точный текст. Повторное чтение оставляет очередь прежней.

  4. Получить сообщения с Истина: возвращаются полученные сообщения и удаляются из очереди именно этого задания. Проверить пустую очередь.

Как проверить результат

  1. Для завершённого задания текст собственного сообщения: guide-owned: сумма 750; четыре проверки дают Истина.

  2. После чтения с удалением количество сообщений собственного задания равно 0; история задания этим не удаляется.

Ожидаемый результат

Сумма возвращается через явное сообщение. Возвращаемая коллекция — ФиксированныйМассив, а не изменяемая очередь.

На что обратить внимание

  1. Сообщить и СообщениеПользователю — не взаимозаменяемое предположение о канале: этот рабочий метод явно использует объект сообщения.

  2. Истина удаляет полученные сообщения собственного задания. Если они нужны другим потребителям, читайте с Ложь и согласуйте подтверждение.

  3. Не очищайте сообщения чужих заданий и не удаляйте всю историю для повторения упражнения.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Запустить две собственные задачи и правильно ожидать массив

Считаем 1 × 250 и 3 × 250 отдельными заданиями. Ожидание менеджера может закончиться при изменении статуса только одного из них.

Где и как запускать

Полный серверный неглобальный общий модуль УчебныеФоновыеЗадачи отдельной собственной учебной конфигурации.

Подготовка

  1. Создайте отдельную собственную учебную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую базу или копию с включёнными заданиями обмена, рассылки и обработчиками бизнес-данных.

  2. Создайте неглобальный общий модуль УчебныеФоновыеЗадачи: Сервер = Истина, Глобальный = Ложь, Привилегированный = Ложь. Вставьте полный модуль одного урока; имя модуля используется в строке запуска.

  3. ВыполнитьПример() вызывайте из серверного обработчика своей учебной команды обычного сеанса 1С. Не запускайте из COM/внешнего соединения с файловой базой или из другого фонового задания файловой базы.

  4. Нужны права запуска собственных фоновых заданий. Не включайте привилегированный режим для обхода отказа. Передаются только сериализуемые числа и строка режима.

  5. Задание считает собственные числа в памяти и публикует СообщениеПользователю. Документы, регистры, файлы, интернет и настройки пользователей не меняются. История собственных заданий остаётся в базе по правилам платформы.

  6. Выполнить возвращает объект задания, а не результат вычисления. Трёхсекундный таймаут ограничивает одно ожидание; он не отменяет задание и не доказывает успешное завершение.

Процедура Рассчитать(Количество, Цена, Режим) Экспорт
    Если Количество < 0 Или Количество > 1000000 Или Количество <> Цел(Количество) Тогда
        ВызватьИсключение "guide-owned: количество должно быть целым от 0 до 1000000";
    КонецЕсли;
    Если Цена < 0 Тогда
        ВызватьИсключение "guide-owned: цена не может быть отрицательной";
    КонецЕсли;
    Если Режим = "Книга" Тогда
        Сумма = Количество * Цена;
    ИначеЕсли Режим = "Пакет" Тогда
        Сумма = 0;
        Для Номер = 1 По Количество Цикл
            Сумма = Сумма + Цена;
        КонецЦикла;
    Иначе
        ВызватьИсключение "guide-owned: неизвестный режим";
    КонецЕсли;
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "guide-owned: сумма " + Формат(Сумма, "ЧГ=0");
    Сообщение.Сообщить();
КонецПроцедуры

Процедура ВыполнитьПример() Экспорт
    Свои = Новый Массив;
    Количества = Новый Массив;
    Количества.Добавить(1);
    Количества.Добавить(3);
    Для Каждого Количество Из Количества Цикл
        Параметры = Новый Массив;
        Параметры.Добавить(Количество);
        Параметры.Добавить(250);
        Параметры.Добавить("Книга");
        Ключ = "guide-owned-" + Строка(Новый УникальныйИдентификатор);
        Свои.Добавить(ФоновыеЗадания.Выполнить("УчебныеФоновыеЗадачи.Рассчитать", Параметры, Ключ, "guide-owned: собственный пакет"));
    КонецЦикла;
    Обновлённые = ФоновыеЗадания.ОжидатьЗавершенияВыполнения(Свои, 3);
    Сообщить(Обновлённые.Количество() = 2);
    Для Каждого Задание Из Обновлённые Цикл
        Задание = Задание.ОжидатьЗавершенияВыполнения(3);
        Отбор = Новый Структура("УникальныйИдентификатор", Задание.УникальныйИдентификатор);
        Найденные = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
        Сообщить(Найденные.Количество() = 1);
        Сообщить("Собственный UUID: " + Строка(Задание.УникальныйИдентификатор));
        Сообщить("Состояние: " + Строка(Задание.Состояние));
        Если Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
            Для Каждого Сообщение Из Задание.ПолучитьСообщенияПользователю(Ложь) Цикл
                Сообщить(Сообщение.Текст);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Разбор по шагам

  1. Создать две собственные задачи с разными UUID-ключами и сохранить только возвращённые объекты в массив.

  2. Передать этот массив менеджеру ожидания. Получить обновлённый массив, не предполагая, что оба задания уже завершены.

  3. Каждое своё задание обновить отдельным ограниченным ожиданием и запросить список с точным отбором по его UUID.

  4. Печатать сообщение суммы только при Завершено. В файловой базе задачи могут выполняться последовательно, а не параллельно.

Как проверить результат

  1. В обновлённом массиве две собственные задачи; точный отбор по UUID находит одну запись, если она ещё доступна в истории.

  2. У успешно завершённых задач сообщения с суммами 250 и 750. Порядок завершения не закреплён; Активно после таймаута допустимо.

Ожидаемый результат

Собственный массив отделён от списка всех фоновых задач базы; ожидание любого изменения не перепутано с гарантией завершения всех.

На что обратить внимание

  1. Таймаут 3 задан отдельно для менеджера и каждого объекта: суммарное время команды может быть больше трёх секунд.

  2. Ожидание менеджера возвращается после первого изменения статуса; нельзя без проверки объявлять весь пакет успешным.

  3. Здесь нет автоматического повтора, отмены остальных задач или удаления истории.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.