Как настроить RLS по контрагентам в УТ 10.3 для справочников и документов?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При настройке прав доступа в конфигурации «Управление торговлей 10.3» (и аналогичных решениях на обычных формах) специалисты часто сталкиваются с задачей ограничения видимости контрагентов для определенных пользователей. Механизм RLS (Record Level Security) позволяет настроить доступ так, чтобы менеджер видел только «своих» клиентов.

Однако на практике часто возникает ситуация: группы доступа созданы, контрагенты в них добавлены, RLS в роли прописан, но пользователь по-прежнему видит весь справочник. Или же справочник фильтруется, но документы по этим контрагентам остаются видны все. В этой статье мы подробно разберем, как правильно настроить шаблоны ограничений и где искать ошибки.

Диагностика проблемы: почему пользователь видит всё?

Прежде чем погружаться в код шаблонов, нам необходимо проверить базовые принципы работы платформы 1С:Предприятие с правами доступа. Самая распространенная причина, по которой RLS «не работает», кроется не в ошибке кода, а в наборе ролей пользователя.

Права в 1С суммируются. Это означает, что если у пользователя есть две роли, и одна из них дает право на чтение справочника Контрагенты с ограничением RLS, а вторая дает право на чтение того же справочника без ограничений, то победит «разрешающая» роль. У пользователя будет полный доступ.

Поэтому первым делом мы должны выполнить следующие шаги:

  1. Откроем карточку пользователя в конфигураторе или в режиме предприятия.
  2. Проанализируем список назначенных ролей.
  3. Проверим каждую роль: если в ней стоит галочка «Чтение» напротив объекта Контрагенты, убедимся, что для этого права прописан шаблон ограничения доступа.

Если хотя бы одна роль (например, типовая роль «Пользователь» или некорректно настроенная роль «Менеджер») имеет чистый доступ на чтение, RLS работать не будет.

Важное замечание: Ограничение RLS обычно ставится на право Чтение. На право Просмотр RLS ставить не нужно (и часто невозможно корректно), так как просмотр зависит от возможности прочитать данные.

Настройка RLS для справочника «Контрагенты»

В конфигурации УТ 10.3 используется механизм групп доступа. Это значит, что права раздаются не на конкретного контрагента, а на группу доступа, к которой этот контрагент привязан. Связь хранится в регистре сведений, но в самом справочнике есть реквизит, указывающий на группу.

Разберем типовой шаблон ограничения, который необходимо прописать в роли на право Чтение для объекта Справочник.Контрагенты.

Текст шаблона выглядит следующим образом:


#ТаблицаОсновогоВидаОбъектаДоступа("Контрагенты", "ГруппаДоступаККонтрагенту", "ИЛИ ЭтоГруппа")

Давайте разберем параметры этого шаблона подробнее, чтобы понимать, как он работает:

Зачем нужен параметр ИЛИ ЭтоГруппа? Если его убрать, то пользователь, не имеющий прав на определенную группу доступа, не увидит даже папок в иерархии справочника, если для этих папок не задана та же группа доступа (а для папок она часто не задается). Чтобы сохранить красивую структуру дерева (иерархию), мы разрешаем видеть все папки безусловно, а элементы внутри них фильтруем по правам.

Настройка RLS для документов

После того как мы настроили справочник, возникает вторая задача: скрыть документы, оформленные на недоступных контрагентов. Если в роли для документов (например, РеализацияТоваровУслуг или ЗаказПокупателя) не прописать ограничения, пользователь будет видеть список всех документов, хотя при попытке «провалиться» в поле Контрагент увидит «Объект не найден».

Для документов логика сложнее, так как часто требуется проверять права одновременно по двум измерениям: по Организации и по Контрагенту. Документ должен быть виден только тогда, когда пользователю разрешен доступ и к нашей организации, и к клиенту.

Для этого в УТ 10.3 используется другой типовой шаблон. В правах роли на чтение документов вставляем следующий код:

#ОрганизацияВШапкеКонтрагентВШапке("Организация", "Контрагент")

Разберем, что делает этот шаблон:

  1. Он анализирует реквизит шапки документа с именем Организация. Проверяет, есть ли у текущего пользователя права на эту организацию (согласно настройкам групп доступа к организациям).
  2. Он анализирует реквизит шапки документа с именем Контрагент. Проверяет права на контрагента аналогично тому, как мы делали это для справочника.
  3. Условия объединяются через логическое «И». То есть, чтобы документ появился в списке, оба условия должны быть истинными.

Если в конкретном документе реквизиты называются иначе (например, не Контрагент, а Партнер или Поставщик), параметры шаблона нужно соответственно изменить. Например:

#ОрганизацияВШапкеКонтрагентВШапке("Организация", "Поставщик")

Предварительные условия для работы RLS

Даже если вы идеально прописали шаблоны в ролях, система может их игнорировать. Это происходит, если на уровне всей программы отключено использование ограничений прав доступа.

Мы настоятельно рекомендуем проверить настройки учета перед началом отладки кода:

  1. Зайдите в меню Сервис — Настройка учета — Настройка параметров учета.
  2. Найдите вкладку или раздел, отвечающий за права доступа (в разных версиях интерфейса может называться по-разному, часто это отдельная константа в настройках программы).
  3. Убедитесь, что установлена галочка «Ограничивать права доступа на уровне записей». Без этой галочки шаблоны в ролях просто не компилируются в SQL-запрос при чтении данных.

Решение проблем с производительностью

Внедрение RLS в УТ 10.3 (обычные формы) неизбежно влечет за собой снижение производительности. Шаблоны, которые мы рассмотрели выше (#ТаблицаОсновогоВидаОбъектаДоступа и #ОрганизацияВШапкеКонтрагентВШапке), добавляют к каждому запросу выборки данных сложные соединения (LEFT JOIN) с регистрами прав и вспомогательными таблицами.

Если после настройки пользователи жалуются на то, что списки документов открываются медленно, мы рекомендуем:

Итог

Для корректной настройки видимости по контрагентам в УТ 10.3 необходимо:

  1. Включить использование RLS в настройках параметров учета.
  2. В роли на чтение справочника Контрагенты прописать шаблон:
    #ТаблицаОсновогоВидаОбъектаДоступа("Контрагенты", "ГруппаДоступаККонтрагенту", "ИЛИ ЭтоГруппа").
  3. В ролях на чтение документов прописать шаблон:
    #ОрганизацияВШапкеКонтрагентВШапке("Организация", "Контрагент").
  4. Убедиться, что у пользователя нет других ролей, дающих безусловный доступ к этим объектам.
← На главную