При работе в типовых конфигурациях 1С (таких как 1С:Бухгалтерия, 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей), использующих Библиотеку Стандартных Подсистем (БСП), пользователи и администраторы могут столкнуться с внезапным аварийным завершением работы регламентных заданий. В журнале регистрации при этом фиксируется ошибка следующего вида:
{ОбщийМодуль.ВерсионированиеОбъектов.Модуль(1034)}: Значение не является значением объектного типа (ПолноеИмя)
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем механизм работы подсистемы версионирования и Центра мониторинга, а также рассмотрим три практических способа полного устранения проблемы.
Давайте проанализируем стек вызовов, приведенный в исходном сообщении, чтобы понять физический смысл сбоя. Ошибка происходит в общем модуле ВерсионированиеОбъектов в тот момент, когда система пытается собрать статистику для Центра мониторинга:
МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации("КоличествоВерсийОбъекта." + ОбъектМетаданных.ПолноеИмя(), Выборка.Количество);
Ошибка «Значение не является значением объектного типа» указывает на то, что переменная, стоящая слева от точки (в нашем случае это ОбъектМетаданных), не содержит ожидаемого объекта метаданных. Вместо этого в ней хранится значение Неопределено или пустая ссылка. Попытка вызвать метод ПолноеИмя() у пустого значения и приводит к аварийному завершению работы регламентного задания.
Почему же переменная ОбъектМетаданных оказывается пустой? Механизм сбора статистики работает по следующему алгоритму:
ВерсииОбъектов, где хранятся истории изменений документов и справочников базы данных.РеализацияТоваровУслуг), система успешно получает его свойства и вызывает метод ПолноеИмя()._ДемоСписание или объект старой версии БСП), но затем был удален разработчиками при обновлении или изменении конфигурации, то в регистре сведений ВерсииОбъектов остаются «осиротевшие» (битые) записи.Неопределено. Происходит обращение к несуществующему методу, и программа выдает ошибку.Теперь, когда мы детально разобрали причину сбоя, перейдем к методам его исправления. Мы подготовили три различных сценария решения проблемы: от простого администрирования до внесения изменений в код.
Самый правильный и экологичный путь решения проблемы — устранить первопричину, то есть удалить из базы данных «мусорные» записи по объектам метаданных, которых больше не существует в конфигурации. Для этого мы можем воспользоваться встроенными инструментами платформы 1С.
Перед выполнением любых административных процедур обязательно создайте резервную копию базы данных (бэкап)!
Выполним тестирование и исправление информационной базы по шагам:
Проверка логической целостности информационной базыПроверка ссылочной целостности информационной базыПосле завершения тестирования платформа автоматически очистит регистр сведений ВерсииОбъектов от записей, ссылающихся на несуществующие метаданные. Ошибка при сборе статистики пропадет.
Если тестирование всей базы занимает слишком много времени, можно воспользоваться специализированной внешней обработкой «Поиск и замена дублей» или написать простой программный скрипт для очистки конкретно регистра ВерсииОбъектов через консоль кода:
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
// В реальном сценарии мы можем сделать выборку записей с битыми ссылками
// и точечно удалить только их, чтобы не очищать историю версий нужных объектов.
Если у нас нет возможности монопольно запустить тестирование базы данных (например, в системе круглосуточно работают пользователи), либо если мы хотим гарантировать, что данная ошибка никогда больше не повторится при будущих удалениях объектов, мы можем доработать код общего модуля.
Чтобы не снимать конфигурацию с поддержки, мы воспользуемся механизмом Расширений конфигурации. Нам необходимо перехватить выполнение процедуры сбора статистики и добавить проверку на пустое значение.
Рассмотрим по шагам, как реализовать этот обход:
ИсправлениеЦентраМониторинга). Укажем назначение: Адаптация.ВерсионированиеОбъектов, кликнем по нему правой кнопкой мыши и выберем пункт Добавить в расширение.ВерсионированиеОбъектов и найдем строку, вызывающую ошибку (примерно 1034-я строка).&Вместо или напишем перехватчик с директивой &ИзменениеИКонтроль. Ниже представлен безопасный код, который мы должны внедрить:
&Вместо("ПриСбореПоказателейСтатистикиКонфигурации")
Процедура Расш_ПриСбореПоказателейСтатистикиКонфигурации()
// ... [оригинальный код выборки данных из регистра] ...
// Перед вызовом метода ПолноеИмя() обязательно делаем проверку:
Если ОбъектМетаданных <> Неопределено Тогда
МодульЦентрМониторинга.ЗаписатьСтатистикуОбъектаКонфигурации(
"КоличествоВерсийОбъекта." + ОбъектМетаданных.ПолноеИмя(),
Выборка.Количество
);
Иначе
// Мы можем зафиксировать данное событие в Журнале регистрации для информации
ЗаписьЖурналаРегистрации("ВерсионированиеОбъектов.Предупреждение",
УровеньЖурналаРегистрации.Предупреждение,
, ,
"Обнаружена устаревшая версия объекта, удаленного из метаданных.");
EndIf;
// ... [оставшаяся часть оригинального алгоритма] ...
КонецПроцедуры
Такая простая проверка полностью исключает падение регламентного задания. Система проигнорирует удаленные объекты метаданных и продолжит корректный сбор статистики по всем остальным объектам.
Если сбор статистики Центром мониторинга не является критически важной функцией для вашей компании (в большинстве случаев эта статистика отправляется разработчикам фирмы «1С» для анализа стабильности систем), вы можете просто отключить этот функционал в настройках программы.
Для отключения выполним следующие действия в режиме «1С:Предприятие»:
Интернет-поддержка и услуги или находиться в подразделе Настройки работы с порталом).После отключения отправки статистики регламентное задание Центра мониторинга перестанет инициировать процедуру ПриСбореПоказателейСтатистикиКонфигурации, и ошибка больше не побеспокоит пользователей.
Мы рекомендуем использовать Способ 1 для поддержания базы данных в чистом и оптимизированном состоянии, а Способ 2 — в качестве надежной страховки на будущее, особенно если ваша конфигурация находится в процессе активной разработки и частых обновлений метаданных.