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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

Заключение

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

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

← На главную