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