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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Причины отсутствия сообщений в массиве

Рассмотрим основные технические причины, по которым коллекция сообщений оказывается пустой:

  1. Использование оператора Сообщить() вместо объекта СообщениеПользователю. Метод глобального контекста ПолучитьСообщенияПользователю() перехватывает исключительно те сообщения, которые были сформированы через создание экземпляра объекта СообщениеПользователю и вызов его метода Сообщить(). Если в алгоритмах проведения (особенно в конфигурациях на обычных формах) используется классический оператор Сообщить(...), такие сообщения не попадают во внутренний стек платформы и не могут быть программно получены данным методом.
  2. Попытка получения сообщений из другого сеанса через глобальный контекст. Глобальная функция ПолучитьСообщенияПользователю() считывает буфер сообщений только текущего сеанса. Если длительная процедура запущена как фоновое задание в отдельном потоке, обращение к глобальной функции из вызывающего сеанса вернет пустой результат. Для фонового потока получение сообщений выполняется через обращение к конкретному объекту ФоновоеЗадание.
  3. Очистка буфера перед вызовом. Параметр метода ПолучитьСообщенияПользователю(Истина) очищает буфер сообщений сеанса. Если типовой код конфигурации или библиотека стандартных подсистем (БСП) уже вызвала этот метод с очисткой ранее по стеку вызовов, последующее обращение вернет пустой массив.

Как правильно получать сообщения из фонового задания

Проанализируем синтаксис и корректный способ извлечения сообщений, сформированных фоновым процессом:


// Получаем сообщения непосредственно у объекта фонового задания
МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);

Для Каждого Сообщение Из МассивСообщений Цикл
    ТекстРезультат = ТекстРезультат + " " + Сообщение.Текст + ";";
КонецЦикла;

Обратите внимание на синтаксис метода объекта ФоновоеЗадание:

Параметр <УдалятьПолученные> (необязательный, тип Булево) указывает платформе, нужно ли очищать полученные сообщения из очереди задания. Если передано значение Истина, при следующем обращении к объекту эти сообщения уже не вернутся.

Правильное формирование сообщений для перехвата

Посмотрим на пример кода, гарантирующий попадание выводимой информации в буфер сообщений платформы:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Обнаружено расхождение остатков при проведении документа.";
Сообщение.Поле = "ТабличнаяЧасть[0].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();

Такой вызов корректно регистрирует сообщение как в контексте сеанса, так и внутри потока фонового задания.

Альтернативные способы протоколирования при проведении документов

Перехват сообщений пользователя через разбор текстовых строк часто является ненадежным механизмом для контроля корректности проведения документов. Рассмотрим рекомендуемые альтернативные варианты сбора информации о предупреждениях и ошибках:

  1. Запись в Журнал регистрации. В процессе проведения фиксируйте события через вызов метода ЗаписьЖурналаРегистрации() с уровнем УровеньЖурналаРегистрации.Предупреждение или УровеньЖурналаРегистрации.Ошибка. После завершения пакета информацию можно централизованно выгрузить через метод ВыгрузитьЖурналРегистрации().
  2. Возврат результатов через Временное хранилище. При запуске фонового задания передавайте адрес во временном хранилище. По завершении выполнения процедуры фоновое задание помещает в это хранилище итоговую структуру или таблицу со списком проведенных документов, статусами и подробными описаниями предупреждений.
  3. Использование служебного регистра сведений. Создайте непериодический регистр сведений (например, «Протокол проведения документов»), в который алгоритм проведения напрямую записывает выявленные некритичные расхождения с привязкой к ссылке на документ.
← На главную