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