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