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

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

При разработке дополнительных проверок в типовых конфигурациях (например, в «1С:Бухгалтерия предприятия 3.0») часто используется объект ПодпискаНаСобытие для события ПередЗаписью или ОбработкаПроведения. Однако программисты сталкиваются со следующей проблемой: если пользователь нажимает в форме документа кнопку «Провести», сообщение отображается корректно, но если нажать «Провести и закрыть», окно документа сразу закрывается, а сформированное сообщение пропадает.

Разберем подробнее, почему так происходит, и проанализируем проверенные варианты решения этой задачи.

Причина поведения управляемой формы

Выясним причину такого поведения платформы 1С:Предприятие:

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

Вариант 1. Блокирующий контроль (Отмена проведения при нехватке остатков)

Если условие проверки (например, контроль минимальных остатков номенклатуры) является критичным и не должно допускать проведения документа при нарушениях, необходимо отменять транзакцию записи.

В этом случае при обнаружении ошибки устанавливаем параметр Отказ = Истина и выводим сообщение с помощью функции БСП ОбщегоНазначенияКлиентСервер.СообщитьПользователю(). Так как параметр Отказ принимает значение Истина, платформа отменяет проведение и оставляет форму открытой, благодаря чему пользователь гарантированно увидит сообщение.

Рассмотрим пример кода в модуле подписки на событие:


Если КоличествоОстаток - КоличествоИзДокумента - МинимальныйОстаток < 0 Тогда
    Отказ = Истина;
    
    ТекстСообщения = "По товару " + ВыборкаДетальныеЗаписи.Номенклатура 
        + " (№ строки " + ВыборкаДетальныеЗаписи.НомерСтроки 
        + ") минимальный необходимый остаток " + ВыборкаДетальныеЗаписи.МинимальныйОстаток 
        + ". После проведения остаток составит " 
        + (ВыборкаДетальныеЗаписи.КоличествоОстатокДт - ВыборкаДетальныеЗаписи.Количество);
        
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;

Вариант 2. Информационное уведомление через расширение конфигурации

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

  1. На сервере (в подписке на событие): Помещаем сформированный текст предупреждения в ДополнительныеСвойства объекта документа или во временное хранилище через ПоместитьВоВременноеХранилище().
  2. На клиенте (в расширении формы): В клиентском обработчике ПослеЗаписи считываем подготовленный текст и вызываем клиентский метод ПоказатьОповещениеПользователя(). Всплывающее окно зафиксируется в правом нижнем углу экрана и не исчезнет при закрытии формы.

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


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    Если ПараметрыЗаписи.Свойство("ТекстПредупреждения") Тогда
        ПоказатьОповещениеПользователя("Внимание!", , ПараметрыЗаписи.ТекстПредупреждения);
    КонецЕсли;
КонецПроцедуры

Итоги

Для типовых конфигураций (таких как «1С:Бухгалтерия 3.0») стандартный метод Сообщить() устарел и не обеспечивает надежный вывод информации при закрытии окон. Для предупреждения ошибок с блокировкой проведения используем сочетание Отказ = Истина и вызов ОбщегоНазначенияКлиентСервер.СообщитьПользователю(). Для информационных оповещений без отмены записи применяем всплывающие клиентские уведомления через подсистему БСП или механизмы расширения.

← На главную