Предисловие
В предыдущей статье мы рассмотрели структуру объектов метаданных, используемых для реализации механизма ограничения прав доступа на уровне записей, для конфигурации "Управление производственным предприятием" версии 1.3. Также была проанализирована связь объектов между собой, а также приведен текст шаблона RLS для справочника "Организации".
Сегодня в статье рассмотрим шаблон более подробно, проанализируем его влияние на конечный запрос платформы для получения данных из информационной базы.
Текст шаблона будем анализировать для роли "Пользователь", которая автоматически добавляется для всех пользователей информационной базы. Откроем ее в конфигураторе и перейдем к ее настройкам для справочника "Организации". Мы увидим следующее для права "Чтение":
Перейдя на вкладку "Шаблоны ограничений" и открыв текст шаблона ограничений мы увидим такой шаблон:
// Получаем признак использования ограничений на // уровне записей для справочника "Организации" // из одноименного параметра сеанса #Если &ИспользоватьОграничениеПоОрганизации #Тогда ТекущаяТаблица ИЗ // "#ТекущаяТаблица" - это имя таблицы, к которой выполняется запрос // В нашем примере это таблица справочника "Организации" #ТекущаяТаблица КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ // К текущей таблице присоединяется результат вложенного запроса, // получающий список групп пользователей, в которых // состоит текущий пользователь. В результате к элементу спр. // "Организации" присоединяются левым соединением все группы // текущего пользователя // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (ВЫБРАТЬ РАЗЛИЧНЫЕ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ // ТекущийПользователь - ссылка на элемент спр. "Пользователи", // хранящегося в параметре сеанса "ТекущийПользователь" СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей ПО (ИСТИНА) // ------------------------------------------------------------- ГДЕ // Накладываем условия на проверку доступа к текущей организации // Первое условие - для текущего пользователя должна быть установлена // хотя бы одна группа пользователей, чтобы дать ему права НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL // Второе условие - хотя бы для одной группы пользователей, в которую // входит текущий пользователь, должны быть установлены права на // чтение в регистре сведений "Настройки прав доступа пользователей" И (НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ // В таблице "НазначениеВидовОбъектовДоступа" получаем список // объектов доступа, на которые установлены настрйки прав для // полученного списка групп пользователей (см. выше) РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа // Присоединяем таблицу "НастройкиПравДоступаПользователей", // в которой хранятся настройки доступа RLS ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ПО НастройкиПравДоступаПользователей.ОбъектДоступа // "#Параметр(1)" - это выражение получает значение параметра // "Ссылка", переданного в шаблон ограничения доступа. В // нашем случае это ссылка на текущий элемент спр. "Организации" // (см. скриншот выше) = ТекущаяТаблица.#Параметр(1) И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка) И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей ГДЕ НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)) И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL)) #КонецЕсли
Шаблон достаточно подробно закомментировал. Все должно быть понятно, если Вы читали предыдущую статью.
А теперь сравним изменение запроса к базе данных с учетом влияния на него ограничений на уровне записей. Пример будет основываться на рассмотренном выше тексте шаблона. И так, вот таким будет первоначальный запрос к справочнику "Организации":
"ВЫБРАТЬ | * |ИЗ | Справочник.Организации КАК Организации"
А вот таким он будет с учетом ограничений на уровне записей:
"ВЫБРАТЬ | * |ИЗ | Справочник.Организации КАК Организация | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ | СоставГруппы.Ссылка КАК ГруппаПользователей | ИЗ | Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы | ГДЕ | СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей | ПО (ИСТИНА) |ГДЕ | НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL | И НЕ 1 В | (ВЫБРАТЬ ПЕРВЫЕ 1 | 1 | ИЗ | РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей | ПО | НастройкиПравДоступаПользователей.ОбъектДоступа = &СсылкаНаОрганизацию | И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа | И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка) | И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей | ГДЕ | НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей | И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)) | И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL ) | И Организация.Ссылка = &СсылкаНаОрганизацию"
В зарос добавлен параметр "СсылкаНаОрганизацию", чтобы правильно смоделировать работу запроса. В нашем случае в параметр передается ссылка на организацию, к которой проверяется доступ на чтение.
На этом все. Спасибо за внимание!