Настройка ограничений доступа на уровне записей (RLS — Record Level Security) является одной из самых ответственных и в то же время сложных задач при разработке в системе 1С:Предприятие 8.3. Ошибки в настройке RLS могут привести либо к избыточному доступу (пользователь видит то, что не должен), либо к некорректному отображению данных в интерфейсе, когда вместо наименований объектов отображаются «битые ссылки» (объект не найден). Рассмотрим подробно, как правильно настроить отбор в регистре сведений по конкретному измерению, разберем типичные ошибки и способы их решения.
Проанализируем ситуацию, описанную в теме. Разработчик пытается ограничить доступ к регистру ЦеныНоменклатуры, чтобы пользователь видел цены только определенных видов (например, только розничные). При этом в интерфейсе пользователь все равно видит строки, но в колонке ВидЦен вместо названия отображается ссылка. Выясним причину такого поведения.
В системе 1С права на объекты суммируются. Если у пользователя есть две роли, где одна ограничивает чтение регистра ЦеныНоменклатуры через RLS, а вторая роль (например, «Полные права» или «Просмотр всех цен») дает право на чтение этого же регистра без ограничений, то в итоге RLS применяться не будет. Пользователь увидит все записи, потому что система разрешает всё, что разрешено хотя бы одной ролью.
Ситуация с отображением ссылок вместо значений возникает, когда:
ВидыЦен).В результате система позволяет прочитать запись в регистре, но когда пытается получить наименование вида цены из справочника, RLS справочника блокирует доступ. Мы видим строку в регистре, но не видим данных внутри ссылки.
Рассмотрим пример запроса, который должен быть прописан в роли на право Чтение для регистра сведений. Предположим, нам нужно ограничить доступ к ценам, основываясь на настройках, хранящихся в другом регистре — НастройкиПользователей.
Разберем по шагам логику построения такого запроса прямо в окне редактирования роли:
ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.ВидЦен В
(ВЫБРАТЬ
НастройкиПользователей.Значение
ИЗ
РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
ГДЕ
НастройкиПользователей.Пользователь = &ТекущийПользователь
И (НастройкиПользователей.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.ОсновнойВидЦен)
ИЛИ НастройкиПользователей.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.РазрешенныйВидЦен)))
В данном примере мы используем оператор В и вложенный запрос. Система при каждом обращении к регистру ЦеныНоменклатуры будет проверять, входит ли ВидЦен текущей записи в список тех видов цен, которые назначены пользователю в настройках.
Использование сложных подзапросов в RLS (как в примере выше) может значительно замедлить работу системы, особенно если регистр цен содержит сотни тысяч записей. Проанализируем более эффективный способ — использование Параметров сеанса.
Вместо того чтобы каждый раз запрашивать данные из регистра НастройкиПользователей, мы можем при старте сеанса (в модуле сеанса) один раз собрать все разрешенные виды цен в массив и поместить их в параметр сеанса ДоступныеВидыЦен. Тогда текст RLS станет максимально простым и быстрым:
ГДЕ ВидЦен В (&ДоступныеВидыЦен)
Такой подход считается «лучшей практикой» при разработке на платформе 8.3, так как нагрузка на базу данных минимизируется.
Если запрос написан правильно, но отбор все равно не работает, необходимо выполнить проверку ролей пользователя. Рассмотрим алгоритм действий:
ЦеныНоменклатуры.Важный момент: часто разработчики забывают про право Просмотр. Для регистров сведений ограничение устанавливается на право Чтение. Право Просмотр отвечает только за видимость регистра в интерфейсе (в меню «Все функции» или в списках), но не за фильтрацию самих данных в запросах или отчетах.
Если вы работаете в современной конфигурации (например, УТ 11, ERP 2.5 или БП 3.0), рекомендуется использовать механизмы Библиотеки Стандартных Подсистем (БСП). В этом случае условия RLS не пишутся вручную «с нуля», а вызываются через стандартные шаблоны.
Посмотрим на пример использования шаблона #ПоЗначениям:
#ПоЗначениям( "РегистрСведений.ЦеныНоменклатуры","Чтение","",
"ВидыЦен","ВидЦен",
"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
Использование шаблонов позволяет гибко настраивать права в режиме «1С:Предприятие» через группы доступа, не прибегая к изменению кода в конфигураторе при каждом изменении прав конкретного пользователя.
Проанализируем ситуацию из сообщения №7 в обсуждении, где автор добавил условие И ЦеныНоменклатуры.ВидЦен.Наименование = "". Это типичная попытка «отсечь» лишние записи «на ощупь». Проблема в том, что если у пользователя нет прав на чтение объекта справочника, то обращение через точку ВидЦен.Наименование вернет NULL или пустую строку, но само условие RLS может отработать непредсказуемо.
Основные правила безопасного RLS:
ССЫЛКА для проверки конкретного типа перед обращением к его свойствам.ГДЕ ЛОЖЬ. Если вы хотите полностью запретить чтение при определенных условиях, используйте это условие.Для реализации корректного отбора в регистре сведений по измерению необходимо:
ВидЦен).Соблюдение этих правил позволит вам создать надежную систему разграничения прав доступа, которая будет работать быстро и без ошибок в интерфейсе.