Ошибки платформы 1С

«Значение не является значением объектного типа» в 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:

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

Объект = Ссылка.ПолучитьОбъект(); // безопасно: ссылка точно не пустая
ПолучитьОбъект
без параметроввызывается у непустой ссылки; от пустой ссылки — ошибка объектного типа
СправочникОбъект

Когда переменная может содержать значения разных типов (параметр универсальной процедуры, данные обмена), проверяйте тип явно:

Если ТипЗнч(Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда
    Наименование = Номенклатура.Наименование;
ИначеЕсли ТипЗнч(Номенклатура) = Тип("Строка") Тогда
    Наименование = Номенклатура; // пришла строка — используем как есть
КонецЕсли;
В Консоли кода удобно проверять такие гипотезы без правки конфигурации: попросите агента «найди контрагента по коду X и покажи ТипЗнч результата» — и сразу видно, что возвращает метод на ваших данных: ссылку, пустую ссылку или вообще другой тип.

Частые ошибки при разборе «не является значением объектного типа»

  • Проверка результата НайтиПо… на Неопределено. Методы менеджеров возвращают пустую ссылку, сравнение с Неопределено всегда ложно — а ПолучитьОбъект() дальше падает. Проверяйте .Пустая() или ЗначениеЗаполнено().
  • Проверка не того звена цепочки. В А.Б.В.Г проверили А, а Неопределено лежит в А.Б.В. Проверять нужно именно то звено, слева от точки которого падает код.
  • Игнорирование Null из левых соединений. Null — не объект и не пустая ссылка; обращение по точке падает так же. Оборачивайте поля в ЕСТЬNULL() прямо в запросе.
  • Функция без Возврат на одной из веток. Такая функция молча возвращает Неопределено, и ошибка всплывает далеко от причины — у вызывающего кода. Проверьте все ветки Если в своих функциях поиска.
  • «Лечение» через Попытку вместо проверки. Попытка…Исключение прячет симптом: код продолжит работать с пустыми данными. Правильно — проверка ЗначениеЗаполнено() и явная обработка ветки «не найдено».

Частые вопросы об ошибке объектного типа в 1С

Чем эта ошибка отличается от «Поле объекта не обнаружено»?

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

Почему ошибка возникает на строке с ПолучитьОбъект()?

Потому что ссылка, у которой вызывают ПолучитьОбъект(), пустая — обычно после НайтиПоКоду() или НайтиПоНаименованию(), которые ничего не нашли. Перед вызовом проверьте ссылку через .Пустая() или ЗначениеЗаполнено().

Как быстро найти, какое звено цепочки А.Б.В.Г пустое?

Точка останова на строке из сообщения об ошибке, затем «Вычислить выражение» (Shift+F9) и по очереди ТипЗнч(А), ТипЗнч(А.Б), ТипЗнч(А.Б.В). Первое звено с типом Неопределено, Null или примитивом — виновник.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф