При настройке прав доступа в конфигурации «Управление торговлей 10.3» (и аналогичных решениях на обычных формах) специалисты часто сталкиваются с задачей ограничения видимости контрагентов для определенных пользователей. Механизм RLS (Record Level Security) позволяет настроить доступ так, чтобы менеджер видел только «своих» клиентов.
Однако на практике часто возникает ситуация: группы доступа созданы, контрагенты в них добавлены, RLS в роли прописан, но пользователь по-прежнему видит весь справочник. Или же справочник фильтруется, но документы по этим контрагентам остаются видны все. В этой статье мы подробно разберем, как правильно настроить шаблоны ограничений и где искать ошибки.
Прежде чем погружаться в код шаблонов, нам необходимо проверить базовые принципы работы платформы 1С:Предприятие с правами доступа. Самая распространенная причина, по которой RLS «не работает», кроется не в ошибке кода, а в наборе ролей пользователя.
Права в 1С суммируются. Это означает, что если у пользователя есть две роли, и одна из них дает право на чтение справочника Контрагенты с ограничением RLS, а вторая дает право на чтение того же справочника без ограничений, то победит «разрешающая» роль. У пользователя будет полный доступ.
Поэтому первым делом мы должны выполнить следующие шаги:
Контрагенты, убедимся, что для этого права прописан шаблон ограничения доступа.Если хотя бы одна роль (например, типовая роль «Пользователь» или некорректно настроенная роль «Менеджер») имеет чистый доступ на чтение, RLS работать не будет.
Важное замечание: Ограничение RLS обычно ставится на право Чтение. На право Просмотр RLS ставить не нужно (и часто невозможно корректно), так как просмотр зависит от возможности прочитать данные.
В конфигурации УТ 10.3 используется механизм групп доступа. Это значит, что права раздаются не на конкретного контрагента, а на группу доступа, к которой этот контрагент привязан. Связь хранится в регистре сведений, но в самом справочнике есть реквизит, указывающий на группу.
Разберем типовой шаблон ограничения, который необходимо прописать в роли на право Чтение для объекта Справочник.Контрагенты.
Текст шаблона выглядит следующим образом:
#ТаблицаОсновогоВидаОбъектаДоступа("Контрагенты", "ГруппаДоступаККонтрагенту", "ИЛИ ЭтоГруппа")
Давайте разберем параметры этого шаблона подробнее, чтобы понимать, как он работает:
НастройкиПравДоступаПользователей).Контрагенты, по которому происходит фильтрация. Именно в этом реквизите хранится ссылка на элемент справочника ГруппыДоступаККонтрагентам.Зачем нужен параметр ИЛИ ЭтоГруппа? Если его убрать, то пользователь, не имеющий прав на определенную группу доступа, не увидит даже папок в иерархии справочника, если для этих папок не задана та же группа доступа (а для папок она часто не задается). Чтобы сохранить красивую структуру дерева (иерархию), мы разрешаем видеть все папки безусловно, а элементы внутри них фильтруем по правам.
После того как мы настроили справочник, возникает вторая задача: скрыть документы, оформленные на недоступных контрагентов. Если в роли для документов (например, РеализацияТоваровУслуг или ЗаказПокупателя) не прописать ограничения, пользователь будет видеть список всех документов, хотя при попытке «провалиться» в поле Контрагент увидит «Объект не найден».
Для документов логика сложнее, так как часто требуется проверять права одновременно по двум измерениям: по Организации и по Контрагенту. Документ должен быть виден только тогда, когда пользователю разрешен доступ и к нашей организации, и к клиенту.
Для этого в УТ 10.3 используется другой типовой шаблон. В правах роли на чтение документов вставляем следующий код:
#ОрганизацияВШапкеКонтрагентВШапке("Организация", "Контрагент")
Разберем, что делает этот шаблон:
Организация. Проверяет, есть ли у текущего пользователя права на эту организацию (согласно настройкам групп доступа к организациям).Контрагент. Проверяет права на контрагента аналогично тому, как мы делали это для справочника.Если в конкретном документе реквизиты называются иначе (например, не Контрагент, а Партнер или Поставщик), параметры шаблона нужно соответственно изменить. Например:
#ОрганизацияВШапкеКонтрагентВШапке("Организация", "Поставщик")
Даже если вы идеально прописали шаблоны в ролях, система может их игнорировать. Это происходит, если на уровне всей программы отключено использование ограничений прав доступа.
Мы настоятельно рекомендуем проверить настройки учета перед началом отладки кода:
Внедрение RLS в УТ 10.3 (обычные формы) неизбежно влечет за собой снижение производительности. Шаблоны, которые мы рассмотрели выше (#ТаблицаОсновогоВидаОбъектаДоступа и #ОрганизацияВШапкеКонтрагентВШапке), добавляют к каждому запросу выборки данных сложные соединения (LEFT JOIN) с регистрами прав и вспомогательными таблицами.
Если после настройки пользователи жалуются на то, что списки документов открываются медленно, мы рекомендуем:
Для корректной настройки видимости по контрагентам в УТ 10.3 необходимо:
Контрагенты прописать шаблон: #ТаблицаОсновогоВидаОбъектаДоступа("Контрагенты", "ГруппаДоступаККонтрагенту", "ИЛИ ЭтоГруппа").#ОрганизацияВШапкеКонтрагентВШапке("Организация", "Контрагент").