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