#std463¶
Обработчик события ОбработкаПроверкиЗаполнения¶
1.1.¶
В обработчике ОбработкаПроверкиЗаполнения модуля объекта выполняйте проверки корректности заполнения реквизитов объекта:
- реквизитов шапки;
- измерений и ресурсов;
- реквизитов табличных частей;
- других данных объекта, проверяемых до записи.
1.2.¶
Используйте этот обработчик, когда обычной проверки на заполненность недостаточно:
- значение реквизита зависит от других реквизитов;
- обязательность заполнения зависит от условий или функциональных опций.
Если проверка заполнения условная, в коде удаляйте такие реквизиты из массива ПроверяемыеРеквизиты.
Рекомендуемая схема:
- создать массив
НепроверяемыеРеквизиты; - в процессе проверки добавлять в него имена реквизитов (и табличных частей), которые сейчас не нужно проверять;
- в конце удалить эти реквизиты из
ПроверяемыеРеквизиты.
Не используйте альтернативные схемы.
Иначе условные проверки скрываются от анализа свойства Проверка заполнения.
Неправильно
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проверка значения реквизита на соответствие требованиям.
Если Не ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = НСтр("ru = 'ИНН задан неверно.'");
Сообщение.Поле = "ИНН";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
// Условная обязательность реквизита.
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
ПроверяемыеРеквизиты.Добавить("ИндивидуальныйПредприниматель");
КонецЕсли;
КонецПроцедуры
Правильно
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
НепроверяемыеРеквизиты = Новый Массив;
// Проверка значения реквизита на соответствие требованиям.
Если Не ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = НСтр("ru = 'ИНН задан неверно.'");
Сообщение.Поле = "ИНН";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
НепроверяемыеРеквизиты.Добавить("ИНН");
КонецЕсли;
// Условная обязательность реквизита.
Если ЮрФизЛицо <> Перечисления.ЮрФизЛицо.ФизЛицо Тогда
НепроверяемыеРеквизиты.Добавить("ИндивидуальныйПредприниматель");
КонецЕсли;
УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, НепроверяемыеРеквизиты);
КонецПроцедуры
Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт
Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
1.3.¶
Учитывайте, что ОбработкаПроверкиЗаполнения вызывается не при каждой записи объекта.
Например, обработчик не вызывается при программной записи.
1.4.¶
Если в конфигурации используется подсистема Обмен данными БСП, обработчик ОбработкаПроверкиЗаполнения может вызываться при проведении документов после загрузки из сообщения обмена.
Чтобы отключать отдельные проверки в этом режиме, анализируйте ДополнительныеСвойства.ОтложенноеПроведение.
Проверки, выполняемые в и вне транзакции записи объекта¶
2.1.¶
Проверки в ОбработкаПроверкиЗаполнения выполняются вне транзакции записи.
Это эффективно: при ошибке заполнения операция прерывается до записи в базу.
При таких проверках помните, что новое состояние объекта еще не записано. Если нужна проверка по данным системы с опорой на текущий объект, используйте сохранение данных во временные таблицы.
2.2.¶
Не размещайте в ОбработкаПроверкиЗаполнения проверки, которые должны гарантировать целостность объекта и зависимых данных (например, движений).
Для таких проверок используйте обработчики, работающие в транзакции записи:
- #std464:
ПередЗаписью; - #std465:
ПриЗаписи; ОбработкаПроведения(для документов).
Для транзакционных проверок выделяют два случая:
2.2.1.¶
Проверка состояния движений документов оперативного учета.
Проверку остатка ресурса в транзакции записи имеет смысл делать только если все документы, меняющие этот ресурс, проверяют его так же. Если хотя бы один документ меняет ресурс без проверки, такие проверки обычно нужно выносить из транзакции. Исключения допустимы, но должны быть обоснованы.
2.2.2.¶
Проверка состояния других объектов базы, на которые ссылается текущий объект.
Если правило может быть нарушено при записи разных объектов, проверка должна быть симметричной.
Например, если при записи подразделения проверяется, что выбранный руководитель имеет должность Руководитель, то при записи сотрудника должна быть встречная проверка этого же правила.
Иначе правило следует проверять вне транзакции у обоих объектов.
См. также¶
- #std478: Подсказка и проверка заполнения
- #std464: Обработчик события ПередЗаписью
- #std465: Обработчик события ПриЗаписи
- #std686: Работа с параметром "Отказ" в обработчиках событий