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