Как в 1С:УТ 11 программно или запросом получить список разрешенных групп партнеров для пользователя

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

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

Разберем подробно возможные подходы к решению этой задачи: от простого запроса в контексте текущего сеанса до прямого анализа служебных регистров подсистемы «Управление доступом» БСП.

Способ 1. Получение разрешенных значений через конструкцию ВЫБРАТЬ РАЗРЕШЕННЫЕ

Если задача состоит в том, чтобы получить список доступных групп партнеров для текущего авторизованного пользователя, самым простым и надежным решением является стандартный запрос с ключевым словом РАЗРЕШЕННЫЕ. Платформа 1С самостоятельно применит все действующие шаблоны RLS и отсечет недоступные элементы.

Посмотрим на пример запроса к справочнику ГруппыДоступаПартнеров:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |	ГруппыДоступаПартнеров.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ГруппыДоступаПартнеров КАК ГруппыДоступаПартнеров";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    // Обработка разрешенной группы партнеров
КонецЦикла;

Проанализируем особенности и ограничения этого способа:

  1. Запрос вернет список только для текущего сеанса. Вы не сможете передать ссылку на другого произвольного пользователя в качестве параметра, так как RLS накладывается платформой автоматически по данным текущего пользователя.
  2. Если запрос выполняется с установленным привилегированным режимом (например, в регламентном задании или при вызове процедуры УстановитьПривилегированныйРежим(Истина)), конструкция РАЗРЕШЕННЫЕ игнорируется, и запрос вернет все существующие элементы справочника без фильтрации.

Способ 2. Запрос к регистрам БСП для произвольного пользователя

Если необходимо программно выяснить список разрешенных групп для произвольного пользователя (не переключая сеанс), прямой запрос к табличным частям справочника ГруппыДоступа не даст корректного результата. В архитектуре БСП пользователи могут входить в группы доступа косвенно — через Справочник.ГруппыПользователей, а актуальные связи хранятся в специальных регистрах сведений.

Разберем по шагам, как устроена схема хранения ограничений в подсистеме БСП:

  1. Связь пользователей и групп пользователей хранится в регистре РегистрСведений.СоставыГруппПользователей (учитываются записи с флагом Используется = ИСТИНА).
  2. Базовое правило группы («Все разрешены, кроме» или «Все запрещены, кроме») хранится в регистре РегистрСведений.ЗначенияГруппДоступаПоУмолчанию в поле ВсеРазрешены.
  3. Явные исключения (разрешенные значения при правиле «Все запрещены, кроме») находятся в регистре РегистрСведений.ЗначенияГруппДоступа.

При этом важно помнить правило объединения: если пользователь включен в несколько групп доступа, их права объединяются по логическому ИЛИ. Если хотя бы в одной действующей группе доступа для пользователя вид доступа не ограничен вовсе или конкретная группа разрешена, пользователь получит к ней доступ.

Рассмотрим пример запроса, выбирающего разрешенные значения для правила «Все запрещены, кроме» для произвольного пользователя:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ЗначенияГруппДоступа.ЗначениеДоступа КАК ГруппаПартнеров
    |ИЗ
    |	РегистрСведений.СоставыГруппПользователей КАК СоставыГрупп
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
    |		ПО СоставыГрупп.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
    |		
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ПоУмолчанию
    |		ПО ГруппыДоступаПользователи.Ссылка = ПоУмолчанию.ГруппаДоступа
    |			И (ПоУмолчанию.ВсеРазрешены = ЛОЖЬ)
    |		
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа
    |		ПО ГруппыДоступаПользователи.Ссылка = ЗначенияГруппДоступа.ГруппаДоступа
    |			И (ЗначенияГруппДоступа.ТипЗначенийДоступа = ТИП(Справочник.ГруппыДоступаПартнеров))
    |ГДЕ
    |	СоставыГрупп.Пользователь = &Пользователь
    |	И СоставыГрупп.Используется = ИСТИНА
    |	И НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления";

Запрос.УстановитьПараметр("Пользователь", НужныйПользователь);
Результат = Запрос.Выполнить();
ТаблицаРазрешенных = Результат.Выгрузить();

Способ 3. Использование программных методов БСП и типовых отчетов

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

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