«Значение не является значением объектного типа» в 1С: причины и как исправить
«Значение не является значением объектного типа» означает, что слева от точки оказалось
значение без свойств и методов: Неопределено, строка, число
или Null — а код обращается к нему как к объекту
(Переменная.Реквизит, Переменная.Метод()).
Ошибка всегда про значение переменной в момент выполнения, а не про синтаксис.
План действий: встать отладчиком на строку из сообщения об ошибке, вычислить
ТипЗнч() для каждого звена цепочки через точку, найти звено с
Неопределено или примитивом — и добавить проверку
ЗначениеЗаполнено() перед обращением.
Что означает ошибка «Значение не является значением объектного типа» в 1С
В языке 1С через точку можно обращаться только к объектным типам: ссылкам,
объектам, структурам, таблицам значений, элементам формы. У примитивов —
Неопределено, Null, строки, числа, булево — свойств и методов нет.
Как только слева от точки в момент выполнения оказывается такое значение, платформа
останавливается с ошибкой «Значение не является значением объектного типа», а в скобках
указывает имя свойства или метода, к которому не смогла обратиться:
{Модуль(42)}: Значение не является значением объектного типа (Наименование)
Имя = НайденнаяСсылка.Наименование;
Из сообщения видно две вещи: строку модуля и обращение-виновника. Дальше вопрос один — почему в переменной слева от точки не объект. В 1С 8.3 «значение не является значением объектного типа» почти всегда сводится к пяти причинам, разобранным ниже.
Причина 1: Неопределено вместо ссылки — поиск ничего не нашёл
Самый частый сценарий: функция поиска или собственная функция вернула
Неопределено (или пустую ссылку), результат не проверили и сразу пошли по точке.
Классика — НайтиПоКоду() / НайтиПоНаименованию() плюс
ПолучитьОбъект():
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ВВГ");
// Если элемент не найден, Ссылка — ПУСТАЯ ссылка.
// ПолучитьОбъект() от пустой ссылки падает с
// "Значение не является значением объектного типа (ПолучитьОбъект)"
Если Ссылка.Пустая() Тогда
ВызватьИсключение "Номенклатура не найдена";
КонецЕсли;
Объект = Ссылка.ПолучитьОбъект();
Объект.Артикул = "А-100";
Объект.Записать();
Важно помнить: методы НайтиПо… возвращают пустую ссылку, а
методы вроде ТаблицаЗначений.Найти(), Структура.Свойство с выходным
параметром или собственная функция без Возврат — Неопределено.
Оба варианта роняют последующее обращение через точку, но проверяются по-разному:
ссылка — через .Пустая() или ЗначениеЗаполнено(),
Неопределено — прямым сравнением.
Причина 2: слева от точки примитив — строка или число
Второй по частоте случай: в переменной лежит не ссылка, а строка с кодом или
наименованием. Обращение .Наименование к строке даёт ту же ошибку:
// Из параметра пришла строка "00-000123", а не ссылка
Процедура Обработать(Номенклатура)
// Значение не является значением объектного типа (Наименование)
Сообщить(Номенклатура.Наименование);
КонецПроцедуры
Типичные источники примитива вместо объекта: параметр процедуры, значение из колонки
таблицы значений после выгрузки, результат Строка(Ссылка), данные из JSON или
файла обмена. Если тип входного значения не гарантирован — проверяйте его явно через
ТипЗнч() до обращения по точке.
Причина 3: непроверенный результат метода и несуществующее свойство структуры
Ряд методов платформы штатно возвращают Неопределено, и это не ошибка:
ТаблицаЗначений.Найти(), Массив.Найти()… Ошибкой становится
использование результата без проверки:
Строка = ТаблицаТоваров.Найти(Ссылка, "Номенклатура");
Если Строка = Неопределено Тогда
Возврат; // совпадений нет — это нормальная ветка
КонецЕсли;
Строка.Количество = Строка.Количество + 1;
Со структурами ситуация коварнее: обращение к несуществующему свойству структуры
даёт другую ошибку («Поле объекта не обнаружено»), но если свойство есть и в нём лежит
Неопределено — например, его так и инициализировали через
Новый Структура("Ссылка") — то следующее звено цепочки
Параметры.Ссылка.Наименование упадёт уже с «не является значением объектного
типа». Для необязательных свойств используйте Структура.Свойство("Имя", Значение)
и проверяйте результат.
Причина 4: элемент формы вместо данных формы
В управляемых формах Элементы.Номенклатура — это элемент формы
(поле ввода), а данные лежат в реквизите Объект.Номенклатура. Обращение к
реквизитам ссылки через элемент формы или наоборот — обращение к свойствам элемента
(Видимость, Доступность) через данные — заканчивается ошибками
типов. Отдельный вариант той же путаницы — работа с текущей строкой динамического списка:
// ТекущиеДанные — Неопределено, если строка не выбрана
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ОткрытьЗначение(ТекущиеДанные.Ссылка);
ТекущиеДанные, ТекущаяСтрока табличной части и результат
НайтиПоИдентификатору() возвращают Неопределено, когда строка
не выбрана или удалена — проверка обязательна перед любым обращением по точке.
Причина 5: выборка запроса — обращение к данным без Следующий()
Выборка из результата запроса позиционируется на записи только после вызова
Следующий(). Обращение к полям до первого вызова или после того, как метод
вернул Ложь, — источник ошибок с полями выборки:
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ссылка = Выборка.Ссылка; // только внутри Если/Пока
Иначе
Ссылка = Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
// Дальше по цепочке: поле запроса может быть Null
// (левое соединение) — Null тоже не объектный тип.
Если ЗначениеЗаполнено(Ссылка) Тогда
Сообщить(Ссылка.Наименование);
КонецЕсли;
Смежные грабли: поле, пришедшее из левого соединения, может содержать Null —
обращение к его «реквизитам» даёт ту же ошибку. В запросе такие поля оборачивают в
ЕСТЬNULL(), в коде — проверяют ЗначениеЗаполнено().
Диагностика: ЗначениеЗаполнено, ТипЗнч и отладчик
Сообщение об ошибке уже содержит строку модуля и имя свойства. Дальше три шага:
// 1. Какой тип реально лежит в переменной?
Сообщить(ТипЗнч(НайденнаяСсылка)); // Неопределено? Строка? СправочникСсылка?
// 2. Заполнено ли значение? (ловит и Неопределено, и пустую ссылку, и Null)
Сообщить(ЗначениеЗаполнено(НайденнаяСсылка));
// 3. Для длинной цепочки А.Б.В.Г — проверяем каждое звено отдельно
Сообщить(ТипЗнч(Объект));
Сообщить(ТипЗнч(Объект.Номенклатура));
В отладчике то же самое быстрее: точка останова на строке из сообщения, затем
Shift+F9 «Вычислить выражение» — и по очереди каждое звено цепочки через
точку. Звено, у которого тип Неопределено, Null или примитив, —
и есть место обрыва. В длинных выражениях вида Док.Контрагент.Договор.Валюта
ошибка укажет на всю строку, а виновником может быть любое из промежуточных звеньев.
ТипЗнч() по каждому звену цепочки на реальных данных базы
и покажет, где именно появляется Неопределено.
Защитные паттерны: проверка перед обращением через точку
Универсальное правило: любой результат, который может оказаться пустым, проверяется
до первого обращения по точке. Для ссылок и Неопределено удобна одна проверка
ЗначениеЗаполнено() — она возвращает Ложь и для
Неопределено, и для пустой ссылки, и для Null:
Ссылка = Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента);
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
Возврат Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
Объект = Ссылка.ПолучитьОбъект(); // безопасно: ссылка точно не пустая
Когда переменная может содержать значения разных типов (параметр универсальной процедуры, данные обмена), проверяйте тип явно:
Если ТипЗнч(Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда
Наименование = Номенклатура.Наименование;
ИначеЕсли ТипЗнч(Номенклатура) = Тип("Строка") Тогда
Наименование = Номенклатура; // пришла строка — используем как есть
КонецЕсли;
Частые ошибки при разборе «не является значением объектного типа»
-
Проверка результата НайтиПо… на
Неопределено. Методы менеджеров возвращают пустую ссылку, сравнение сНеопределеновсегда ложно — аПолучитьОбъект()дальше падает. Проверяйте.Пустая()илиЗначениеЗаполнено(). -
Проверка не того звена цепочки. В
А.Б.В.ГпроверилиА, аНеопределенолежит вА.Б.В. Проверять нужно именно то звено, слева от точки которого падает код. -
Игнорирование
Nullиз левых соединений.Null— не объект и не пустая ссылка; обращение по точке падает так же. Оборачивайте поля вЕСТЬNULL()прямо в запросе. -
Функция без
Возвратна одной из веток. Такая функция молча возвращаетНеопределено, и ошибка всплывает далеко от причины — у вызывающего кода. Проверьте все веткиЕслив своих функциях поиска. -
«Лечение» через Попытку вместо проверки.
Попытка…Исключениепрячет симптом: код продолжит работать с пустыми данными. Правильно — проверкаЗначениеЗаполнено()и явная обработка ветки «не найдено».
Частые вопросы об ошибке объектного типа в 1С
Чем эта ошибка отличается от «Поле объекта не обнаружено»?
«Поле объекта не обнаружено» возникает, когда объект слева от точки есть, но у
него нет запрошенного свойства (опечатка в имени реквизита, нет ключа в структуре).
«Значение не является значением объектного типа» — когда слева от точки вообще не объект:
Неопределено, Null, строка или число.
Почему ошибка возникает на строке с ПолучитьОбъект()?
Потому что ссылка, у которой вызывают ПолучитьОбъект(), пустая — обычно
после НайтиПоКоду() или НайтиПоНаименованию(), которые ничего
не нашли. Перед вызовом проверьте ссылку через .Пустая() или
ЗначениеЗаполнено().
Как быстро найти, какое звено цепочки А.Б.В.Г пустое?
Точка останова на строке из сообщения об ошибке, затем «Вычислить выражение» (Shift+F9)
и по очереди ТипЗнч(А), ТипЗнч(А.Б), ТипЗнч(А.Б.В).
Первое звено с типом Неопределено, Null или примитивом — виновник.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка