Почему ошибка проверки заполнения в 1С возникает до процедуры ПередЗаписью?

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

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

Последовательность событий при интерактивной записи

Проанализируем стандартный жизненный цикл события записи объекта из управляемой формы. Вызов процедур происходит в строго определенном порядке:

  1. ПередЗаписью — обработчик в модуле формы (выполняется на клиенте).
  2. ОбработкаПроверкиЗаполненияНаСервере — обработчик в модуле формы (выполняется на сервере).
  3. ОбработкаПроверкиЗаполнения — процедура в модуле объекта (выполняется на сервере).
  4. ПередЗаписьюНаСервере — событие в модуле формы (выполняется на сервере).
  5. ПередЗаписью — процедура в модуле объекта (выполняется на сервере).

Причины вывода ошибки до захода в процедуру ПередЗаписью

Разберем основные факторы, из-за которых отладчик останавливается или не доходит до серверной процедуры ПередЗаписью:

  1. Системная проверка заполнения платформой: Если у реквизита объекта или элемента формы установлено свойство Проверка заполнения в значение Выдавать ошибку, платформа автоматически выполняет проверку в рамках событий ОбработкаПроверкиЗаполнения. Если поле оказывается пустым, выполнение процесса записи прерывается на этапе проверки заполнения, не доходя до ПередЗаписьюНаСервере и ПередЗаписью объекта.
  2. Точка останова установлена только в модуле объекта: Клиентская процедура ПередЗаписью формы срабатывает первой. Однако если точка останова стоит только в модуле объекта или в серверной процедуре ПередЗаписьюНаСервере, то при обнаружении пустого реквизита на этапе проверки платформа прерывает процесс и не доходит до этих точек.
  3. Проверки в событиях элементов формы: Логика валидации или проверка реквизитов может быть вызвана в клиентских событиях полей ввода (например, ПриИзменении или ОкончаниеВводаТекста) либо в коде кастомной команды формы до вызова платформенного метода Записать().
  4. Особенности настройки отладки на сервере: Если отладка на сервере 1С не включена (отсутствует параметр -debug у службы сервера) или отладчик не подключен к серверным сеансам, точки останова в серверных процедурах будут проигнорированы.

Как диагностировать и решить проблему

Выясним, какие шаги необходимо предпринять для поиска причины и коррекции поведения программы:

Шаг 1. Проверим свойства реквизита. Посмотрим настройки реквизита объекта и соответствующих элементов управляемой формы в конфигураторе. Проверим значение свойства Проверка заполнения (значения: Выдавать ошибку, Не проверять).

Шаг 2. Разместим точки останова на ранних этапах. Установим точки останова в клиентской процедуре ПередЗаписью управляемой формы, а также в процедурах ОбработкаПроверкиЗаполненияНаСервере модуля формы и ОбработкаПроверкиЗаполнения модуля объекта.

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


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Удаляем реквизит из списка обязательных к проверке
    ЭлементДляУдаления = ПроверяемыеРеквизиты.Найти("ДоговорКонтрагента");
    Если ЭлементДляУдаления <> Неопределено Тогда
        ПроверяемыеРеквизиты.Удалить(ЭлементДляУдаления);
    КонецЕсли;
    
КонецПроцедуры

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

← На главную