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