Почему СообщениеПользователю дублируется в форме созданного документа и как это исправить?

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

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

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

Штатное назначение механизма сообщений пользователю

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

Свойство КлючДанных указывает платформе, к какому конкретному объекту информационной базы (например, ссылке на документ или справочник) привязано выданное диагностическое сообщение. Механизм работает по следующим правилам:

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

Варианты решения задачи

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

Вариант 1. Использование метода ПоказатьОповещениеПользователя

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

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


ПоказатьОповещениеПользователя("Успешно", ПолучитьНавигационнуюСсылку(НовыйДокумент.Ссылка), "Документ создан");

Преимущества и условия применения данного подхода:

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

Вариант 2. Отказ от заполнения свойства КлючДанных

Если требуется сохранить вывод именно в стандартную панель сообщений окна приложения, можно оставить использование объекта СообщениеПользователю, но не заполнять свойство КлючДанных.

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

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

Вариант 3. Программная очистка сообщений

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

Рекомендации по выбору решения

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

← На главную