Ошибка «Значение не является значением объектного типа» в 1С¶
«Значение не является значением объектного типа» — сообщение об ошибке, возникающее в системе программирования 1С:Предприятие при попытке присвоить или использовать значение, тип которого не соответствует ожидаемому типу объекта (реквизита, переменной, поля табличной части и т. д.). Ошибка относится к категории «Недопустимое значение» (исключение типа ЗначениеНеСоответствуетТипу) и сопровождается указанием строки модуля, где произошёл сбой.
¶Причины возникновения
Наиболее частые причины ошибки:
- Присваивание значения неподходящего типа. Например, попытка записать строку в реквизит типа
Число, дату в реквизит типаСтрокаили объект справочника в реквизит типаБулево. - Попытка передать «ПустоеЗначение» или
Неопределенов реквизит, для которого запрещено пустое значение. Если в конфигураторе у реквизита снят флаг «Допускать пустое значение», присваиваниеНеопределеновызывает ошибку. - Некорректная работа с датами. Попытка присвоить дату, не входящую в допустимый диапазон типов
Дата(например, «00010101» при настройке границ типа), либо передача строки вместо даты. - Ошибка при передаче значений через
Знач Параметрв процедурах и функциях. Если формальный параметр объявлен с типом, а вызывающий код передаёт значение другого типа, платформа выдаёт именно это исключение. - Несоответствие типов в запросах и выборках. Присваивание поля выборки запроса реквизиту объекта, тип которого не совпадает с типом поля (например, поле
Строкав реквизит типаСправочникСсылка.Номенклатура). - Работа с внешними источниками данных (XDTO, веб-сервисы, файлы). Десериализованное значение может иметь тип, отличный от ожидаемого.
¶Как исправить
¶Проверка типа перед присваиванием
Перед записью значения в реквизит или переменную следует убедиться в совпадении типов. В языке 1С для этого используется оператор ТипЗнч() и метод Тип():
``1c Если ТипЗнч(Значение) = Тип("Строка") Тогда Объект.Наименование = Значение; Иначе Объект.Наименование = Строка(Значение); КонецЕсли; ``
¶Преобразование значения
Для приведения значения к нужному типу применяются функции Число(), Строка(), Дата(), Булево(). Перед преобразованием рекомендуется обернуть вызов в конструкцию Попытка ... Исключение ... КонецПопытки, чтобы исключить ошибку при невозможности приведения:
``1c Попытка Объект.Сумма = Число(СтрокаСуммы); Исключение ОбщегоНазначения.СообщитьПользователю("Некорректная сумма"); КонецПопытки; ``
¶Проверка на пустое значение
Перед присваиванием значения в реквизит без флага «Допускать пустое значение» необходимо проверять, не является ли источник пустым:
``1c Если Значение <> Неопределено И Значение <> NULL Тогда Объект.Контрагент = Значение; КонецЕсли; ``
Или использовать ЗначениеЗаполнено():
``1c Если ЗначениеЗаполнено(Значение) Тогда Объект.Контрагент = Значение; КонецЕсли; ``
¶Проверка метаданных
Если ошибка возникает при обмене данными или обработке загрузки, стоит сверить описания типов реквизитов в конфигураторе: раздел «Метаданные» → объект → «Реквизиты» → колонка «Тип». Часто проблема возникает из-за того, что в описании типов реквизита указан один тип, а в коде передаётся значение другого, например, при использовании вложенных справочников или перечислений.
¶Обновление и доработка конфигурации
В ряде случаев ошибка вызвана несоответствием между типом реквизита, объявленным в метаданных, и типом значения, формируемым стандартным подсистемным модулем (например, при обновлении ИБ). В таком случае помогает:
- запуск обработки «Обновление информационной базы»;
- проверка обновляемости конфигурации до актуальной версии поставщика;
- сверка состава типов реквизита с типом, формируемым в модуле формирования значения.
¶Типичные сценарии
| Сценарий | Причина | Решение |
|---|---|---|
| Загрузка из Excel через ВК | Строковое значение передаётся в реквизит типа Число | Использовать Число() с обработкой исключения |
| Обмен с сайтом (XDTO) | Поле веб-сервиса имеет иной тип, чем реквизит объекта | Сверить описания типов в схеме XDTO и метаданных |
| Заполнение табличной части | В колонку с типом Дата попадает строка | Преобразовать через Дата() или исправить источник данных |
| Проведение документа | Движение получает значение из выборки запроса с другим типом | Добавить приведение типа в запросе или в коде формирования движений |
¶Рекомендации по профилактике
- Объявлять в описании типов реквизита только реально используемые типы, избегая избыточных.
- Использовать типовые обёртки (например,
ОбщегоНазначенияКлиентСервер.ЗначениеВМассивеи подобные) для единообразной обработки значений. - При разработке обработчиков обмена данными применять проверку
ЗначениеЗаполнено()иТипЗнч()до присваивания. - Включать в модулях подробное журналирование передаваемых значений при отладке, чтобы точно определить источник некорректного значения.
Источники:
- Техническая документация 1С:Предприятие 8.3 (ИТС)
- Справка по языку встроенных средств 1С:Предприятие
- Методические рекомендации по разработке конфигураций 1С:Предприятие 8
