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