Настройка ограничения доступа на уровне записей (RLS) — одна из наиболее трудоемких задач при доработке типовых конфигураций «1С», таких как «Бухгалтерия предприятия 3.0» или «ERP Управление предприятием». Ситуация существенно усложняется, когда нам требуется ограничить доступ по реквизиту, имеющему составной тип данных. Классический пример — реквизит Контрагент в документе ПлатежноеПоручение, который может ссылаться как на справочник Контрагенты, так и на справочник ФизическиеЛица.
В этой статье мы подробно разберем, как правильно настроить RLS для составного поля, исправим распространенные синтаксические ошибки, а также рассмотрим особенности работы современного производительного (универсального) режима RLS в Библиотеке стандартных подсистем (БСП).
---
При использовании классического механизма RLS разработчики часто обращаются к стандартному шаблону БСП #ПоЗначениям. Этот шаблон позволяет передавать параметры ограничения. Давайте посмотрим на синтаксис, который часто приводит к ошибке при первой попытке его изменения.
Допустим, мы хотим ограничить чтение документов по двум видам доступа: Контрагенты и ГруппыФизическихЛиц. Мы открываем роль, находим ограничение чтения для документа ПлатежноеПоручение и пишем следующий код:
#ПоЗначениям("Документ.ПлатежноеПоручение", "Чтение", "", "Контрагенты, ГруппыФизическихЛиц", "Контрагент", "","", "","", "","", "","","","","","","","", "","","","","","","","", "","","","","","","","" )
При попытке обновить конфигурацию или при открытии журнала документов в режиме «1С:Предприятие» система выдаст критическую ошибку синтаксического анализатора RLS. Выясним причину этой ошибки.
Дело в том, что парсер шаблонов БСП крайне чувствителен к пробелам внутри строковых параметров. В конструкции "Контрагенты, ГруппыФизическихЛиц" после запятой стоит пробел. Для платформы это означает, что имя второго вида доступа начинается с пробела, что недопустимо и вызывает сбой компиляции запроса RLS.
Правильное написание параметров шаблона для составного поля:
#ПоЗначениям("Документ.ПлатежноеПоручение", "Чтение", "", "Контрагенты,ГруппыФизическихЛиц", "Контрагент", "","", "","", "","", "","","","","","","","", "","","","","","","","", "","","","","","","","" )
Обратите внимание: пробел после запятой удален! В таком виде БСП корректно распознает оба вида доступа. Под капотом система транслирует это в SQL-запрос, который проверяет тип значения через оператор ССЫЛКА (или ТИПЗНАЧЕНИЯ) и применяет соответствующее правило фильтрации:
Контрагент находится ссылка на справочник Контрагенты, сработает ограничение по виду доступа Контрагенты.ФизическиеЛица, применится ограничение по виду доступа ГруппыФизическихЛиц.---
Современные версии конфигураций «1С» (включая БП 3.0, начиная с версии 3.0.65 и выше) по умолчанию используют производительный (универсальный) режим RLS. Если в вашей информационной базе включен этот режим (активен параметр сеанса ОграничениеДоступаНаУровнеЗаписейУниверсально), то классические шаблоны в ролях выполняться не будут!
Проанализируем структуру роли в режиме конфигуратора. Обычно ограничения доступа в производительном режиме обернуты в следующую инструкцию предпроцессора:
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям("Документ.ПлатежноеПоручение", "Чтение", "", "Контрагенты,ГруппыФизическихЛиц", "Контрагент", ...)
#КонецЕсли
Если универсальный режим включен, то ветка #Иначе полностью игнорируется платформой. Система выполняет шаблон #ДляОбъекта(""), который делегирует всю проверку прав программному механизму БСП на базе кэшированных ключей доступа. Следовательно, простое изменение текста шаблона #ПоЗначениям в роли не даст никакого эффекта.
Разберем по шагам, как правильно настроить программное ограничение в БСП для составного поля:
ПлатежноеПоручение.ПриЗаполненииОграниченияДоступа.ЗначениеРазрешено:
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Контрагент)";
КонецПроцедуры
Этот лаконичный код полностью заменяет громоздкие шаблоны ролей. Функция ЗначениеРазрешено(Контрагент) на уровне платформы сама определит фактический тип значения, хранящийся в документе, сопоставит его с настроенными видами доступа (будь то контрагент или физлицо) и применит соответствующее ограничение.
Для корректной работы этого механизма документ должен быть зарегистрирован в определяемых типах БСП, таких как ВладелецЗначенийКлючейДоступа и ВладелецЗначенийКлючейДоступаДокумент.
---
Часто разработчики сталкиваются со следующей проблемой: они настроили RLS, добавили физлицо в определенную группу доступа, указали эту группу в профиле пользователя и запустили обновление информационной базы с параметром /С ОбновитьИнформационнуюБазу. Однако документы по разрешенному физлицу все равно не отображаются в журнале.
Выясним причину этого поведения. В производительном режиме RLS права рассчитываются не динамически «на лету» при каждом открытии формы, а предварительно записываются в специальные регистры сведений (например, КлючиДоступаКОбъектам, КлючиДоступаКДокументам). Это сделано для повышения быстродействия системы.
При создании новой группы доступа или при первом внедрении RLS для документа система еще не успела пересчитать ключи доступа для уже существующих в базе документов. Обычное обновление конфигурации не инициирует автоматический пересчет миллионов существующих записей.
Как принудительно обновить ключи доступа:
ПлатежноеПоручение и запустите операцию «Обновить ключи доступа». Также это можно сделать программно, выполнив в консоли кода следующий вызов:
УправлениеДоступомСлужебный.ОбновитьКлючиДоступа(Метаданные.Документы.ПлатежноеПоручение);
После успешного обновления ключей доступа все документы по разрешенным физическим лицам сразу же появятся в списке у пользователя.
---
Чтобы система понимала, к какому физлицу у пользователя есть доступ, а к какому нет, необходимо правильно связать элементы справочников. Рассмотрим этот процесс по шагам:
Физические лица. В карточке каждого физлица должно быть заполнено поле Группа доступа (ссылка на справочник ГруппыДоступаФизическихЛиц). Если это поле оставить пустым, система (в зависимости от настроек БСП) может заблокировать доступ к этому физлицу для всех пользователей, у которых включено ограничение.Группы физических лиц установите значение «Все запрещены, исключения назначаются в группах доступа».---
Если после выполнения всех настроек и обновления ключей доступа пользователь по-прежнему видит документы по всем физическим лицам (даже по тем, которые должны быть скрыты), проанализируйте назначенные ему роли.
В платформе «1С:Предприятие» права рассчитываются по принципу логического «ИЛИ» (аддитивность прав). Если у пользователя есть хотя бы одна роль, которая дает право на чтение документа ПлатежноеПоручение без ограничений RLS (например, роль ЧтениеПлатежныхПоручений или аналогичная общая роль), то ограничения из других ролей работать не будут. Система предоставит полный доступ.
Решение: Убедитесь, что ограничение RLS внедрено во все роли, доступные данному пользователю, которые предоставляют право «Чтение» или «Просмотр» для целевого документа.