К статье
Практический материал

Разработка и Конфигурация · 15 мин

Ошибка «Значение не является значением объектного типа» в 1С: причины и способы исправить

Разбираем ошибку «Значение не является значением объектного типа» в 1С: причины, типовые сценарии в коде и решения для пользователя без программирования.

Ошибка «Значение не является значением объектного типа» — одна из самых частых проблем, с которой сталкиваются и разработчики 1С, и обычные пользователи. Она появляется, когда программа пытается обратиться к свойству, методу или элементу объекта, а вместо объекта получает что-то другое: неопределённое значение, примитивный тип (число, строку, дату) или пустую ссылку.

Для разработчика это сигнал о логической ошибке в коде: где-то переменной присвоено не то значение, запрос вернул пустой результат, а его не проверили, либо функция вернула Неопределено вместо ожидаемого объекта. Для пользователя типовой конфигурации ошибка чаще всего означает проблему в данных — битую ссылку, незаполненный реквизит, повреждённую настройку.

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

Что означает ошибка и как читать её текст

Встроенный язык 1С строго разделяет значения объектного типа (справочники, документы, запросы, таблицы значений, структуры и т.д.) и примитивные типы (число, строка, дата, булево), а также специальное значение Неопределено. К свойству или методу через точку можно обращаться только у объектного значения. Если в переменной оказалось Неопределено, число или строка — платформа прерывает выполнение с этой ошибкой.

Типичный текст выглядит так: {ОбщийМодуль.РаботаСДокументами.Модуль(125)}: Значение не является значением объектного типа (СуммаДокумента). Здесь важны три элемента: модуль и номер строки, где произошёл сбой, и имя свойства — после скобок. Именно к этому свойству код пытался обратиться у «неправильного» значения.

Обратите внимание: имя в скобках — это свойство, к которому обратились, а не переменная-виновник. Виновник — выражение, стоящее слева от точки. Например, в строке Сумма = Выборка.СуммаДокумента; ошибка «(СуммаДокумента)» означает, что проблема в переменной Выборка — она не является объектом выборки из запроса.

Типовые причины в коде: где искать виновника

Подавляющее большинство случаев сводится к нескольким повторяющимся сценариям. Зная их, вы найдёте проблему в считанные минуты.

Функция вернула Неопределено

Самый частый сценарий: функция в какой-то ветке логики не выполнила Возврат со значением, и результат оказался Неопределено. Дальше вызывающий код пытается прочитать свойство результата — и получает ошибку. Проверьте все ветки условий в функции: каждая должна завершаться возвратом осмысленного значения.

Запрос вернул пустой результат

Код вида Выборка = Запрос.Выполнить().Выбрать(); Сумма = Выборка.Сумма; упадёт, если запрос не нашёл ни одной строки: обращение к свойству выборки до вызова Выборка.Следующий() некорректно. Правильный шаблон — сначала проверить Результат.Пустой() или организовать цикл Пока Выборка.Следующий() Цикл.

Метод НайтиПоКоду / НайтиПоНаименованию вернул пустую ссылку

Если элемент справочника не найден, методы поиска возвращают пустую ссылку. Сама по себе пустая ссылка — объектный тип, но обращение к её реквизитам через точку (например, НайденныйЭлемент.Наименование) приводит к обращению к базе и может давать неожиданные результаты, а попытка вызвать ПолучитьОбъект() у пустой ссылки вернёт Неопределено. Всегда проверяйте НайденныйЭлемент.Пустая() или ЗначениеЗаполнено(НайденныйЭлемент) перед использованием.

Обращение к реквизиту через точку от переменной примитивного типа

Бывает, что в переменную, где ожидалась ссылка на документ, попадает строка или число — например, из параметра формы, настройки или результата обмена. Код Параметр.Номер падает, если Параметр — строка. Такие ситуации типичны при доработках обменов и загрузок из внешних файлов.

В тексте ошибки указан модуль и строкаПроблема в коде конфигурации или расширения

Откройте указанную строку в конфигураторе и проверьте переменную слева от точки

Ошибка у всех пользователей на одном действииСистемная проблема: код или повреждённые данные

Проверьте, не началось ли после обновления; выполните тестирование и исправление

Ошибка только у одного пользователяВероятны кэш или персональные настройки

Очистите кэш клиентского приложения и проверьте пользовательские настройки отчётов

Ошибка после обновления конфигурацииНесовместимость доработок или расширения с новой версией

Отключите расширения по очереди и проверьте доработанные модули

Пошаговая диагностика для разработчика

Если у вас есть доступ к конфигуратору, действуйте системно — это быстрее, чем угадывание.

Первый шаг — точно воспроизвести ошибку и зафиксировать полный текст: модуль, строку, имя свойства. Если ошибка возникает на стороне сервера и пользователь видит только общее сообщение, смотрите технологический журнал или журнал регистрации — там есть полный стек вызовов.

Второй шаг — открыть указанную строку и определить выражение слева от точки. Дальше нужно понять, откуда эта переменная получила значение. Удобнее всего запустить отладку: поставьте точку останова на проблемной строке, воспроизведите ситуацию и посмотрите тип и значение переменной в табло. Если тип — «Неопределено», поднимайтесь по стеку вызовов до места, где значение формируется.

Третий шаг — исправление. Универсальный рецепт: добавить проверку перед обращением к свойству и предусмотреть поведение в «пустом» случае. Не ограничивайтесь подавлением ошибки — разберитесь, почему значение не пришло, иначе вы скроете симптом, а проблема вылезет в другом месте.

Порядок действий при отладке
  1. 1
    Сохраните полный текст ошибки: модуль, номер строки, имя свойства в скобках
  2. 2
    Откройте указанную строку в конфигураторе и найдите выражение слева от точки
  3. 3
    Поставьте точку останова и запустите отладку, воспроизведите ошибку
  4. 4
    В табло проверьте тип и значение переменной-виновника
  5. 5
    Проследите по стеку вызовов, где переменная получила неверное значение
  6. 6
    Добавьте проверку (Неопределено, Пустая(), Пустой()) и корректную обработку пустого случая
  7. 7
    Повторите сценарий и убедитесь, что ошибка устранена, а логика работает правильно

Примеры исправления кода

Ниже — типовые «до» и «после» для самых частых сценариев.

Небезопасный код с выборкой из запроса:

Запрос = Новый Запрос("ВЫБРАТЬ Сумма ИЗ Документ.Реализация ГДЕ Ссылка = &Ссылка");

Выборка = Запрос.Выполнить().Выбрать();

Сумма = Выборка.Сумма; // ошибка, если документа нет

Исправленный вариант:

Запрос = Новый Запрос("ВЫБРАТЬ Сумма ИЗ Документ.Реализация ГДЕ Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Сумма = Выборка.Сумма;

Иначе

Сумма = 0; // или сообщение пользователю

КонецЕсли;

Защита от Неопределено при вызове функции:

ДанныеКонтрагента = ПолучитьДанныеКонтрагента(Контрагент);

Если ДанныеКонтрагента = Неопределено Тогда

ВызватьИсключение "Не удалось получить данные контрагента";

КонецЕсли;

ИНН = ДанныеКонтрагента.ИНН;

bsl
Если НайденныйЭлемент.Пустая() Тогда
    Сообщить("Элемент не найден");
Иначе
    Наименование = НайденныйЭлемент.Наименование;
КонецЕсли;

Что делать пользователю без доступа к конфигуратору

Если вы работаете в типовой конфигурации и не занимаетесь программированием, ошибка всё равно часто решаема своими силами. Начните с простого: перезапустите программу и повторите действие. Если ошибка повторяется — проверьте данные, с которыми работаете.

Частая причина — незаполненные реквизиты в документе или справочнике, которые обрабатывает типовой алгоритм. Например, печатная форма падает, если у организации не заполнен ИНН или адрес. Откройте связанные карточки (контрагент, организация, договор, номенклатура) и проверьте обязательные поля, включая те, что не отмечены как обязательные, но используются в отчётах и печатных формах.

Второй типовой источник — «битые ссылки»: в документе указан элемент, который был удалён физически. В поле тогда отображается что-то вроде «Объект не найден». Замените такие значения на существующие элементы. Найти битые ссылки массово помогает штатная обработка «Поиск и удаление дублей» или групповое перепроведение.

Третий источник — кэш клиентского приложения. Если ошибка возникает только у одного пользователя на одном компьютере, очистите кэш: удалите базу из списка в окне запуска и добавьте заново, либо очистите папки кэша в каталоге пользователя. Персональные настройки отчётов тоже бывают повреждены — попробуйте сбросить настройки отчёта к стандартным кнопкой «Установить стандартные настройки».

Ошибка после обновления или в расширении

Если ошибка появилась сразу после обновления конфигурации, наиболее вероятны две причины. Первая — расширение конфигурации, несовместимое с новой версией: в типовом модуле изменилась сигнатура метода, а расширение обращается к старому варианту. Отключайте расширения по одному (Администрирование → Печатные формы, отчеты и обработки → Расширения) и проверяйте, исчезла ли ошибка.

Вторая причина — доработки в самой конфигурации, которые при обновлении встали поверх изменённых типовых модулей. Здесь поможет только сравнение и объединение с анализом изменённых методов — это работа для специалиста, который делал доработки.

Отдельный случай — обмены с внешними системами. После обновления формат данных обмена может измениться, и в интеграционный модуль приходят значения неожиданного типа. Проверьте журнал обмена и последние успешные сеансы: если ошибка совпадает с моментом обмена, копайте в сторону формата сообщений.

Маршрут решения

Как выбрать действие

Есть доступ к конфигуратору и текст ошибки с номером строкиОтлаживайте код: точка останова, проверка типа переменной, добавление защитных проверок
Ошибка у одного пользователя на одном компьютереОчистите кэш клиентского приложения и сбросьте персональные настройки отчётов
Ошибка началась сразу после обновленияПо очереди отключите расширения и проверьте доработанные модули
Ошибка при печати или формировании отчётаПроверьте заполненность реквизитов организации, контрагента и договора
В полях документов видно «Объект не найден»Замените битые ссылки на существующие элементы и перепроведите документы

Как проверить, что проблема решена

После исправления недостаточно того, что ошибка перестала появляться в одном сценарии. Повторите исходное действие на тех же данных, затем — на граничных случаях: пустом документе, документе без части реквизитов, новом элементе справочника. Если исправляли код — убедитесь, что «пустая» ветка логики теперь отрабатывает осмысленно: пользователь получает понятное сообщение, а не молчаливый ноль или пропуск данных.

Для пользовательских исправлений критерий прост: операция (проведение, печать, формирование отчёта) проходит до конца, а результат корректен — суммы сходятся, печатная форма заполнена. Если ошибка ушла, но данные в отчёте изменились или пропали, значит, была скрыта проблема в данных, и её нужно искать дальше.

Контрольные точки

Как проверить результат

Повторное выполнение операции
Норма

Операция завершается без сообщений об ошибке

Тревожный признак

Ошибка повторяется или появляется новая с другим текстом

Данные в результате
Норма

Суммы, реквизиты и строки соответствуют ожиданиям

Тревожный признак

Данные пропали, обнулились или дублируются

Поведение на пустых данных
Норма

Программа выдаёт понятное сообщение или корректное пустое значение

Тревожный признак

Та же ошибка на документе без реквизитов

Другие пользователи
Норма

У всех пользователей операция работает одинаково

Тревожный признак

Ошибка осталась у части пользователей — вероятен кэш или права

Типичные ошибки при самостоятельном исправлении

Первая ошибка — «заглушить» проблему конструкцией Попытка ... Исключение КонецПопытки; с пустым обработчиком. Ошибка визуально исчезает, но логика молча не выполняется: документы не проводятся полностью, данные теряются. Такой приём допустим только с осмысленной обработкой исключения и записью в журнал.

Вторая ошибка — исправлять симптом, а не причину. Если функция вернула Неопределено, добавление проверки в вызывающем коде решает проблему в одном месте, но та же функция вызывается из пяти других точек. Правильнее исправить саму функцию, чтобы она всегда возвращала определённое значение.

Третья ошибка — чистить данные и запускать сервисные обработки без резервной копии. Удаление «лишних» элементов справочника, на которые ссылаются документы, создаёт новые битые ссылки и новые экземпляры той же ошибки в других местах.

Типичные ошибки
01
Обёртывание кода в пустую Попытка/Исключение — ошибка скрывается, а логика молча не выполняется
02
Исправление только в точке падения вместо исправления функции-источника Неопределено
03
Удаление элементов справочников без проверки ссылок — появляются битые ссылки и новые ошибки
04
Сервисные операции без резервной копии — при неудаче данные не восстановить
05
Игнорирование стека вызовов — исправляется не та строка, где возникает значение, а та, где оно используется

FAQ

Может ли эта ошибка появиться из-за нехватки прав?

Напрямую — нет: при нехватке прав 1С выдаёт ошибку «Нарушение прав доступа». Но косвенно возможно: если из-за RLS запрос вернул пустой результат, а код не проверяет его, дальше возникнет «Значение не является значением объектного типа». Проверьте, повторяется ли ошибка под пользователем с полными правами.

Ошибка возникает только в тонком клиенте, а в толстом всё работает. Почему?

Часть объектных типов (например, некоторые объекты работы с файлами и COM) недоступна в тонком и веб-клиенте. Если код с такими объектами выполняется на клиенте, переменная остаётся Неопределено. Решение — перенести выполнение в серверную процедуру с директивой &НаСервере.

Поможет ли тестирование и исправление базы?

Только если причина — физическое повреждение данных или битые ссылки, а вы выбрали безопасные режимы. Ошибку в коде конфигурации или расширения тестирование не исправит. Всегда делайте резервную копию перед запуском и осторожно относитесь к режимам, удаляющим объекты с битыми ссылками.

Что означает, когда в скобках указано имя, которого нет в моём коде?

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

Может ли ошибка появляться из-за настроек отчёта на СКД?

Да. Если в пользовательских настройках отчёта сохранено поле или отбор, которого больше нет в схеме компоновки (после обновления конфигурации), отчёт может падать с подобной ошибкой. Сбросьте настройки отчёта к стандартным — в большинстве случаев это решает проблему.

Как быстро найти все места в коде, где может возникнуть такая ошибка?

Полного автоматического способа нет, но помогает расширенная проверка конфигурации (Конфигурация → Проверка конфигурации) — она выявляет обращения к несуществующим свойствам. Дополнительно ищите вызовы функций без Возврата во всех ветках и обращения к результатам запросов без проверки Пустой().

Итог

Что важно запомнить

Ошибка означает обращение к свойству у значения, которое не является объектом: Неопределено, примитив или пустая ссылка. Разработчику — читать модуль и строку из текста ошибки, отлаживать переменную слева от точки и добавлять проверки у источника значения. Пользователю — проверять заполненность реквизитов, битые ссылки, кэш и расширения после обновления. Перед любыми сервисными операциями с базой делайте резервную копию.