Как вывести всплывающее оповещение пользователю при проведении или закрытии документа в 1С?

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

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

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

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

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

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

Рассмотрим синтаксис данного метода:

ПоказатьОповещениеПользователя(<Текст>, <ДействиеПриНажатии>, <Пояснение>, <Картинка>, <СтатусОповещенияПользователя>, <КлючУникальности>)

Разберем назначение основных параметров:

  1. Текст — основной заголовок всплывающего окна (строка).
  2. ДействиеПриНажатии — навигационная ссылка на объект информационной базы или объект типа ОписаниеОповещения, процедура которого выполнится при клике на всплывающее окно.
  3. Пояснение — подробный дополнительный текст сообщения.
  4. Картинка — пиктограмма, выводимая рядом с текстом.
  5. СтатусОповещенияПользователя — важность оповещения (например, СтатусОповещенияПользователя.Информация или СтатусОповещенияПользователя.Важное). При статусе «Важное» уведомление сохраняется в системном Центре оповещений.

Ошибки при передаче навигационной ссылки

Посмотрим на частую ошибку, с которой сталкиваются разработчики при первой попытке вызвать данный метод:


&НаКлиенте
Процедура ПриОткрытии()
    ПоказатьОповещениеПользователя("Внимание!", ПолучитьНавигационнуюСсылку(ЭтаФорма), "У клиента есть скидка");
КонецПроцедуры

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

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


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

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


&НаКлиенте
Процедура ВывестиПростоеОповещение()
    ПоказатьОповещениеПользователя("Внимание!", , "У клиента есть скидка");
КонецПроцедуры

Где вызывать оповещение при проведении и записи документа

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

Разберем по шагам правильную схему реализации оповещения при записи и проведении:

  1. В модуле формы документа перехватываем клиентское событие ПослеЗаписи. Этот обработчик гарантированно вызывается после успешного завершения серверной транзакции записи и проведения.
  2. Даже при нажатии кнопки «Провести и закрыть» код в процедуре ПослеЗаписи успевает выполниться до полного уничтожения окна формы на клиенте.
  3. Вызываем метод ПоказатьОповещениеПользователя. Окно документа закроется, а всплывающее уведомление останется видимым для пользователя.

Посмотрим на пример кода в модуле управляемой формы документа:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        ПоказатьОповещениеПользователя(
            "Документ проведен",
            ПолучитьНавигационнуюСсылку(Объект.Ссылка),
            Строка(Объект.Ссылка),
            БиблиотекаКартинок.Успешно,
            СтатусОповещенияПользователя.Информация
        );
    Иначе
        ПоказатьОповещениеПользователя(
            "Документ сохранен",
            ПолучитьНавигационнуюСсылку(Объект.Ссылка),
            "Изменения успешно записаны в базу данных."
        );
    КонецЕсли;
    
КонецПроцедуры

Передача информации из серверного алгоритма проведения

Если решение о выводе оповещения принимается в серверном модуле объекта (например, при расчете скидки или проверке остатков в процедуре ОбработкаПроведения), передать данные на клиент можно через дополнительные свойства объекта:

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

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

← На главную