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