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