Ограничение доступа к данным на уровне записей (RLS) в 1С 8.3

Курс

Настройка RLS

Роли позволяют назначить права доступа на весь объект. Но иногда требуется разделить права доступа на конкретные значения объекта. Например, в справочнике контрагентов могут быть и покупатели и поставщики. И нужно, чтобы менеджеры по продажам видели только покупателей, а менеджеры по закупкам только поставщиков.

Для этого используются ограничения доступа к данным на уровне записей или RLS (Record Level Security).

RLS настраиваются в роли в группе Ограничения доступа к данным:

Ограничения доступа к данным

RLS настраиваются отдельно для каждого права. При этом ограничения можно настроить только для следующих прав:

  • Чтение
  • Добавление
  • Изменение
  • Удаление

В колонке Поля указывается список полей объекта, на которые настраивается ограничение. Можно выбрать Прочие поля, что значит ограничение на все поля объекта, кроме тех на которые явно настроены ограничения.

Для права Чтение можно настроить несколько ограничений. Между собой они будут объединены по условию И. У пользователя будут права только при выполнении всех ограничений.

На права Добавление, Изменение и Удаление можно настроить только одно ограничение.

Если на какое-то право были настроены RLS, то в списке прав они выделяются цветом, а также пиктограммой:

RLS

В примере выше RLS настроены для прав Чтение и Изменение.

Ограничения доступа можно настраивать для:

  • Справочников
  • Документов
  • Журналов документов
  • Планов видов характеристик
  • Планов счетов
  • Планов видов расчета
  • Планов обмена
  • Регистров сведений
  • Регистров накопления
  • Регистров бухгалтерии
  • Регистров расчета
  • Бизнес-процессов
  • Задач

Язык ограничения доступа к данным

В колонке Ограничение доступа указывается текст самого ограничения. Он пишется на специальном языке ограничения доступа к данным, который является подмножеством языка запросов 1С. В тексте можно использовать только секции ИЗ и ГДЕ.

Если запрос из ограничения доступа вернет хотя бы одну запись или условие в секции ГДЕ будет истинным, то у пользователя есть права на этот объект базы банных. В противном случае прав не будет.

Простое ограничение доступа может выглядеть следующим образом:

Здесь Контрагенты — это псевдоним таблицы, а ГДЕ ИСТИНА — условие.

Таблица объекта, на который настраиваются ограничения всегда присутствует в тексте запроса. Именно ее псевдоним указывается в начале запроса. При необходимости можно добавить несколько таблиц в запрос:

Можно не использовать условие в запросе . В этом случае, если запрос вернет хотя бы одну запись, то у пользователя будут права на этот объект базы данных:

Стоит отменить что в тексте запроса RLS нельзя обращаться к реквизитам и ресурсам регистра накопления или бухгалтерии. А также можно обращаться только к балансовым измерениям регистра бухгалтерии.

Примеры RLS

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

У справочника Контрагенты есть реквизит ГруппаДоступа, который имеет тип ПеречислениеСсылка.ГруппыДоступаКонтрагентов:

ГруппаДоступа
ГруппаДоступа

По значению данного реквизита можно определить кем является контрагент.

Сейчас в списке контрагентов 2 покупателя и 2 поставщика:

Контрагенты

Создадим роль Покупатели и для справочника Контрагенты и права Чтение настроим следующее ограничение:

RLS

И дадим пользователю только эту роль. В результате ему будут доступны только покупатели:

Контрагенты

Удалим ограничение доступа для права Чтение и добавим такое же, но для права Добавление:

RLS

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

недостаточно прав

Удалим ограничение для права Добавление и добавим такое же для права Изменение:

RLS

Теперь пользователь может добавлять контрагентов с любой группой доступа, но изменять может только покупателей. При этом нельзя сначала изменить группу доступа на Покупатели, а потом изменить сам объект. Проверка выполняется как до изменения, так и после изменения.

Удалим ограничения для права Изменение и добавим такое же для права Удаление:

RLS

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

Вернем снова ограничение только для права Чтение, чтобы пользователь мог видеть только покупателей. Если сейчас пользователю дать еще одну роль, которая дает права на чтение и просмотр контрагентов, но для нее не настроены RLS, то пользователь увидит всех контрагентов. Так происходит, потому что из разных ролей RLS складываются по условию ИЛИ. Если хотя бы в одной роли нет ограничений, то считается, что разрешены все контрагенты.

Если для права Чтение добавить еще одно ограничение с условием:

RLS

То пользователь не увидит ни одного контрагента. В рамках одной роли ограничения складываются по условию И. Условие ГДЕ ЛОЖЬ никогда не будет истинным, поэтому у пользователя не будет прав ни на одного контрагента.

Вернем снова только одно ограничение на чтение покупателей и создадим 2 документа, где используется контрагент. Один с покупателем, второй с поставщиком. Под полными правами будут доступны оба документа:

RLS

С правами только на покупателей тоже будут доступны оба документа, но вместо поставщика будет надпись «Объект не найден», так как у пользователя нет прав на чтение поставщиков, но есть права на чтение документов:

Объект не найден

Чтобы скрыть документы с запрещенными контрагентами нужно настроить RLS для документа:

RLS

Теперь документы с запрещенными контрагентами не будут доступны:

RLS

RLS на табличные части

В запросах RLS можно обращаться к табличным частям объектов.

Например, есть документ Списание долга со следующей структурой:

Списание долга

И нужно скрыть документы, где списывается долг поставщиков. В этом случае можно прописать ограничение наподобие документа Приход товара:

Если в табличной части документа будут только поставщики, то такие документы не будут доступны в списке документов. Однако, если в одном документе будет и покупатель и поставщик, то он будет доступен в списке документов и его можно будет открыть:

Списание долга

Хотелось бы чтобы такие документы тоже не были доступны. В этом случае нужно изменить текст запроса на следующий:

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

Поля RLS

При настройке ограничения доступа можно указать поля, на которые будет действовать ограничение. Например, у контрагентов есть реквизит Телефон. И нужно скрыть от менеджеров по продажам не поставщиков, а только их телефоны. Сами поставщики могут быть доступны в списке.

В этом случае при настройке RLS в колонке Поля нужно указать поле Телефон:

Поля RLS

Тогда в списке контрагентов будут доступны все контрагенты (потому что в списке нет поля Телефон):

контрагенты

А если попробовать открыть карточку любого поставщика, то будет получена ошибка прав доступа (потому что при открытии формы было выполнено чтение реквизита Телефон).

Если в форму списка добавить реквизит Телефон, то будут доступны только покупатели:

контрагенты

То же самое касается запросов. Если в запросе не выбирать реквизит Телефон, то запрос выполнится без ошибки:

Если добавить в поля запроса реквизит Телефон, то будет выдана ошибка нарушения прав доступа:

Для регистров накопления, регистров бухгалтерии и регистров расчета можно настраивать RLS только на Прочие поля.

Режимы RLS

RLS может работать в двух режимах:

  1. Все
  2. Разрешенные

Режим «Все» подразумевает, что нужно прочитать все записи таблицы, а потом проверить права доступа на них. «Все» используется при обычном выполнении запроса, например:

В этом случае в текст запроса будет добавлено еще одно вспомогательное поле булевого типа, в котором будет признак наличия прав доступа на эту запись. На языке запросов 1С это выглядело бы примерно так:

Если в поле ЕстьПраваНаЗапись хотя бы в одной строке будет Ложь, то запрос будет завершен с ошибкой нарушения прав доступа.

Режим «Разрешенные» подразумевает, что нужно прочитать только те записи, на которые есть права доступа. В этом случае в текст запроса будет добавлено дополнительное условие. Для того же самого запроса это выглядело бы примерно так:

В результате из базы данных будут выбраны только те записи, на которые у пользователя есть права доступа.

Добавление вспомогательного поля или дополнительного условия выполняется сервером 1С при обращении к базе данных.

По умолчанию при выполнении запросов используется режим «Все». Указав ключевое слово РАЗРЕШЕННЫЕ его можно изменить на режим «Разрешенные»:

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

В формах списках для отображения списка объектов используется Динамический список. В нем всегда используется режим «Разрешенные». Поэтому после настройки RLS нет необходимости менять тексты запросов динамических списков.

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

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

Параметры сеанса и инструкции препроцессора

В тексте запроса RLS можно использовать параметры сеанса. Параметры сеанса выделяются в тексте запроса как обычные параметры, через амперсанд (&):

В данном примере был использован параметр сеанса ТекущийПользователь.

Параметры сеанса, используемые в тексте запроса RLS должны быть установлены.

Не рекомендуется часто изменять значения параметров сеанса, которые используются в RLS. Потому что запросы для RLS кэшируются, а если изменить значение параметра сеанса и он использовался в запросе RLS, то кэш сбрасывается.

Также можно использовать инструкции препроцессора:

В данном примере были использованы два параметра сеанса: ИспользоватьОграниченияДоступа и ТекущийПользователь. Если параметр ИспользоватьОграниченияДоступа равен Истина, то будет использоваться RLS, если Ложь — то не будет.

Также в тексте запроса можно обращаться к независящим от параметров функциональным опциям. Обращение выполняется аналогично параметрам сеанса, через амперсанд (&).

Шаблоны ограничений

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

Шаблоны ограничений одной роли находятся на закладке Шаблоны ограничений в редакторе роли:

Шаблоны ограничений

При написании шаблона нужно указать его Наименование и Текст шаблона. В тексте шаблона можно использовать параметры, например Параметр(1). Это означает обращение к первому параметру шаблона. Параметр(2) — ко второму и т.д.

Например, есть следующий шаблон:

Для вызова шаблона нужно указать решетку (#) и затем имя шаблона. В скобках нужно передать параметры, каждый параметр указывается в кавычках:

В результате шаблон будет преобразован в следующий текст запроса:

Параметры в шаблоне можно было указать по другому. В наименовании шаблона указать имена параметров и в тексте запроса обращаться к ним по имени.

Например, наименование шаблона: ПоГруппамДоступа(Реквизит, Значение).

Текст шаблона:

Шаблоны ограничений

Но как правило используется первый вариант.

Для каждой роли используются свои шаблоны. Шаблоны одной роли не будут доступны другой роли. Посмотреть список всех шаблонов можно щелкнув правой кнопкой по узлу Роли и выбрав Все ограничения доступа:

Все ограничения доступа

На первой закладке будет список всех настроенных RLS для всех ролей:

Все ограничения доступа

На второй закладке список всех шаблонов:

Все ограничения доступа

Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok