К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно очистить окно сообщений в 1С

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

Окно сообщений в 1С накапливает вывод процедур Сообщить() и объектов СообщениеПользователю, и со временем пользователь перестаёт отличать актуальные предупреждения от устаревших. В типовых сценариях — длительная обработка, пакетное проведение документов, загрузка данных — разработчику нужно очищать панель программно, чтобы каждый этап показывал только свои сообщения.

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

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

Как устроен вывод сообщений в 1С и что именно мы очищаем

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

Очистка окна сообщений затрагивает оба типа, но по-разному. Метод ОчиститьСообщения() удаляет всё содержимое панели, включая сообщения, привязанные к данным. Точечная работа с коллекцией сообщений формы позволяет убрать только те, что относятся к конкретному объекту, — это важно, когда на одной форме параллельно работают несколько проверок.

Важно понимать: окно сообщений — клиентский элемент интерфейса. Весь программный код очистки выполняется на клиенте (в управляемой форме — в контексте &НаКлиенте или в общем модуле с признаком клиентского вызова). Вызов очистки в серверной процедуре без тонкого клиента не даст видимого эффекта.

Базовый способ: метод ОчиститьСообщения()

Глобальный метод ОчиститьСообщения() доступен в управляемом приложении и не принимает параметров. Он удаляет все сообщения из панели сообщений текущего окна. Типичный сценарий — очистка перед началом нового этапа обработки, чтобы старые ошибки не смешивались с новыми.

&НаКлиенте

Процедура ВыполнитьОбработку(Команда)

ОчиститьСообщения();

// дальнейшая логика обработки

ВыполнитьЗагрузкуНаСервере();

КонецПроцедуры

Обратите внимание на нюанс: если серверная процедура выводит сообщения через СообщениеПользователю, они появляются в панели уже после возврата управления на клиент. Поэтому вызов ОчиститьСообщения() до серверного вызова очищает панель корректно, а вызов после — тоже сработает, но удалит и только что выведенные сервером сообщения. Порядок вызова определяет, какие сообщения останутся видимыми.

Метод не работает в веб-клиенте в некоторых старых версиях платформы так же предсказуемо, как в тонком клиенте, поэтому при кросс-клиентской разработке поведение стоит проверять в каждом целевом клиенте отдельно.

bsl
&НаКлиенте
Процедура ОчиститьИЗапустить(Команда)
    ОчиститьСообщения();
    Состояние("Выполняется обработка...");
    ЗапуститьОбработкуНаСервере();
КонецПроцедуры

Точечная очистка сообщений, привязанных к данным формы

Когда очищать всю панель нельзя — например, на форме одновременно отображаются сообщения от двух независимых проверок — используется привязка сообщений к объекту. Сообщение, у которого вызван метод УстановитьДанные(Объект), попадает в коллекцию сообщений этого объекта, и платформа управляет им отдельно.

&НаСервере

Процедура ПроверитьЗаполнениеНаСервере()

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Не заполнен склад отгрузки";

Сообщение.Поле = "Объект.Склад";

Сообщение.УстановитьДанные(Объект);

Сообщение.Сообщить();

КонецПроцедуры

Удалить такие сообщения можно, перечитав данные формы или сбросив привязку, но прямого метода «удалить одно сообщение из панели» платформа не предоставляет. Практический приём — вызывать ОчиститьСообщения() на клиенте и заново выводить только актуальные сообщения. Это выглядит как лишняя работа, но гарантирует консистентное состояние панели.

Очистка в обычном приложении и на сервере

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

Собственный «журнал сообщений» на форме — наиболее управляемый вариант: вы сами решаете, когда очищать список, как фильтровать записи и сколько строк хранить. Это особенно удобно в длительных обработках, где пользователю нужна история этапов, а не одно текущее сообщение.

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

Сравнение подходов

ОчиститьСообщения()

Управляемое приложение, нужно убрать всё. Ограничение: удаляет и чужие актуальные сообщения, не работает на сервере и в обычном приложении.

Привязка через УстановитьДанные()

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

Собственный журнал на форме

Длительные обработки, обычное приложение, нужна история и фильтрация. Ограничение: требует ручной реализации вывода и очистки.

Типовой сценарий: очистка в длительной обработке по этапам

Распространённая задача — обработка, которая проходит несколько этапов (проверка, загрузка, проведение), и на каждом этапе панель должна показывать только его сообщения. Каркас решения выглядит так:

&НаКлиенте

Процедура ЗапуститьПоЭтапам(Команда)

ОчиститьСообщения();

ЭтапПроверкаНаСервере();

ОчиститьСообщения();

ЭтапЗагрузкаНаСервере();

ОчиститьСообщения();

ЭтапПроведениеНаСервере();

КонецПроцедуры

У этого подхода есть побочный эффект: пользователь не видит сообщения предыдущих этапов. Если история важна, лучше не очищать панель, а добавлять в текст сообщений префикс этапа («[Проверка]», «[Загрузка]») или вести параллельный журнал в реквизите формы.

Для фоновых заданий ситуация иная: сообщения, выведенные в фоновом задании, попадают в панель только если задание запущено с определёнными настройками, и управлять их очисткой извне нельзя. Надёжнее собирать сообщения в массив структур внутри фонового задания и возвращать их в вызывающую форму через временное хранилище.

Порядок внедрения очистки в обработку
  1. 1
    Определите, в каком клиенте работает обработка: тонкий, веб или обычное приложение
  2. 2
    Разместите вызов ОчиститьСообщения() в клиентской процедуре перед запуском этапа
  3. 3
    Переведите вывод с Сообщить() на СообщениеПользователю там, где нужна подсветка полей
  4. 4
    Проверьте, что серверные сообщения появляются после возврата на клиент и не затираются лишней очисткой
  5. 5
    Протестируйте сценарий с ошибками на каждом этапе и убедитесь, что панель показывает только актуальные сообщения

Проверка результата и типичные ошибки

Проверить корректность очистки просто: после вызова метода панель сообщений должна быть пустой, а новые сообщения — появляться без накопления старых. Если панель не очищается, почти всегда причина в одной из типовых ошибок: вызов размещён в серверной процедуре, код выполняется в обычном приложении, либо очистка вызывается до того, как сервер вернул сообщения, и визуально кажется, что она «не сработала».

Типичные ошибки
01
Вызов ОчиститьСообщения() в серверной процедуре — метод клиентский, панель не очистится
02
Очистка после серверного вызова вместо очистки перед ним — удаляются свежие сообщения об ошибках
03
Ожидание очистки панели в обычном приложении — там этого API нет, нужен собственный журнал
04
Смешение Сообщить() и СообщениеПользователю без системы — часть сообщений теряет привязку к полям, и подсветка ошибок ломается
05
Очистка панели при каждом интерактивном действии пользователя — человек не успевает прочитать предупреждение
Контрольные точки

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

Состояние панели после вызова
Норма

Панель пустая, новые сообщения выводятся по одному

Тревожный признак

Старые сообщения остаются — вызов не на клиенте или не в том контексте

Сообщения с привязкой к полю
Норма

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

Тревожный признак

Сообщение висит постоянно — привязка не установлена или очистка не вызывается

Поведение в веб-клиенте
Норма

Очистка работает так же, как в тонком клиенте

Тревожный признак

Поведение отличается — нужна отдельная проверка версии платформы

FAQ

Можно ли очистить только одно конкретное сообщение из панели?

Напрямую — нет, платформа не предоставляет метод удаления отдельного сообщения. Обходной путь: вызвать ОчиститьСообщения() и заново вывести те сообщения, которые должны остаться. Если сообщения привязаны к данным объекта через УстановитьДанные(), их жизненным циклом частично управляет платформа при повторной проверке заполнения.

Работает ли ОчиститьСообщения() в обычном приложении 1С 8.2?

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

Почему после ОчиститьСообщения() сообщения появляются снова?

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

Можно ли очистить сообщения, выведенные фоновым заданием?

Надёжного способа нет: сообщения фонового задания передаются на клиент по завершении и попадают в общую панель. Практичное решение — не выводить сообщения внутри фонового задания, а собирать их в массив, помещать во временное хранилище и показывать в форме под своим контролем.

Что лучше использовать: Сообщить() или СообщениеПользователю?

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

Влияет ли очистка панели на журнал регистрации?

Нет. Окно сообщений и журнал регистрации — независимые механизмы. Очистка панели удаляет только визуальные сообщения текущего сеанса; записи журнала регистрации, если они создавались через ЗаписьЖурналаРегистрации(), сохраняются в базе.

Итог

Что важно запомнить

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