При настройке ограничения доступа на уровне записей (RLS) разработчики часто сталкиваются с ситуацией, когда на уровне справочника права ограничены, а в связанном регистре сведений пользователь видит записи со значением <Объект не найден...>. Если же добавить строгое условие RLS на чтение самого регистра сведений, из видимости могут пропасть нужные строки с незаполненными (пустыми) измерениями. Разберем, как правильно составить запрос ограничения доступа и почему изменения в ролях могут не применяться сразу.
Рассмотрим механизм работы ограничений платформы «1С:Предприятие». Ограничение RLS, установленное только на справочник, защищает исключительно саму таблицу этого справочника. Если у пользователя есть право Чтение на регистр сведений без дополнительных условий, платформа честно считывает запись регистра. Однако при попытке прочитать представление ссылки, на которую у пользователя нет прав, система возвращает строку <Объект не найден>.
Чтобы скрыть саму строку регистра с недоступным объектом, необходимо обязательно наложить условие RLS на право Чтение таблицы регистра сведений. Но если в тексте ограничения указать только проверку вхождения ссылки в список разрешенных значений, пустые ссылки также перестанут проходить проверку и будут отсечены.
Проанализируем структуру запроса ограничения доступа на чтение регистра сведений. Предположим, что у регистра есть два измерения: ОтделС и ОтделНа с типом СправочникСсылка.ВТК_Отделы, а список доступных пользователю подразделений передан в параметр сеанса &МассивДоступныхОтделовДляСправочника.
Разберем базовый вариант с явным объединением через логическое ИЛИ:
ГДЕ (ОтделС В (&МассивДоступныхОтделовДляСправочника)
ИЛИ ОтделС = ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))
И (ОтделНа В (&МассивДоступныхОтделовДляСправочника)
ИЛИ ОтделНа = ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))
Посмотрим на более компактный и оптимизированный вариант синтаксиса языка запросов 1С. Оператор В позволяет объединять параметры и литералы значений через запятую без использования громоздких условий ИЛИ:
ГДЕ ОтделС В (&МассивДоступныхОтделовДляСправочника, ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))
И ОтделНа В (&МассивДоступныхОтделовДляСправочника, ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))
Если в логике работы регистра поле может принимать значение NULL (например, при составном типе или левом соединении), в условие проверки также рекомендуется добавить ИЛИ ОтделС ЕСТЬ NULL, так как сравнение NULL с пустой ссылкой вернет Ложь.
Нередко возникает ситуация, когда правильный запрос RLS написан, но пользователи по-прежнему не видят пустые строки или получают старую картину доступа. Выясним основные причины такого поведения:
rphost) сохраняют старый скомпилированный кэш запросов ограничений для активных сеансов. Для корректного применения RLS необходимо выполнять монопольное обновление конфигурации базы данных и перезапускать клиентские сеансы.ИдентификаторыОбъектовМетаданных.Для гарантированного применения новых правил RLS в конфигурациях с БСП выполним следующие шаги:
Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Истина, Истина, Ложь);
/ЗапуститьОбновлениеИнформационнойБазы.Соблюдение этих правил гарантирует, что в регистре сведений будут отображаться как разрешенные элементы справочников, так и пустые значения, а недоступные строки с битыми ссылками будут полностью скрыты.