Почему не срабатывает проверка заполнения реквизитов при записи документа и как это исправить

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

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

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

Штатная логика платформы: проведение и черновики

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

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

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

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

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

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


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    // Вызываем стандартную проверку заполнения формы
    Если Не ПроверитьЗаполнение() Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Посмотрим на результат работы этого кода: при нажатии кнопки «Записать» платформа немедленно проверит все элементы формы и реквизиты объекта, для которых задана обязательность заполнения. Если хотя бы один обязательный реквизит не заполнен, метод вернет значение Ложь, запись документа будет отменена через параметр Отказ = Истина, а пользователь увидит стандартное сообщение об ошибке с переходом к проблемному полю.

Способ 2. Программный контроль с использованием объекта СообщениеПользователю

Иногда требуется проверить заполнение выборочно или применить сложную бизнес-логику (например, требовать заполнение одного поля только при определенном значении другого). В таком случае проверку можно реализовать вручную в модуле формы или в модуле объекта.

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


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

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

Способ 3. Изменение свойства метаданных документа

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

  1. Откроем дерево метаданных конфигуратора и выделим нужный документ.
  2. Перейдем в окно свойств на вкладку Движения.
  3. Установим свойство Проведение в значение Запретить.

После этого платформа 1С автоматически начнет требовать заполнение всех полей со свойством Выдавать ошибку при стандартном сохранении документа по кнопке «Записать».

Дополнительные факторы, влияющие на проверку

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

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