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