Как исправить ошибку с идентификаторами объектов метаданных при добавлении роли через расширение в 1С?

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

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

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

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

Данная ошибка возникает по двум основным причинам:

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

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

Способ 1. Принудительное обновление вспомогательных данных БСП

Параметр командной строки /C ЗапуститьОбновлениеИнформационнойБазы инициирует процедуры обновления данных конфигурации, однако для объектов расширений регистрация в ряде версий требует отдельного вызова.

Для принудительного обновления идентификаторов расширений выполним программный запуск служебных методов во внешней обработке:


Справочники.ИдентификаторыОбъектовРасширений.ОбновитьДанныеСправочника(Истина);
Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();

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

Способ 2. Заимствование типовой роли вместо создания новой

Если версия БСП не поддерживает полноценную регистрацию новых ролей расширений в справочниках доступа, наиболее надежным решением является заимствование существующей роли.

Разберем данный подход по шагам:

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

Способ 3. Программное назначение роли пользователю

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

Посмотрим на пример программного добавления роли текущему пользователю информационной базы:


УстановитьПривилегированныйРежим(Истина);

ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ИмяНовойРоли = "Роль1";

Если Метаданные.Роли.Найти(ИмяНовойРоли) <> Неопределено Тогда
    РольОбъект = Метаданные.Роли[ИмяНовойРоли];
    Если Не ПользовательИБ.Роли.Содержит(РольОбъект) Тогда
        ПользовательИБ.Роли.Добавить(РольОбъект);
        ПользовательИБ.Записать();
    КонецЕсли;
КонецЕсли;

Способ 4. Добавление роли в основную конфигурацию

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

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

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

← На главную