При настройке прав доступа на уровне записей (RLS) в «1С:Управление торговлей 11» и других типовых конфигурациях на базе БСП часто возникает задача: определить, какие именно значения доступа (например, группы партнеров) разрешены конкретному пользователю. Ситуация усложняется тем, что в группах доступа может быть выбрано правило «Все запрещены, кроме», а пользователи могут входить в группы доступа как напрямую, так и через группы пользователей.
Разберем подробно возможные подходы к решению этой задачи: от простого запроса в контексте текущего сеанса до прямого анализа служебных регистров подсистемы «Управление доступом» БСП.
Если задача состоит в том, чтобы получить список доступных групп партнеров для текущего авторизованного пользователя, самым простым и надежным решением является стандартный запрос с ключевым словом РАЗРЕШЕННЫЕ. Платформа 1С самостоятельно применит все действующие шаблоны RLS и отсечет недоступные элементы.
Посмотрим на пример запроса к справочнику ГруппыДоступаПартнеров:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ГруппыДоступаПартнеров.Ссылка КАК Ссылка
|ИЗ
| Справочник.ГруппыДоступаПартнеров КАК ГруппыДоступаПартнеров";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка разрешенной группы партнеров
КонецЦикла;
Проанализируем особенности и ограничения этого способа:
УстановитьПривилегированныйРежим(Истина)), конструкция РАЗРЕШЕННЫЕ игнорируется, и запрос вернет все существующие элементы справочника без фильтрации.Если необходимо программно выяснить список разрешенных групп для произвольного пользователя (не переключая сеанс), прямой запрос к табличным частям справочника ГруппыДоступа не даст корректного результата. В архитектуре БСП пользователи могут входить в группы доступа косвенно — через Справочник.ГруппыПользователей, а актуальные связи хранятся в специальных регистрах сведений.
Разберем по шагам, как устроена схема хранения ограничений в подсистеме БСП:
РегистрСведений.СоставыГруппПользователей (учитываются записи с флагом Используется = ИСТИНА).РегистрСведений.ЗначенияГруппДоступаПоУмолчанию в поле ВсеРазрешены.РегистрСведений.ЗначенияГруппДоступа.При этом важно помнить правило объединения: если пользователь включен в несколько групп доступа, их права объединяются по логическому ИЛИ. Если хотя бы в одной действующей группе доступа для пользователя вид доступа не ограничен вовсе или конкретная группа разрешена, пользователь получит к ней доступ.
Рассмотрим пример запроса, выбирающего разрешенные значения для правила «Все запрещены, кроме» для произвольного пользователя:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗначенияГруппДоступа.ЗначениеДоступа КАК ГруппаПартнеров
|ИЗ
| РегистрСведений.СоставыГруппПользователей КАК СоставыГрупп
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
| ПО СоставыГрупп.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ПоУмолчанию
| ПО ГруппыДоступаПользователи.Ссылка = ПоУмолчанию.ГруппаДоступа
| И (ПоУмолчанию.ВсеРазрешены = ЛОЖЬ)
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа
| ПО ГруппыДоступаПользователи.Ссылка = ЗначенияГруппДоступа.ГруппаДоступа
| И (ЗначенияГруппДоступа.ТипЗначенийДоступа = ТИП(Справочник.ГруппыДоступаПартнеров))
|ГДЕ
| СоставыГрупп.Пользователь = &Пользователь
| И СоставыГрупп.Используется = ИСТИНА
| И НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления";
Запрос.УстановитьПараметр("Пользователь", НужныйПользователь);
Результат = Запрос.Выполнить();
ТаблицаРазрешенных = Результат.Выгрузить();
В типовых конфигурациях для анализа и проверки прав без написания прямых запросов к служебным регистрам можно использовать методы общего модуля УправлениеДоступом:
УправлениеДоступом.ГруппыЗначенийДоступаРазрешающиеИзменениеЗначенийДоступа(...) возвращает массив групп или значение Неопределено, если вид доступа не ограничен.