Как исправить ошибку «Значение не является значением объектного типа (ПолноеИмя)» в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе в типовых конфигурациях 1С (таких как 1С:Бухгалтерия, 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей), использующих Библиотеку Стандартных Подсистем (БСП), пользователи и администраторы могут столкнуться с внезапным аварийным завершением работы регламентных заданий. В журнале регистрации при этом фиксируется ошибка следующего вида:

{ОбщийМодуль.ВерсионированиеОбъектов.Модуль(1034)}: Значение не является значением объектного типа (ПолноеИмя)

В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем механизм работы подсистемы версионирования и Центра мониторинга, а также рассмотрим три практических способа полного устранения проблемы.

Выясняем причину возникновения ошибки

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


МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("КоличествоВерсийОбъекта." + ОбъектМетаданных.ПолноеИмя(), Выборка.Количество);

Ошибка «Значение не является значением объектного типа» указывает на то, что переменная, стоящая слева от точки (в нашем случае это ОбъектМетаданных), не содержит ожидаемого объекта метаданных. Вместо этого в ней хранится значение Неопределено или пустая ссылка. Попытка вызвать метод ПолноеИмя() у пустого значения и приводит к аварийному завершению работы регламентного задания.

Почему же переменная ОбъектМетаданных оказывается пустой? Механизм сбора статистики работает по следующему алгоритму:

  1. Регламентное задание обращается к регистру сведений ВерсииОбъектов, где хранятся истории изменений документов и справочников базы данных.
  2. Система группирует записи регистра по типам версионируемых объектов, чтобы подсчитать их общее количество.
  3. Для каждого найденного типа объектов система пытается получить соответствующий объект метаданных в текущей конфигурации.
  4. Если в метаданных конфигурации данный объект существует (например, документ РеализацияТоваровУслуг), система успешно получает его свойства и вызывает метод ПолноеИмя().
  5. Если объект ранее существовал в конфигурации (например, это был доработанный документ _ДемоСписание или объект старой версии БСП), но затем был удален разработчиками при обновлении или изменении конфигурации, то в регистре сведений ВерсииОбъектов остаются «осиротевшие» (битые) записи.
  6. При попытке сопоставить битую ссылку из регистра с актуальным деревом метаданных система возвращает значение Неопределено. Происходит обращение к несуществующему методу, и программа выдает ошибку.

Теперь, когда мы детально разобрали причину сбоя, перейдем к методам его исправления. Мы подготовили три различных сценария решения проблемы: от простого администрирования до внесения изменений в код.

Способ 1. Очистка устаревших и «битых» данных в базе (Рекомендуемый)

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

Перед выполнением любых административных процедур обязательно создайте резервную копию базы данных (бэкап)!

Выполним тестирование и исправление информационной базы по шагам:

  1. Запустим информационную базу в режиме Конфигуратор с правами администратора.
  2. Откроем главное меню и перейдем в раздел Администрирование — Тестирование и исправление...
  3. В открывшемся окне настроек установим флажки напротив следующих проверок:
    • Проверка логической целостности информационной базы
    • Проверка ссылочной целостности информационной базы
  4. В блоках выбора действий при наличии ошибок установим переключатели в следующие положения:
    • При наличии ссылок на несуществующие объекты: Очищать объекты (или Создавать деблокированные объекты с последующим их удалением).
    • При частичной потере данных объектов: Очищать объекты.
  5. Нажмем кнопку Выполнить и дождемся завершения процесса. Время тестирования напрямую зависит от объема базы данных.

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

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


НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
// В реальном сценарии мы можем сделать выборку записей с битыми ссылками 
// и точечно удалить только их, чтобы не очищать историю версий нужных объектов.

Способ 2. Обход ошибки в коде через механизм Расширений

Если у нас нет возможности монопольно запустить тестирование базы данных (например, в системе круглосуточно работают пользователи), либо если мы хотим гарантировать, что данная ошибка никогда больше не повторится при будущих удалениях объектов, мы можем доработать код общего модуля.

Чтобы не снимать конфигурацию с поддержки, мы воспользуемся механизмом Расширений конфигурации. Нам необходимо перехватить выполнение процедуры сбора статистики и добавить проверку на пустое значение.

Рассмотрим по шагам, как реализовать этот обход:

  1. Откроем конфигуратор, перейдем в меню Конфигурация — Расширения конфигурации и добавим новое расширение (например, с именем ИсправлениеЦентраМониторинга). Укажем назначение: Адаптация.
  2. Найдем в основной конфигурации общий модуль ВерсионированиеОбъектов, кликнем по нему правой кнопкой мыши и выберем пункт Добавить в расширение.
  3. В расширении откроем модуль ВерсионированиеОбъектов и найдем строку, вызывающую ошибку (примерно 1034-я строка).
  4. Применим директиву изменения метода &Вместо или напишем перехватчик с директивой &ИзменениеИКонтроль. Ниже представлен безопасный код, который мы должны внедрить:

&Вместо("ПриСбореПоказателейСтатистикиКонфигурации")
Процедура Расш_ПриСбореПоказателейСтатистикиКонфигурации()
    // ... [оригинальный код выборки данных из регистра] ...
    
    // Перед вызовом метода ПолноеИмя() обязательно делаем проверку:
    Если ОбъектМетаданных <> Неопределено Тогда
        МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации(
            "КоличествоВерсийОбъекта." + ОбъектМетаданных.ПолноеИмя(), 
            Выборка.Количество
        );
    Иначе
        // Мы можем зафиксировать данное событие в Журнале регистрации для информации
        ЗаписьЖурналаРегистрации("ВерсионированиеОбъектов.Предупреждение",
            УровеньЖурналаРегистрации.Предупреждение,
            , ,
            "Обнаружена устаревшая версия объекта, удаленного из метаданных.");
    EndIf;
    
    // ... [оставшаяся часть оригинального алгоритма] ...
КонецПроцедуры

Такая простая проверка полностью исключает падение регламентного задания. Система проигнорирует удаленные объекты метаданных и продолжит корректный сбор статистики по всем остальным объектам.

Способ 3. Отключение автоматической отправки статистики

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

Для отключения выполним следующие действия в режиме «1С:Предприятие»:

  1. Войдем в базу под учетной записью с правами Администратора системы.
  2. Перейдем в раздел меню Администрирование — Настройки программы — Конфиденциальность (в некоторых конфигурациях этот пункт может называться Интернет-поддержка и услуги или находиться в подразделе Настройки работы с порталом).
  3. Найдем опцию, отвечающую за автоматическую отправку отчетов об ошибках и сбор статистики использования конфигурации в компанию «1С».
  4. Снимем соответствующий флажок (отключим опцию разрешения отправки данных).
  5. Сохраним настройки.

После отключения отправки статистики регламентное задание Центра мониторинга перестанет инициировать процедуру ПриСбореПоказателейСтатистикиКонфигурации, и ошибка больше не побеспокоит пользователей.

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

← На главную