Как исправить ошибку ОбъектМетаданныхПоИдентификатору при откате обновления 1С

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

Ситуация, когда после отката обновления конфигурации (например, 1С:Управление торговлей) пользователи начинают сталкиваться с ошибкой в функции ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору, является классической проблемой для систем, построенных на базе Библиотеки стандартных подсистем (БСП). Ошибка возникает из-за того, что в справочнике ИдентификаторыОбъектовМетаданных хранятся данные, которые больше не соответствуют фактической структуре конфигурации после её возврата к старой версии.

Рассмотрим подробно причины возникновения этой проблемы и разберем пошагово методы её решения — от самых простых до радикальных программных способов.

Почему возникает эта ошибка

Проанализируем механику работы БСП. Для оптимизации работы и обеспечения ссылочной целостности система не обращается к метаданным напрямую по имени в каждой операции. Вместо этого используется справочник ИдентификаторыОбъектовМетаданных. В нем каждому объекту (документу, справочнику, регистру) соответствует уникальный идентификатор (GUID).

Когда мы обновляем базу, система добавляет новые записи или обновляет существующие. Если же мы делаем откат конфигурации (путем загрузки старого файла .cf или восстановления из бэкапа только конфигурации), данные в справочнике идентификаторов остаются «от новой версии», а метаданные в конфигураторе — «от старой». Возникает конфликт: программный код ищет объект, который либо еще не существует, либо имеет другой внутренний идентификатор. Посмотрим, как это исправить.

Способ 1: Очистка кэша сервера и клиентских сеансов

Прежде чем приступать к манипуляциям с данными, выясним, не является ли проблема следствием кэширования. В клиент-серверном варианте работы соответствие объектов метаданных их идентификаторам может кэшироваться на стороне сервера 1С.

  1. Остановите службу 1C:Enterprise 8.3 Server Agent.
  2. Перейдите в папку с данными сервера (обычно это %ProgramFiles%\1cv8\srvinfo).
  3. Удалите содержимое папок snccntx и временные файлы внутри папок рабочих процессов (папки с длинными GUID-именами).
  4. Очистите локальный кэш пользователя на компьютере, где возникает ошибка (папки Local\1C и Roaming\1C).

Способ 2: Запуск с параметром обновления информационной базы

Попробуем заставить систему выполнить штатные процедуры обновления вспомогательных данных. Для этого в 1С предусмотрен специальный ключ запуска.

Разберем, как его прописать:

  1. В окне запуска 1С выберите нужную базу и нажмите Изменить.
  2. Перейдите на последнюю закладку настроек.
  3. В поле Дополнительные параметры запуска введите: /C ЗапуститьОбновлениеИнформационнойБазы (обратите внимание: ключ пишется через слеш, а параметр после /C — без пробелов в некоторых версиях, либо в кавычках).

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

Способ 3: Использование обработки ОбновлениеВспомогательныхДанных

В составе Библиотеки стандартных подсистем (БСП) есть специализированная внешняя обработка, предназначенная именно для таких случаев. Она называется ИнструментыРазработчика_ОбновлениеВспомогательныхДанных.epf.

Выполним следующие шаги:

  1. Найдите данную обработку в дистрибутиве БСП, версия которой соответствует вашей конфигурации (её можно скачать на портале техподдержки 1С).
  2. Запустите её в режиме 1С:Предприятие от имени администратора.
  3. В интерфейсе обработки выберите пункт, связанный с обновлением справочника идентификаторов объектов метаданных.
  4. Нажмите Выполнить обновление.

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

Способ 4: Программное принудительное обновление идентификаторов

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


// Вызывать в привилегированном режиме или под полными правами
ПараметрыОбновления = Справочники.ИдентификаторыОбъектовМетаданных.ПараметрыОбновленияДанных();
ПараметрыОбновления.ВыполнятьУдаление = Истина;
ПараметрыОбновления.ВыполнятьЗапись = Истина;

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(ПараметрыОбновления);

В некоторых версиях БСП сигнатура метода может отличаться. Проанализируем более простой, но эффективный вариант вызова, который часто помогает «протолкнуть» зависшее обновление:


Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(Истина, Истина);

Передача параметров Истина, Истина (в зависимости от версии БСП) означает «Обновить существующие» и «Удалить неактуальные». Это позволяет полностью переформировать справочник в соответствии с текущей конфигурацией .cf.

Способ 5: Исправление последствий ручного удаления (ошибка Объект не найден)

Частая ошибка администраторов — попытка вручную удалить «битую» строку из справочника ИдентификаторыОбъектовМетаданных. Это приводит к тому, что ссылки на этот идентификатор в других таблицах (например, в регистре настроек или прав доступа) превращаются в <Объект не найден>. Система продолжает искать этот GUID и выдает ошибку.

Если вы уже удалили строку и получили ошибку вида Идентификатор "<Объект не найден> (126:835d2068...)" не найден в справочнике, выполните следующее:

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

Пример кода для восстановления «битой» ссылки:


НовыйИдентификатор = Справочники.ИдентификаторыОбъектовМетаданных.СоздатьЭлемент();
// Устанавливаем ссылку, которую ожидает система
УникальныйИдентификатор = Новый УникальныйИдентификатор("c442c18c-a25d-11e9-835d-20689df427e9");
// Метод УстановитьСсылкуНового позволяет создать объект с конкретным GUID
НовыйИдентификатор.УстановитьСсылкуНового(Справочники.ИдентификаторыОбъектовМетаданных.ПолучитьСсылку(УникальныйИдентификатор));

НовыйИдентификатор.Наименование = "ИнойДокументПодтвержденияНДС";
НовыйИдентификатор.ПолноеИмя = "Документ.ИнойДокументПодтвержденияНДС";
НовыйИдентификатор.Имя = "ИнойДокументПодтвержденияНДС";
// Заполните остальные обязательные реквизиты согласно метаданным
НовыйИдентификатор.Записать();

Дополнительные рекомендации

Проанализируем еще несколько моментов, которые могут мешать исправлению ситуации:

Используя предложенные методы в комплексе, вы сможете восстановить работоспособность базы после неудачного обновления и устранить ошибки обращения к метаданным.

← На главную