Почему в обычных формах 1С не срабатывает событие ПередЗаписью при нажатии кнопки ОК?

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

В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 при работе с обычными формами разработчики нередко сталкиваются с ситуацией, когда интерактивное сохранение документа ведет себя непредсказуемо. Например, при явном нажатии кнопок Провести или Записать срабатывает событие формы ПередЗаписью, однако при нажатии кнопки ОК в новом документе форма либо просто закрывается, либо событие полностью игнорируется. Разберем по шагам, почему возникает такое поведение платформы и как правильно организовать вызов проверок формы.

Причина 1. Наличие собственного обработчика нажатия у кнопки

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

Проанализируем ситуацию: если в коде обработчика кнопки разработчик пишет вызов прямой записи объекта базы данных, например ЭтотОбъект.Записать() или ДокументОбъект.Записать(), то запись происходит минуя контекст формы. Платформенные события формы — ПередЗаписью, ПриЗаписи и ПослеЗаписи — при этом не вызываются вовсе, так как управление передается напрямую в модуль объекта.

Чтобы восстановить вызов событий формы при сохранении пользовательского обработчика, необходимо использовать специализированный метод формы ЗаписатьВФорме(). Посмотрим на пример правильного кода кнопки:


Процедура ОсновныеДействияФормыОК(Кнопка)
    // Выполняем интерактивную запись формы с передачей режима
    Если ЗаписатьВФорме(РежимЗаписиДокумента.Запись) Тогда
        ЭтаФорма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Метод ЗаписатьВФорме() инициирует полноценную цепочку событий формы, включая ПередЗаписью с параметрами Отказ, РежимЗаписи и РежимПроведения, и только после успешной проверки производит запись в базу данных.

Причина 2. Подключение стандартного действия командной панели

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

  1. Откроем форму документа в конфигураторе и выделим командную панель или соответствующую кнопку.
  2. В палитре свойств найдем свойство Действие.
  3. Убедимся, что вместо пользовательской процедуры там выбрано системное действие ОсновныеДействияФормыОК (или ФормаОК).
  4. Проверим также свойства самой формы: в строке события ПередЗаписью должна быть явно указана процедура-обработчик модуля формы.

Причина 3. Свойство Модифицированность нового документа

Рассмотрим еще одну особенность обычных форм 1С, проявляющуюся на новых документах. При интерактивном нажатии системной кнопки ОК платформа проверяет внутренний признак изменения данных формы — свойство Модифицированность.

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

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


Процедура ПриОткрытии()
    // Устанавливаем флаг, чтобы платформа знала о наличии изменений
    Модифицированность = Истина;
КонецПроцедуры

Где размещать проверки: в форме или в модуле объекта?

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

Поэтому рекомендуется разделять логику проверок по следующим правилам:

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

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

← На главную