Как в RLS регистра сведений скрыть недоступные ссылки, но оставить видимыми пустые значения

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

При настройке ограничения доступа на уровне записей (RLS) разработчики часто сталкиваются с ситуацией, когда на уровне справочника права ограничены, а в связанном регистре сведений пользователь видит записи со значением <Объект не найден...>. Если же добавить строгое условие RLS на чтение самого регистра сведений, из видимости могут пропасть нужные строки с незаполненными (пустыми) измерениями. Разберем, как правильно составить запрос ограничения доступа и почему изменения в ролях могут не применяться сразу.

Причина появления битых ссылок и скрытия пустых строк

Рассмотрим механизм работы ограничений платформы «1С:Предприятие». Ограничение RLS, установленное только на справочник, защищает исключительно саму таблицу этого справочника. Если у пользователя есть право Чтение на регистр сведений без дополнительных условий, платформа честно считывает запись регистра. Однако при попытке прочитать представление ссылки, на которую у пользователя нет прав, система возвращает строку <Объект не найден>.

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

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

Проанализируем структуру запроса ограничения доступа на чтение регистра сведений. Предположим, что у регистра есть два измерения: ОтделС и ОтделНа с типом СправочникСсылка.ВТК_Отделы, а список доступных пользователю подразделений передан в параметр сеанса &МассивДоступныхОтделовДляСправочника.

Разберем базовый вариант с явным объединением через логическое ИЛИ:


ГДЕ (ОтделС В (&МассивДоступныхОтделовДляСправочника) 
        ИЛИ ОтделС = ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))
    И (ОтделНа В (&МассивДоступныхОтделовДляСправочника) 
        ИЛИ ОтделНа = ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))

Посмотрим на более компактный и оптимизированный вариант синтаксиса языка запросов 1С. Оператор В позволяет объединять параметры и литералы значений через запятую без использования громоздких условий ИЛИ:


ГДЕ ОтделС В (&МассивДоступныхОтделовДляСправочника, ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))
    И ОтделНа В (&МассивДоступныхОтделовДляСправочника, ЗНАЧЕНИЕ(Справочник.ВТК_Отделы.ПустаяСсылка))

Если в логике работы регистра поле может принимать значение NULL (например, при составном типе или левом соединении), в условие проверки также рекомендуется добавить ИЛИ ОтделС ЕСТЬ NULL, так как сравнение NULL с пустой ссылкой вернет Ложь.

Почему изменения RLS не применяются: кэширование и Библиотека стандартных подсистем (БСП)

Нередко возникает ситуация, когда правильный запрос RLS написан, но пользователи по-прежнему не видят пустые строки или получают старую картину доступа. Выясним основные причины такого поведения:

  1. Динамическое обновление конфигурации: Применение изменений в структуре ролей и RLS через механизм динамического обновления (Демон) приводит к тому, что рабочие процессы сервера 1С (rphost) сохраняют старый скомпилированный кэш запросов ограничений для активных сеансов. Для корректного применения RLS необходимо выполнять монопольное обновление конфигурации базы данных и перезапускать клиентские сеансы.
  2. Устаревшие идентификаторы объектов БСП: Конфигурации на базе Библиотеки стандартных подсистем используют служебные справочники для сопоставления прав. При изменении состава ролей или объектов обязательно требуется обновление справочника ИдентификаторыОбъектовМетаданных.

Регламент обновления метаданных и сброса кэша прав

Для гарантированного применения новых правил RLS в конфигурациях с БСП выполним следующие шаги:

  1. Сохраним конфигурацию и выполним обновление базы данных обычным (не динамическим) способом.
  2. Выполним обновление данных БСП программно в сеансе с полными правами:

Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Истина, Истина, Ложь);
  1. В качестве альтернативы выполним запуск конфигурации с параметром командной строки /ЗапуститьОбновлениеИнформационнойБазы.
  2. Перезапустим сеанс тестируемого пользователя, чтобы обновились параметры сеанса и кэш прав доступа.

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

← На главную