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