Как программно управлять окном сообщений в 1С при пакетной обработке документов?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При автоматизации рутинных операций в «1С:Бухгалтерия 3.0», таких как массовая отправка электронных документов или печатных форм по электронной почте, разработчики часто сталкиваются с проблемой «засорения» интерфейса системными сообщениями. Особенно остро это проявляется, когда типовые механизмы конфигурации выбрасывают предупреждения, которые в контексте автоматической обработки являются избыточными или ожидаемыми. Например, при формировании УПД для услуг система может требовать заполнения количества, даже если по методологии учета в конкретной организации это не требуется.

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

Причина возникновения проблемы: почему сообщения не исчезают

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

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

Решение 1: Программный перехват и фильтрация сообщений

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

Разберем по шагам, как реализовать этот алгоритм в коде вашей обработки:

  1. Выполняем действие (например, формирование документа).
  2. Вызываем метод ПолучитьСообщенияПользователю(Истина). Параметр Истина означает, что после получения сообщения будут удалены из системного стека.
  3. Анализируем полученный массив объектов типа СообщениеПользователю.
  4. Выводим только те сообщения, которые действительно важны.

Посмотрим на пример реализации такого кода:


// В цикле обработки документов
Для Каждого ТекущийДокумент Из СписокДокументов Цикл
    
    // Вызываем стандартную процедуру формирования/отправки
    Попытка
        ОбработатьДокумент(ТекущийДокумент);
    Исключение
        // Обработка критических ошибок
    КонецПопытки;
    
    // Получаем сообщения, возникшие в ходе выполнения
    МассивСообщений = ПолучитьСообщенияПользователю(Истина);
    
    Для Каждого Сообщение Из МассивСообщений Цикл
        // Проверяем текст сообщения на наличие нежелательной фразы
        Если Найти(Сообщение.Текст, "Не заполнено количество") > 0 Тогда
            // Игнорируем это сообщение
            Продолжить;
        Иначе
            // Если сообщение важное - выводим его заново или записываем в лог
            НовоеСообщение = Новый СообщениеПользователю;
            НовоеСообщение.Текст = "Документ " + ТекущийДокумент + ": " + Сообщение.Текст;
            НовоеСообщение.Сообщить();
        КонецЕсли;
    КонецЦикла;
    
КонецЦикла;

Решение 2: Полная очистка окна сообщений

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

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


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

Решение 3: Работа с проверкой количества для услуг

Проанализируем ситуацию с точки зрения методологии. Сообщение «Не заполнено количество в табличной части» часто возникает из-за жестких проверок в модулях ЭДО (Электронного документооборота). Согласно формату ФНС для УПД, поле количество может быть обязательным. Однако для услуг допускается отсутствие количественного выражения.

Если программная очистка сообщений кажется вам борьбой с симптомами, а не с болезнью, рассмотрим способы устранения самой причины появления ошибки:

Решение 4: Группировка ошибок в лог

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

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


// Пример накопления лога
ТекстЛога = "";
Для Каждого Док Из МассивДокументов Цикл
    Результат = ОтправитьДокумент(Док);
    Ошибки = ПолучитьСообщенияПользователю(Истина);
    Для Каждого Ошибка Из Ошибки Цикл
        ТекстЛога = ТекстЛога + Строка(Док) + ": " + Ошибка.Текст + Символы.ПС;
    КонецЦикла;
КонецЦикла;
// Выводим лог в текстовое поле на форме
Объект.РезультатОбработки = ТекстЛога;

Совет для пользователей: Горячие клавиши

Если вы не являетесь разработчиком, но столкнулись с горой сообщений, которые мешают работать, существует быстрый способ их закрыть. Используйте комбинацию клавиш Ctrl + Shift + Z. В большинстве типовых конфигураций на управляемых формах это сочетание мгновенно очищает панель сообщений, возвращая фокус к рабочим элементам формы.

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

← На главную