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