При переносе данных между информационными базами или после доработки типовых конфигураций пользователи могут столкнуться с ошибкой: «Значение не является значением объектного типа (Реквизиты)». Чаще всего сбой происходит при попытке провести, отменить проведение или установить пометку на удаление для документов (например, ведомостей на выплату зарплаты через банк).
Разберем детально, почему возникает данное исключение платформы 1С:Предприятие и как гарантированно устранить неполадку несколькими проверенными способами.
Проанализируем ключевые факторы, приводящие к сбою обращения к свойству объекта:
Реквизиты, это имя перекрывает стандартные контексты платформы и подсистем БСП (Библиотеки Стандартных Подсистем). Когда типовой алгоритм пытается обратиться к внутренней коллекции свойств, вместо структуры возвращается прикладной реквизит (значение которого пусто или имеет примитивный тип), что вызывает исключение.ПередЗаписью, ПриУстановкеПометкиУдаления и общие подписки на события. Если ключевые реквизиты (банк, зарплатный проект, организация) содержат ссылку вида «Объект не найден», функции чтения связанных параметров возвращают Неопределено.ДополнительныеРеквизиты.Рассмотрим основной способ решения, если в конфигурацию вносились изменения или переносились доработанные объекты. Выясним, нет ли реквизита с именем, дублирующим системные свойства.
ВедомостьНаВыплатуЗарплатыВБанк).Реквизиты, переименуем его во избежание конфликтов (например, в БанковскиеРеквизиты или РеквизитыПлатежа) либо удалим, если он больше не используется.Если ведомости или другие документы требуется срочно удалить из базы, минуя срабатывание типовых обработчиков и подписок на события, воспользуемся внешней обработкой со свойством ОбменДанными.Загрузка.
Разберем программный код для безопасной пометки объекта на удаление:
// Пример пометки документа на удаление в режиме загрузки данных
СсылкаНаДокумент = Документы.ВедомостьНаВыплатуЗарплатыВБанк.НайтиПоНомеру("0000-000001", ТекущаяДата());
Если ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.ПометкаУдаления = Истина;
ДокументОбъект.Записать();
КонецЕсли;
Если объект необходимо удалить физически без помещения в корзину помеченных объектов, применим метод Удалить():
// Пример непосредственного удаления некорректного объекта
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.Удалить();
Установка флага ОбменДанными.Загрузка = Истина полностью блокирует выполнение кода в событиях ПередЗаписью и общих модулях контроля, что позволяет безопасно очистить базу от поврежденных данных.
Если ошибка вызвана нарушением ссылочной целостности после переноса данных, выполним системное тестирование базы:
Если точное место возникновения сбоя неизвестно, локализуем строку с ошибкой:
Неопределено.При переносе конфигураций и обновлении метаданных клиентское приложение может сохранять устаревшую структуру кэша. Для устранения остаточных сбоев закроем сеансы 1С и удалим временные каталоги из папок пользователя %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8, после чего заново добавим базу в список запуска.