В процессе обмена данными между базами 1С, особенно если используется самописная схема обмена, часто возникает критическая проблема: справочник ИдентификаторыОбъектовМетаданных начинает «конфликтовать» с реальной структурой метаданных текущей базы. Это приводит к ошибкам вида «Объект не найден» при открытии журналов документов или справочников. Рассмотрим подробно, почему это происходит и как устранить данную неисправность.
Справочник ИдентификаторыОбъектовМетаданных — это системный справочник, который связывает внутренние ссылки 1С с именами объектов конфигурации. В каждой базе данных этот справочник должен быть уникальным и соответствовать метаданным конкретно этой базы. Основная причина ошибок заключается в том, что в процессе обмена данными идентификаторы из одной базы «переезжают» в другую. В результате база-приемник начинает ссылаться на GUID, которые для нее не являются валидными или дублируют существующие элементы, помеченные на удаление.
Самое первое и важное действие — это прекратить передачу данных справочника ИдентификаторыОбъектовМетаданных между базами. Если вы используете правила обмена (XML или Конвертация данных), обязательно проверьте, не включен ли этот справочник в список объектов для переноса.
Важно: этот справочник должен заполняться в каждой базе самостоятельно при запуске системы, обновлении конфигурации или выполнении обработчика ОбновитьДанныеИдентификацииОбъектовМетаданных. Нельзя позволять обмену «затирать» локальные настройки идентификаторов данными из другого узла системы.
Если справочник уже «засорен», в нем часто появляются дубли: один элемент помечен на удаление (битая ссылка), а второй является корректным. Чтобы система перестала выдавать ошибку, необходимо привести состояние данных в соответствие с текущей структурой метаданных.
Можно воспользоваться штатным механизмом обновления. Выполните программный вызов процедуры для принудительного пересчета идентификаторов:
// Выполнение обновления справочника ИдентификаторыОбъектовМетаданных
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеИдентификацииОбъектовМетаданных();
Если ошибка продолжает появляться, можно создать расширение конфигурации, которое будет проверять наличие необходимых элементов при открытии или в момент загрузки данных. Это позволит избежать падения системы при отсутствии нужного идентификатора.
Рассмотрим логику работы такого расширения:
ИдентификаторыОбъектовМетаданных, соответствующий имени метаданного.Пример подхода к проверке через расширение:
// Пример псевдокода для обработки отсутствия элемента
Функция ПолучитьИдентификаторОбъекта(ИмяОбъекта)
Идентификатор = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоНаименованию(ИмяОбъекта);
Если Идентификатор.Пустая() Тогда
// Создаем недостающий элемент, если его нет
ОбъектИД = Справочники.ИдентификаторыОбъектовМетаданных.СоздатьЭлемент();
ОбъектИД.Наименование = ИмяОбъекта;
ОбъектИД.Записать();
Возврат ОбъектИД.Ссылка;
КонецЕсли;
Возврат Идентификатор;
КонецФункции
Чтобы проблема не возвращалась, соблюдайте следующие правила:
ОбновитьВспомогательныеДанные.ИдентификаторыОбъектовМетаданных, это сигнал о неправильно настроенном фильтре в правилах обмена.Данный комплекс мер позволит вам избавиться от ошибки «Объект не найден» и обеспечит стабильную работу распределенной базы данных 1С.