Переход на Производительный RLS (ограничение доступа на уровне записей) в «1С:Библиотеке стандартных подсистем» (БСП) — это отличный способ ускорить работу системы, однако этот механизм гораздо сложнее в отладке, чем старый вариант RLS. Часто возникает ситуация: вы настроили профили, группы доступа и шаблоны, у обычных сотрудников ограничения работают корректно, а у руководителей или определенных групп доступа «открываются» все элементы, хотя полных прав у них нет. Рассмотрим подробно, как диагностировать эту проблему и какие скрытые механизмы БСП могут приводить к игнорированию ограничений.
Механизм производительного RLS базируется на предварительно рассчитанных ключах доступа. Если система «решает», что пользователю разрешено все, она просто не создает записи в определенных регистрах, и стандартный запрос RLS возвращает Истина для всех строк. Проанализируем ситуацию с помощью консоли запросов. Основной интерес представляют регистры КлючиДоступаКОбъектам и КлючиДоступаПользователей.
Выполним следующий проверочный запрос, чтобы понять, сформированы ли ключи для конкретного пользователя и целевого справочника:
ВЫБРАТЬ
КлючиДоступаКОбъектам.Объект,
КлючиДоступаПользователей.Пользователь
ИЗ
РегистрСведений.КлючиДоступаКОбъектам КАК КлючиДоступаКОбъектам
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаПользователей КАК КлючиДоступаПользователей
ПО КлючиДоступаКОбъектам.КлючДоступаПользователей = КлючиДоступаПользователей.КлючДоступа
ГДЕ
КлючиДоступаПользователей.Пользователь = &Пользователь
И КлючиДоступаКОбъектам.Объект = &ЦелевойСправочник
Если этот запрос ничего не возвращает для проблемного пользователя, значит, подсистема БСП по какой-то причине исключила этого пользователя из проверки прав через ключи. Выясним, почему это происходит.
Разберем самую частую причину: наличие у пользователя роли, которая дает право Чтения или Изменения объекта без использования шаблонов ограничений. В 1С права суммируются по принципу «Разрешено все, что разрешено хотя бы в одной роли».
Проанализируем состав ролей в профиле руководителя. Даже если в 99% ролей прописаны шаблоны RLS, наличие хотя бы одной роли (например, технической или вспомогательной), где на справочник Договоры дано право «Чтение» без ограничений, приведет к тому, что БСП перестанет вычислять ключи для этого пользователя. Система оптимизирует запросы: зачем проверять ключи доступа, если у пользователя и так есть полное право по метаданным?
В БСП часто используются так называемые «разделители» (например, Организации, Подразделения или специфические справочники вроде ГруппыДоступаДоговоров). Выясним интересную особенность: если роль пользователя позволяет редактировать сам справочник, который является разделителем, система может интерпретировать это как наличие административных прав над этим измерением доступа.
Посмотрим на пример из практики: у группы доступа руководителей была роль на изменение справочника ГруппыДоступаДоговоровЗайма. Как только эта роль была активна, RLS по договорам переставал работать. Это происходит потому, что право изменять логику самого ограничения (то есть разделитель) часто приравнивается к полному доступу к данным, которые этот разделитель защищает.
Если вы уверены, что роли настроены правильно, но ключи в регистрах не появляются, необходимо проверить актуальность служебных данных. БСП хранит структуру прав в кэшированном виде. Для принудительного обновления выполним следующие действия:
Также стоит проверить состояние регламентного задания ОбновлениеДоступаНаУровнеЗаписей. Если очередь обновления (регистр ОчередьОбновленияДоступа) переполнена или зависла, новые ключи для руководителей просто не будут рассчитаны.
Если визуальный анализ ролей не дает результата, применим проверенный метод исключения. Разберем ситуацию по шагам:
Проанализируем настройки самого Профиля группы доступа. В БСП есть два режима:
Если для группы руководителей установлен тип доступа «Все разрешены» и список исключений пуст, БСП не будет создавать записи в регистрах ключей доступа, так как доступ считается полным по умолчанию. Проверьте вкладку «Ограничения доступа» в профиле и убедитесь, что вид доступа настроен корректно (например, выбрано «Все запрещены, исключения назначаются»).
При поиске причин «прозрачности» RLS всегда проверяйте:
Чтение на объект.РегистрСведений.НаборыЗначенийДоступа для самого объекта (если там пусто, значит, объект вообще не участвует в системе производительного RLS).Использование этих методов позволит вам быстро локализовать ошибку в настройке прав и вернуть систему в защищенное состояние.