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