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