При переходе на новые версии программ или при регулярном обмене данными между старыми редакциями (например, Зарплата и Управление Персоналом 2.5) и актуальными конфигурациями (Бухгалтерия предприятия 3.0), пользователи часто сталкиваются с неприятными сюрпризами. Один из самых коварных — ошибка «Значение не является значением объектного типа», которая возникает не в момент самой загрузки, а при попытке открыть раздел с документами. Разберем детально, почему это происходит и как нам вместе решить эту задачу.
Прежде всего, проанализируем природу данной ошибки. В терминах платформы 1С:Предприятие это означает, что программный код пытается обратиться к свойству или методу через точку (например, Объект.Наименование), но в переменной Объект вместо ссылки на справочник или документ находится что-то другое: Неопределено, Null, число или пустая строка.
Рассмотрим ситуацию: данные из ЗУП 2.5 успешно выгружены и даже загружены в БП 3.0 без системных сообщений об ошибках. Однако при открытии списка ведомостей форма «падает». Это сигнализирует о том, что проблема кроется в динамическом списке или в процедурах ПриСозданииНаСервере и ПриПолученииДанныхНаСервере.
Часто причина кроется не в самих данных, а в том, как система пытается их отобразить. Пользователи могут настраивать свои формы: добавлять колонки, группировки или условное оформление. Если структура данных изменилась после обновления или некорректного обмена, старые настройки «зависают» и вызывают программный сбой.
Выполним следующие шаги для очистки настроек:
Документ.ВедомостьНаВыплатуЗарплатыВБанк.ФормаСписка).Проанализируем результат: если форма открылась, значит, проблема была в пользовательских «хвостах». Если нет — двигаемся дальше.
Посмотрим на ситуацию со стороны данных. При обмене из ЗУП 2.5 в БП 3.0 переносятся ссылки на подразделения, сотрудников и физических лиц. Если в правилах обмена произошел сбой или какой-то объект был удален в одной базе, но остался в другой, в БП 3.0 может появиться запись вида <Объект не найден> (80:898...).
Когда динамический список пытается программно обработать такую ссылку (например, чтобы определить картинку состояния документа или вывести реквизит через точку), возникает наша ошибка. Выясним причину через Тестирование и исправление:
После завершения процесса попробуем снова зайти в раздел ведомостей.
Как упоминалось в обсуждении на форуме, «продувка» кэша — это стандартный гигиенический запуск диагностики. Локальный кэш конфигурации может содержать устаревшие метаданные формы.
Рассмотрим самый надежный способ очистки кэша — удаление базы из списка:
Это заставит платформу создать новую папку для временных файлов кэша, что исключит влияние старых ошибок компиляции форм.
В современных реалиях 1С:Бухгалтерия 3.0 редко обходится без расширений (печатные формы, интеграции с банками, доработки под специфику бизнеса). Если расширение «подцепляется» к процедурам формы списка ведомостей, оно может ожидать наличия определенных данных, которые не пришли из ЗУП 2.5.
Выполним проверку:
Если ошибка исчезла, значит, необходимо передать расширение программисту на адаптацию под текущий релиз БП 3.0.
Если простые методы не помогли, нам придется «погрузиться под капот». Скорее всего, ошибка возникает в общем модуле, который отвечает за оформление списков. Проанализируем типичный фрагмент кода, на котором может споткнуться программа:
// Пример проблемного участка в общем модуле
Процедура ПриВыводеДанных(ОформлениеСтроки, ДанныеСтроки)
// Если ДанныеСтроки.Ссылка.СпособВыплаты = Неопределено,
// то следующая строка вызовет ошибку "Значение не является значением объектного типа"
Если ДанныеСтроки.Ссылка.СпособВыплаты.ИмяПредопределенногоЗначения = "ЧерезКассу" Тогда
// Логика обработки
КонецЕсли;
КонецПроцедуры
Чтобы найти точное место, воспользуемся Отладчиком:
Чаще всего в таких случаях мы увидим, что реквизит СпособВыплаты или ВидДоходаИсполнительногоПроизводства (актуально для новых релизов) имеет значение Null, так как ЗУП 2.5 просто «не знает» о существовании таких полей и не заполняет их при выгрузке. Программисту потребуется дописать правила обмена или создать обработку, которая заполнит недостающие реквизиты в уже загруженных документах по умолчанию.
Ошибка «Значение не является значением объектного типа» в 90% случаев при обмене данными — это сигнал о «пустоте» там, где программа ожидает «объект». Начните с очистки настроек пользователя и кэша, проверьте базу на «битые» ссылки, и если это не поможет — используйте отладчик для поиска незаполненного реквизита, который пришел из старой версии ЗУП.