Как правильно пользоваться обработчиком ОбработкаПроверкиЗаполненияНаСервере?

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

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

Разделение зон ответственности

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

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

Почему в форме нет реквизитов регистра?

Многие разработчики ожидают, что если свойство ресурса регистра установлено как «обязательное», то оно автоматически попадет в массив ПроверяемыеРеквизиты формы. Это не так. Форма — это лишь «представление» данных. Если вам нужно управлять проверкой обязательности полей, которые вы сами добавили на форму (например, дополнительные флажки или поля ввода, не являющиеся реквизитами самого регистра), вы можете динамически управлять массивом ПроверяемыеРеквизиты:


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

Как проверять данные регистра

Если ваша задача — проверить, корректно ли заполнены ресурсы записи регистра (например, привязка к определенному условию), используйте модуль набора записей. В нем параметр ПроверяемыеРеквизиты будет содержать именно поля записи регистра.

Важное уточнение: При программной записи набора через метод Записать() обработчик ОбработкаПроверкиЗаполнения не вызывается автоматически. Чтобы гарантировать целостность данных при программном создании записей, всегда вызывайте метод ПроверитьЗаполнение() вручную.

Рекомендации по реализации

Чтобы код был поддерживаемым и логика не дублировалась, придерживайтесь следующих правил:


НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.КлючЗаписи.Установить(ЗначениеКлюча);
// Заполняем данные
НаборЗаписей.ПроверитьЗаполнение(); // Вызовет ОбработкаПроверкиЗаполнения
НаборЗаписей.Записать();

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

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

← На главную