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