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