Поле объекта не обнаружено в 1С 8.5

Что за ошибка

Ошибка «Поле объекта не обнаружено» возникает, когда программный код пытается обратиться к реквизиту, атрибуту или свойству, которого нет у текущего объекта в момент выполнения. Это не ошибка отсутствия значения (NULL), а именно отсутствие самого поля в структуре объекта — например, при обращении Объект.НесуществующийРеквизит. Платформа выбрасывает исключение, указывая модуль и строку.

Причины возникновения

С точки зрения разработчика, причина всегда одна — несоответствие ожидаемой и фактической структуры данных в момент вызова. Типичные сценарии:

  • Обращение к несуществующему реквизиту объекта.
  • Неверное указание имени поля — самый частый сценарий, когда имя поля указано не верно.
  • Удаление или переименование реквизита в конфигураторе без удаления обращений к нему в модулях, формах, макетах печатных форм или запросах СКД.
  • Обращение через точку к полю, не убедившись в существовании поля верхней вложенности.
  • Ошибка в запросе — в тексте запроса указан псевдоним поля, который не возвращается выборкой, либо поле отсутствует в таблицах-источниках.
  • Особенности управляемых форм — обращение к реквизиту формы, который ещё не создан (например, в ПриСозданииНаСервере до инициализации), или использование ЭтотОбъект для формы, которая не привязана к объекту данных.

Как не допустить появление ошибки

Лучший способ предупредить появление ошибки — сделать проверку. Эта проверка может быть в коде, а может быть даже произведена просто самими человеком. Очень часто причиной ошибки становится просто невнимательность. Вот некоторые рекомендации, которые помогут сократить вероятность появления ошибки.

Внимательность

Прежде чем указать название реквизита в коде или свойства стоит проверить его точное написание имени. Эта простая рекомендация на внимательность порой может сильно сократить количество ошибок.

Проверка на тип данных

Проверьте переменную или значение на заполнение и тип данных перед обращением через точку. Это особенно актуально, когда переменная изначально была проинициализирована как Неопределено, а также при использовании составноого типа. Допустим, значение является составным типом двух рахных видов документов. В одном есть реквизит, к которому обращаются, а в другом нет. В этом случае одним из вариантов проверки будет проверка значения составного типа на тип данных:

Если ТипЗнч(МоеЗначение) = Тип("ДокументСсылка.ДокументСРеквизитом") Тогда
   Переменная = МоеЗначение.Реквизит.РеквизитВложенный;
КонецЕсли; 

/// или хотя бы на пустое значение

Если ЗначениеЗаполнено(МоеЗначение) Тогда
   ...
КонецЕсли;

Проврека наличия реквизита или свойства

Проверка наличия элемента на управляемой форме перед обращением к нему:

Если Элементы.Найти("ИмяЭлемента") <> Неопределено Тогда
   Элементы.ИмяЭлемента.Видимость = Истина;
КонецЕсли;

Проверка наличия реквизита или свойства средствами БСП через функцию ЕстьРеквизитИлиСвойствоОбъекта(<Объект>, <ИмяРеквизитаСвойства>):

// Проверка наличия реквизита "Наименование" у справочника Номенклатура в управляемой форме
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, "Наименование") Тогда
...
КонецЕсли

Если у вас нет БСП вот ее примерный код, вы можете сделать на ее основании свою:

Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита)
   Ключ = Новый УникальныйИдентификатор;
   СтрРеквизита = Новый Структура(ИмяРеквизита, Ключ);
   ЗаполнитьЗначенияСвойств(СтрРеквизита, Объект);
	
   Возврат СтруктураРеквизита[ИмяРеквизита] <> Ключ;
КонецФункции

Проверка наличия реквизита через метаданные объекта:

// Проверка в управляемой форме Номенклатуры наличие реквизита Артикул
Если Объект.Ссылка.Метаданные().Реквизиты.Найти("Артикул") <> Неопределено Тогда
...
КонецЕсли;

Чтобы проверить наличие свойства в Структуре или Соответствии можно воспользоваться стандартным методом Свойство(<ИмяСвойства>). Он возвращает Истина если свойство есть и Ложь, если его нет.

Если МояСтруктура.Свойство("ИмяСвойства") Тогда
...
КонецЕсли

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправьте форму и мы вам перезвоним

Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу
Сайт itviar.ru использует cookie для персонализации и хранения настроек.
Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу