В процессе разработки на платформе 1С 8.3 часто возникает необходимость информировать пользователя о важных нюансах или потенциальных проблемах при проведении документов, не прерывая при этом сам процесс. Например, может потребоваться вывести предупреждение о наличии маркированных товаров в документе «Отгрузка товаров», сохранив возможность его успешного проведения (в некоторых случаях полезно также реализовать наглядное отображение статуса проведенности на форме документа). В этой статье мы разберем, какие методы предлагает платформа для решения этой задачи и как их правильно применять.
Для начала разберем, почему стандартные инструменты вывода сообщений могут не подходить для реализации неблокирующих уведомлений.
Сообщить() и ПоказатьПредупреждение() не всегда эффективны?При изучении механизмов взаимодействия с пользователем в 1С разработчики первым делом вспоминают о функции Сообщить(). Этот метод выводит текст в окно сообщений в нижней части экрана. Однако у него есть критический недостаток: пользователь может легко пропустить такое уведомление, так как оно теряется на фоне системных сообщений и не требует подтверждения прочтения. В сложных интерфейсах для привлечения внимания часто требуется более глубокое программное изменение управляемых форм.
Другой популярный метод — ПоказатьПредупреждение() (или его устаревший аналог Предупреждение()). Он открывает модальное окно, которое полностью блокирует работу интерфейса и выполнение программного кода до тех пор, пока пользователь не нажмет «ОК». Это прямо противоречит нашей задаче — провести документ без принудительной остановки процесса.
Нам требуется механизм, который будет:
ВывестиПредупреждениеВСообщениеПользователю()Наиболее подходящим инструментом для вывода немодальных предупреждений из серверного контекста (например, из обработчика проведения) является функция ВывестиПредупреждениеВСообщениеПользователю().
Она направляет уведомление в специальную область системных сообщений. В отличие от модальных окон, этот метод не прерывает проведение. Сообщение появляется в списке уведомлений пользователя (обычно в верхней части окна или в меню «Сообщения пользователю»), привлекая внимание, но не блокируя работу. При отладке того, как уведомления и другие элементы ведут себя в интерфейсе, удобно использовать редактор свойств форм в режиме предприятия.
Функцию следует использовать в серверном контексте — в обработчиках событий ОбработкаПроведения или ПриЗаписи модуля объекта. Именно на сервере происходит основная проверка данных и принимается решение о необходимости информирования.
Основные параметры метода ВывестиПредупреждениеВСообщениеПользователю():
Грамотное использование параметров Ключ и ИсточникСообщения — признак хорошего тона в разработке, так как это делает систему уведомлений более управляемой.
Представим ситуацию: в документе «Отгрузка товаров» необходимо проверять наличие маркируемой продукции — для этого подойдёт модуль автоматического контроля маркировки товаров. Если такая номенклатура найдена, выводим неблокирующее уведомление.
Разместим код в модуле объекта документа в процедуре ОбработкаПроведения:
// В обработчике ПриПроведении
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ... основной программный код проведения ...
// Проверка наличия маркированных товаров
Для Каждого СтрокаТЧ Из Товары Цикл
// Проверяем свойство номенклатуры
Если СтрокаТЧ.Номенклатура.ДополнительныеСвойства.Найти("МаркированныйТовар") <> Неопределено Тогда
Если СтрокаТЧ.Номенклатура.ДополнительныеСвойства.МаркированныйТовар И СтрокаТЧ.Количество > 0 Тогда
// Вывод немодального предупреждения
ВывестиПредупреждениеВСообщениеПользователю(
"Внимание: в документе присутствуют маркированные товары. Проверьте корректность заполнения кодов.",
"ПроведениеОтгрузки_Маркировка", // Ключ группировки
ЭтотОбъект // Ссылка на текущий документ
);
Прервать; // Выводим только одно общее сообщение для всего документа
КонецЕсли;
КонецЕсли;
КонецЦикл;
// ... продолжение алгоритма проведения ...
КонецПроцедуры
После проведения документа пользователь увидит уведомление в панели сообщений. Документ будет успешно проведен, а информация донесена до исполнителя без лишних пауз в работе.
Если требуется сделать предупреждение максимально наглядным прямо на форме документа, можно использовать клиентский метод ПоказатьОповещениеПользователя() (ShowUserNotification). Он создает всплывающее окно (toast-уведомление) в углу экрана, которое автоматически исчезает через несколько секунд. В случаях, когда требуется оповестить всех сотрудников сразу, может пригодиться специализированный механизм оповещения пользователей в «горящем» режиме.
Поскольку ОбработкаПроведения выполняется на сервере, для вызова этого метода потребуется передать флаг или текст сообщения на клиентскую сторону (например, через параметры формы или временное хранилище) и вызвать процедуру уже после завершения серверных операций.
// В модуле формы документа
&НаКлиенте
Процедура ПоказатьМаркированныеТоварыОповещение(ТекстСообщения)
Если Не ПустаяСтрока(ТекстСообщения) Тогда
// Вызов всплывающего уведомления
ПоказатьОповещениеПользователя(
Неопределено,
ТекстСообщения,
ТаймаутОповещенияПользователя.Стандартный,
"Внимание!",
"УникальныйИдентификаторОповещения"
);
КонецЕсли;
КонецПроцедуры
Этот способ требует более сложной настройки взаимодействия между сервером и клиентом, но обеспечивает мгновенную визуальную реакцию интерфейса на действия пользователя.
Для большинства сценариев в 1С 8.3 на управляемых формах оптимальным выбором является функция ВывестиПредупреждениеВСообщениеПользователю(). Она гармонично вписывается в логику проведения документов, не мешает работе пользователя и гарантирует, что важная информация будет доступна для ознакомления. Помимо уведомлений, не забывайте про настройку доступности элементов формы, чтобы акцентировать внимание пользователя на важных полях.
Выбирая метод уведомления, всегда соблюдайте баланс: сообщение должно быть заметным, но не должно превращаться в навязчивое препятствие для ежедневной работы. Для тех, кто стремится к автоматизации процесса разработки интерфейсов, интересным решением станет генерация автотестов и динамическая модификация форм — здесь поможет конструктор динамической настройки управляемых форм.