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