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