Как вывести неблокирующее предупреждение при проведении документа в 1С 8.3 на управляемых формах?

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

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

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

Почему Сообщить() и ПоказатьПредупреждение() не всегда эффективны?

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

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

Нам требуется механизм, который будет:

  1. Заметным для пользователя.
  2. Неблокирующим (не останавливающим выполнение кода).
  3. Позволяющим завершить транзакцию проведения и записи документа.

Использование функции ВывестиПредупреждениеВСообщениеПользователю()

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

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

Где вызывать этот метод?

Функцию следует использовать в серверном контексте — в обработчиках событий ОбработкаПроведения или ПриЗаписи модуля объекта. Именно на сервере происходит основная проверка данных и принимается решение о необходимости информирования.

Параметры функции

Основные параметры метода ВывестиПредупреждениеВСообщениеПользователю():

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

Грамотное использование параметров Ключ и ИсточникСообщения — признак хорошего тона в разработке, так как это делает систему уведомлений более управляемой.

Пример реализации в обработчике проведения

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

Разместим код в модуле объекта документа в процедуре ОбработкаПроведения:


// В обработчике ПриПроведении
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    // ... основной программный код проведения ...

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

    // ... продолжение алгоритма проведения ...

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

После проведения документа пользователь увидит уведомление в панели сообщений. Документ будет успешно проведен, а информация донесена до исполнителя без лишних пауз в работе.

Немодальные оповещения на клиенте (всплывающие окна)

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

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

Пример использования оповещения на клиенте


// В модуле формы документа
&НаКлиенте
Процедура ПоказатьМаркированныеТоварыОповещение(ТекстСообщения)
    Если Не ПустаяСтрока(ТекстСообщения) Тогда
        // Вызов всплывающего уведомления
        ПоказатьОповещениеПользователя(
            Неопределено, 
            ТекстСообщения,
            ТаймаутОповещенияПользователя.Стандартный,
            "Внимание!",
            "УникальныйИдентификаторОповещения"
        );
    КонецЕсли;
КонецПроцедуры

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

Заключение

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

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

← На главную