Как выборочно очистить сообщения пользователю или предотвратить их дублирование в 1С

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

В процессе разработки на платформе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда окно сообщений засоряется однотипными уведомлениями. Типичный пример: пользователь несколько раз нажимает кнопку «Записать», и при каждой итерации в окно выводится фраза «Данные успешно сохранены». Это не только выглядит неэстетично, но и мешает пользователю фокусироваться на действительно важных системных уведомлениях. Рассмотрим, как можно управлять этим процессом, учитывая ограничения платформенного метода ОчиститьСообщения().

Ограничения метода ОчиститьСообщения() и свойство ИдентификаторНазначения

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

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

Решение 1: Программная фильтрация через буфер сообщений

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

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

Проанализируем пример кода для такой фильтрации:


// Получаем все сообщения и очищаем системный буфер
МассивСообщений = ПолучитьСообщенияПользователю(Истина);

Для Каждого ТекущееСообщение Из МассивСообщений Цикл
    // Если сообщение не относится к нашему идентификатору, выводим его обратно
    Если ТекущееСообщение.ИдентификаторНазначения <> МойИдентификатор Тогда
        ТекущееСообщение.Сообщить();
    КонецЕсли;
КонецЦикла;

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

Решение 2: Предотвращение дубликатов перед выводом

Вместо того чтобы пытаться удалить уже выведенное сообщение, правильнее будет проверить, а не выводили ли мы его ранее. Для этого мы можем использовать тот же метод ПолучитьСообщенияПользователю(), но с параметром Ложь, чтобы не очищать буфер преждевременно.

Рассмотрим алгоритм проверки на дубли:


Функция СообщитьБезДублей(ТекстСообщения, Поле = "")
    
    // Получаем список текущих сообщений, не удаляя их из буфера
    ТекущиеСообщения = ПолучитьСообщенияПользователю(Ложь);
    
    ДубльНайден = Ложь;
    Для Каждого Сообщение Из ТекущиеСообщения Цикл
        Если Сообщение.Текст = ТекстСообщения Тогда
            ДубльНайден = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если Не ДубльНайден Тогда
        НовоеСообщение = Новый СообщениеПользователю;
        НовоеСообщение.Текст = ТекстСообщения;
        НовоеСообщение.Поле = Поле;
        НовоеСообщение.Сообщить();
    КонецЕсли;
    
КонецФункции

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

Решение 3: Использование Оповещений (Toasts)

Если сообщение носит информационный характер (например, «Документ успешно сохранен») и не требует обязательного сохранения в истории сообщений, проанализируем альтернативу в виде метода ПоказатьОповещениеПользователя(). При необходимости вывода сообщений на уровне операционной системы можно использовать инструмент для отображения уведомлений из 1С в центре уведомлений Windows.

Преимущества оповещений:

Пример использования:


ПоказатьОповещениеПользователя(
    "Успешно", 
    "Данные сохранены", 
    "Объект успешно записан в базу данных", 
    БиблиотекаКартинок.ИнформационныйСборка
);

Решение 4: Использование статусной строки через Состояние()

Еще один способ «не мусорить» в сообщениях — это использование метода Состояние(). Этот метод выводит текст в строку состояния (нижняя часть экрана). Это идеально подходит для индикации длительных процессов или подтверждения кратковременных действий.

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

Работа с ИдентификаторНазначения и КлючДанных

Нужно помнить, что свойство ИдентификаторНазначения в объекте СообщениеПользователю служит в первую очередь для адресации. Если у вас открыто несколько вспомогательных окон или форм, платформа использует этот идентификатор, чтобы понять, в какую именно форму «приземлить» сообщение.

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

Подведем итоги

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

← На главную