Как в 1С 8.3 сделать отбор в RLS в регистре сведений по измерению

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

Настройка ограничений доступа на уровне записей (RLS — Record Level Security) является одной из самых ответственных и в то же время сложных задач при разработке в системе 1С:Предприятие 8.3. Ошибки в настройке RLS могут привести либо к избыточному доступу (пользователь видит то, что не должен), либо к некорректному отображению данных в интерфейсе, когда вместо наименований объектов отображаются «битые ссылки» (объект не найден). Рассмотрим подробно, как правильно настроить отбор в регистре сведений по конкретному измерению, разберем типичные ошибки и способы их решения.

Разбор проблемы: Почему RLS работает не так, как ожидалось

Проанализируем ситуацию, описанную в теме. Разработчик пытается ограничить доступ к регистру ЦеныНоменклатуры, чтобы пользователь видел цены только определенных видов (например, только розничные). При этом в интерфейсе пользователь все равно видит строки, но в колонке ВидЦен вместо названия отображается ссылка. Выясним причину такого поведения.

В системе 1С права на объекты суммируются. Если у пользователя есть две роли, где одна ограничивает чтение регистра ЦеныНоменклатуры через RLS, а вторая роль (например, «Полные права» или «Просмотр всех цен») дает право на чтение этого же регистра без ограничений, то в итоге RLS применяться не будет. Пользователь увидит все записи, потому что система разрешает всё, что разрешено хотя бы одной ролью.

Ситуация с отображением ссылок вместо значений возникает, когда:

  1. RLS настроен на объект, на который ссылается измерение (например, на справочник ВидыЦен).
  2. При этом на сам Регистр сведений ограничение либо не настроено, либо настроено неверно.

В результате система позволяет прочитать запись в регистре, но когда пытается получить наименование вида цены из справочника, RLS справочника блокирует доступ. Мы видим строку в регистре, но не видим данных внутри ссылки.

Шаг 1. Создание корректного запроса RLS для регистра сведений

Рассмотрим пример запроса, который должен быть прописан в роли на право Чтение для регистра сведений. Предположим, нам нужно ограничить доступ к ценам, основываясь на настройках, хранящихся в другом регистре — НастройкиПользователей.

Разберем по шагам логику построения такого запроса прямо в окне редактирования роли:


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

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

Шаг 2. Оптимизация RLS через параметры сеанса

Использование сложных подзапросов в RLS (как в примере выше) может значительно замедлить работу системы, особенно если регистр цен содержит сотни тысяч записей. Проанализируем более эффективный способ — использование Параметров сеанса.

Вместо того чтобы каждый раз запрашивать данные из регистра НастройкиПользователей, мы можем при старте сеанса (в модуле сеанса) один раз собрать все разрешенные виды цен в массив и поместить их в параметр сеанса ДоступныеВидыЦен. Тогда текст RLS станет максимально простым и быстрым:

ГДЕ ВидЦен В (&ДоступныеВидыЦен)

Такой подход считается «лучшей практикой» при разработке на платформе 8.3, так как нагрузка на базу данных минимизируется.

Шаг 3. Устранение конфликтов ролей

Если запрос написан правильно, но отбор все равно не работает, необходимо выполнить проверку ролей пользователя. Рассмотрим алгоритм действий:

  1. Откройте список ролей пользователя в конфигураторе или в режиме «1С:Предприятие» (если используется БСП).
  2. Найдите все роли, в которых есть право Чтение на регистр ЦеныНоменклатуры.
  3. Убедитесь, что в каждой из этих ролей прописано соответствующее условие RLS.
  4. Если хотя бы в одной роли поле «Ограничение доступа» пустое — RLS работать не будет.

Важный момент: часто разработчики забывают про право Просмотр. Для регистров сведений ограничение устанавливается на право Чтение. Право Просмотр отвечает только за видимость регистра в интерфейсе (в меню «Все функции» или в списках), но не за фильтрацию самих данных в запросах или отчетах.

Шаг 4. Использование шаблонов ограничений (БСП)

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

Посмотрим на пример использования шаблона #ПоЗначениям:


#ПоЗначениям( "РегистрСведений.ЦеныНоменклатуры","Чтение","",
"ВидыЦен","ВидЦен",
"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )

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

Типичные ошибки при написании кода RLS

Проанализируем ситуацию из сообщения №7 в обсуждении, где автор добавил условие И ЦеныНоменклатуры.ВидЦен.Наименование = "". Это типичная попытка «отсечь» лишние записи «на ощупь». Проблема в том, что если у пользователя нет прав на чтение объекта справочника, то обращение через точку ВидЦен.Наименование вернет NULL или пустую строку, но само условие RLS может отработать непредсказуемо.

Основные правила безопасного RLS:

Итоги

Для реализации корректного отбора в регистре сведений по измерению необходимо:

  1. Четко определить измерение, по которому идет фильтрация (например, ВидЦен).
  2. Написать запрос RLS для права Чтение, используя либо подзапрос, либо (что лучше) параметр сеанса.
  3. Проверить, что у пользователя нет других ролей, разрешающих чтение этого регистра без ограничений.
  4. Убедиться, что на сами объекты (справочники), которые находятся в измерениях, также настроен соответствующий доступ, иначе пользователь увидит ссылки «Объект не найден».

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

← На главную