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