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