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