Ошибка 1С: Значение не является значением объектного типа — Решение
- Аварийное прерывание выполнения программного кода на встроенном языке 1С:Предприятие 8.3/8.2.
- Диалоговое окно с текстом:
{ОбщийМодуль.ИмяМодуля(Строка)}: Значение не является значением объектного типа (ИмяСвойства). - Сбой возникает при попытке обращения через точку (
Объект.СвойствоилиОбъект.Метод()), когда переменная содержитНеопределено,Null,Строка,ЧислоилиНеправильныйТип.
1. Архитектурная причина сбоя
Ошибка генерируется виртуальной машиной 1С, когда выполняется оператор разыменования (точка .) к переменной, которая не является составным объектом (структурой, соответствием, объектом БД, выборкой или таблицей значений), а хранит примитивный тип или пустое значение инициализации.
2. Анализ точки сбоя через отладчик
Установите точку останова (F9) перед аварийной строкой и добавьте выражение в окно вычисления (Shift+F9):
// Проверка типа переменной до обращения к ее свойству
ТипЗнч(ИскомыйОбъект) // Если вернет Неопределено, Null или Число — обращение через точку недопустимо3. Безопасные паттерны исправления кода
Вариант А: Проверка на тип и заполненность:
Если ЗначениеЗаполнено(Контрагент) И ТипЗнч(Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
ИННКонтрагента = Контрагент.ИНН;
Иначе
ИННКонтрагента = "";
КонецЕсли;Вариант Б: Безопасное извлечение из структуры или соответствия:
// Вместо прямого ПараметрыОбработки.ИмяПоля:
Если ТипЗнч(ПараметрыОбработки) = Тип("Структура")
И ПараметрыОбработки.Свойство("ИмяПоля", ЗначениеПоля) Тогда
// Работаем с ЗначениеПоля
Иначе
// Обработка отсутствия свойства
КонецЕсли;Вариант В: Защита от Null при выборках из запросов:
// В тексте запроса используйте функцию ЕСТЬNULL:
"ВЫБРАТЬ
| ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки" Частые вопросы (FAQ)
Почему ошибка часто возникает после выполнения запроса к базе данных?
Если левое соединение в запросе не находит совпадений, поля таблицы получают значение NULL. При обращении к полям ссылки выборки без проверки (или без функции ЕСТЬNULL в запросе) 1С падает с этой ошибкой.
Чем отличается Неопределено от Null в контексте объектного типа?
Неопределено — это тип отсутствия значения в переменных языка 1С, а Null — специальный тип данных СУБД, обозначающий отсутствие данных в полях таблиц при соединениях. Ни один из них не поддерживает оператор точки.
Как защитить код при работе с внешними JSON/REST API?
При десериализации ответа через ЧтениеJSON обязательно проверяйте тип полученного корня (ТипЗнч(Объект) = Тип('Структура') или Тип('Массив')), так как при ошибке сервиса может вернуться примитивная строка с HTML или кодом ошибки.
Можно ли подавить ошибку конструкцией Попытка...Исключение?
Да, конструкция перехватит исключение, однако использовать ее для сокрытия логических ошибок не рекомендуется, так как это маскирует баги и замедляет выполнение транзакций.