Как вывести сообщение пользователю при нажатии кнопки «Провести и закрыть» в 1С?

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

При переходе с платформы 7.7 на современную версию 1С:Предприятие 8 многие разработчики сталкиваются с тем, что стандартные сообщения пользователю исчезают мгновенно после выполнения команды «Провести и закрыть». Это происходит потому, что платформа инициирует процесс закрытия формы сразу после выполнения кода. Давайте разберем, как сделать так, чтобы пользователь гарантированно увидел важное предупреждение.

Понимание жизненного цикла документа

Когда пользователь нажимает кнопку «Провести и закрыть», система выполняет запись документа, его проведение и последующее закрытие окна. Если мы выводим простое сообщение через СообщениеПользователю, оно обрабатывается сервером и отправляется клиенту. Однако из-за того, что форма закрывается практически параллельно с выводом, клиентская часть не успевает отрисовать окно сообщения, и оно «схлопывается» вместе с формой.

Решение 1: Использование «Обработки проверки заполнения»

Самый правильный и рекомендуемый метод в архитектуре управляемых форм — это использование процедуры ОбработкаПроверкиЗаполнения. Если ваша задача — не просто уведомить пользователя, а предотвратить проведение документа при обнаружении скачка цен, этот способ подойдет идеально.

Когда система проверяет документ перед записью, она вызывает эту процедуру. Если вы установите параметр Отказ = Истина, процесс проведения и закрытия документа будет принудительно остановлен. Форма останется открытой, а пользователь увидит сообщение об ошибке, которое вы сформируете.

Разберем пример реализации:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если НужноПроверитьУсловие() Тогда
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Внимание: цены выросли более чем на Х%!";
        Сообщение.Сообщить();
    КонецЕсли;
КонецПроцедуры

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

Решение 2: Блокировка проведения через «Обработку проведения»

Если вам удобнее выполнять проверку непосредственно в момент проведения, используйте процедуру ОбработкаПроведения в модуле объекта. Логика здесь аналогична: если условие проверки не выполняется, мы устанавливаем отказ, что отменяет все действия, включая закрытие формы.


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Если ОбнаруженСкачокЦен() Тогда
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Обнаружен существенный рост цен. Проведение отменено.";
        Сообщение.Сообщить();
    КонецЕсли;
КонецПроцедуры

Решение 3: Асинхронные оповещения для информационных сообщений

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

Что важно запомнить

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

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

← На главную