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