Как добавить объекты метаданных из расширения в справочник «Идентификаторы объектов метаданных»?

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

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

Выясняем причину: почему объекты расширения «невидимы»

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

  1. Версия БСП: Полноценная поддержка расширений в этом справочнике появилась только в БСП 3.0 и выше. В версиях 2.x механизмы обновления идентификаторов просто игнорируют объекты, принадлежащие расширениям.
  2. Ограничения платформы: В версиях платформы ниже 8.3.15 объекты расширений не могли выступать источниками для подписок на события, определенных в основной конфигурации. Если БСП пытается «навесить» свои стандартные обработчики на ваш новый документ из расширения, система выдает ошибку.
  3. Режим совместимости: Если конфигурация работает в режиме совместимости (например, 8.3.10 или 8.3.12), многие современные механизмы работы с метаданными расширений блокируются на уровне ядра платформы.

Диагностика проблемы при обновлении

Часто проблема проявляется не сразу, а при попытке обновления. Разберем ситуацию: вы добавили документ в расширение, все работает, но при запуске системы с параметром /C ЗапуститьОбновлениеИнформационнойБазы происходит аварийное завершение. Это происходит потому, что подсистема «Обновление информационной базы» вызывает метод:

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

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

Решение для старых версий конфигураций (БСП 2.4 и ниже)

Если ваша конфигурация (например, УТ 11.3 или ранние версии УТ 11.4) использует старую БСП, у вас есть два основных пути:

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

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

Решение для современных версий (БСП 3.0+ и Платформа 8.3.15+)

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

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

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

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

Проблема с подписками на события

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

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

Как поступить:
В современных версиях платформы создайте собственную подписку на событие прямо в расширении. В качестве источника укажите ваш новый объект из этого же расширения, а в качестве обработчика — процедуру из модуля расширения. Это позволит соблюсти требования целостности данных, не ломая логику основной конфигурации.

Работа с кэшем метаданных

Иногда идентификаторы не появляются из-за банального кэширования. Рассмотрим алгоритм «чистки» для исправления ситуации:

  1. Завершите все сеансы работы с базой.
  2. Очистите серверный кэш (папка reg_1541 на сервере 1С).
  3. Выполните запуск системы с параметром AllowExecuteScheduledJobs -Force.
  4. В некоторых случаях помогает временное отключение расширения, запуск базы, закрытие и повторное включение расширения с последующим обновлением.

Заключение

Мы проанализировали проблему добавления идентификаторов объектов расширений и пришли к выводу, что основной корень зла кроется в версиях БСП. Если вы работаете на устаревших редакциях (УТ 11.3, ЗиКГУ 3.1.3), добавление новых типов данных через расширения будет постоянно вызывать конфликты со справочником идентификаторов. В таких случаях рекомендуется миграция на актуальные версии БСП (3.1+) или перенос структуры данных в основную конфигурацию. В современных же версиях достаточно следить за актуальностью ролей и корректно вызывать процедуру ОбновитьДанныеСправочника.

← На главную