Кратная вводная по терминологии и используемым подсистемам
RLS (Record Level Security) или ограничение прав на уровне записи — это настройка прав пользователей в разрезе конкретных данных (по организации, подразделению, складу и т.д.).
«1С:Библиотека стандартных подсистем» (БСП) - инструментарий разработчика, который предоставляет набор универсальных функциональных подсистем, готовые разделы для пользовательской документации и технологию для разработки прикладных решений на платформе «1С:Предприятие».
Подсистема БСП "Управление доступом" - позволяет настраивать права пользователей для произвольных элементов данных информационной базы (элементов справочников, документов, записей регистров, бизнес-процессов, задач и т. д.). В данной подсистеме есть 2 варианта работы RLS: производительный или стандартный.
Производительный вариант - предварительный расчет прав доступа. Стандартный вариант - расчет прав выполняется «на лету» непосредственно при доступе к данным.
За погружением и более детальной информацией об этих режимах я отсылаю вас к следующим источникам:
Перед внедрением необходимо заполучить в свои комплект поставки БСП той же версии, что внедрена в конфигурацию, из которого будете плотно использовать 2 полезных инструмента:
- отчет
Проверка внедрения БСП
(с отбором по подсистеме "Управление доступом") - обработка
УправлениеДоступом
из комплекта "Инструменты разработчика"
Инструменты эти будут нужны для подготовки текстов ограничений, проверки внедрения и исправления ошибок (а они будут).
Используемые объекты метаданных
Переходим непосредственно к внедрению производительного режима RLS в конфигурацию. Какие объекты метаданных потребуются?
- Общий модуль
УправлениеДоступомПереопределяемый
- Определяемые типы:
ВладелецЗначенийКлючейДоступа
ВладелецЗначенийКлючейДоступаДокумент
ВладелецЗначенийКлючейДоступаОбъект
ВладелецЗначенийКлючейДоступаНаборЗаписей
ПолеРегистраКлючейДоступаКРегистрам
- Справочник
ИдентификаторыОбъектовМетаданных
- Список объектов метаданных, которые будут разделителями доступа; у меня это
справочник "Организация"
. - Список объектов метаданных, в которые мы будем встраивать новый механизм. Для примера беру 3 объекта:
Справочник "Физические лица"
Документ "Штатное расписание
Регистр сведений "Гражданство"
Доработки модуля УправлениеДоступомПереопределяемый
-
В процедуре
ПриЗаполненииВидовДоступа
указываем какие конкретно объекты будет выступать в роли ограничителей. В моём примере это организация.Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Добавить(); ВидДоступа.Имя = "Организации"; ВидДоступа.Представление = НСтр("ru = 'Организации'"); ВидДоступа.ТипЗначений = Тип("СправочникСсылка.Организации"); КонецПроцедуры
-
В процедуре
ПриЗаполненииСписковСОграничениемДоступа
указываем на какие объекты метаданных применяется ограничение.Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт Списки.Вставить(Метаданные.Справочники.ФизическиеЛица, Истина); Списки.Вставить(Метаданные.Документы.ШтатноеРасписание, Истина); Списки.Вставить(Метаданные.РегистрыСведений.Гражданство, Истина); КонецПроцедуры
-
В процедуре
ПриЗаполненииВидовОграниченийПравОбъектовМетаданных
указываются объекты стандартного режима работы RLS. Это нужно для корректной работы отчета "Права доступа" и для случая, когда пользователи захотят выключить стандартный режим RLS.Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт // ФизическиеЛица Описание = Описание + " |Справочник.ФизическиеЛица.Чтение.Организации"; // ШтатноеРасписание Описание = Описание + " |Документ.ШтатноеРасписание.Чтение.Организации"; // Гражданство Описание = Описание + " |РегистрСведений.Гражданство.Чтение.Организации"; КонецПроцедуры
В моём случае на этом всё. Если у вас есть группы наборов доступа, н-р группы складов, то ознакомьтесь с документацией подсистемы, что и где прописывать для таких случаев.
Мои ошибки:
- Я пропустил, что надо что-то добавлять в процедуру
ПриЗаполненииВидовОграниченийПравОбъектовМетаданных
. - Я забывал указать объект в процедуру
ПриЗаполненииСписковСОграничениемДоступа
Все эти ошибки легко вылавливаются отчетом Проверка внедрения БСП
, который является незаменимым помощником при внедрении этой подсистемы.
Включаем объекты в определяемые типы данных
Разные объекты включаются в разное количество определяемых типов. Внимательно изучите документацию и примеры ниже, чтобы не упустить этот тонкий нюанс.
- Объект, выступающий разделителем данных (справочник "Организация") включается в следующие типы:
ВладелецЗначенийКлючейДоступа
ВладелецЗначенийКлючейДоступаОбъект
ПолеРегистраКлючейДоступаКРегистрам
- Справочник "Физические лица"
ВладелецЗначенийКлючейДоступа
ВладелецЗначенийКлючейДоступаОбъект
ПолеРегистраКлючейДоступаКРегистрам
т.к. является участником левого соединения в ограничении доступа к регистру сведений
- Документ "Штатное расписание"
ВладелецЗначенийКлючейДоступа
ВладелецЗначенийКлючейДоступаДокумент
- Регистр сведений "Гражданство"
ВладелецЗначенийКлючейДоступаНаборЗаписей
Мои ошибки:
- Попытался вставить документ во
ВладелецЗначенийКлючейДоступаОбъект
, т.к. не обратил внимание на надпись кроме документов. - Попытался добавить регистр сведений во
ВладелецЗначенийКлючейДоступа
, т.к. пропустил надпись "ссылочные". - Вообще забыл про тип
ПолеРегистраКлючейДоступаКРегистрам
, в который надо указывать поля ограничители и поля-соединения в запросах ограничения - Не учёл, что во
ВладелецЗначенийКлючейДоступа
, нужно добавлять ещё и связующие поля регистра сведений, т.е. если фильтр по организации, но организация достаётся через справочник "Физические лица", то этот справочник тоже надо добавить воВладелецЗначенийКлючейДоступа
.
Все эти ошибки легко вылавливаются отчетом Проверка внедрения БСП
, который является незаменимым помощником при внедрении этой подсистемы.
Создание предопределенных элементов в справочнике ИдентификаторыОбъектовМетаданных
Вспомогательные предопределенные элементы справочника ИдентификаторыОбъектовМетаданных
и используются в качестве первого параметра шаблона ДляРегистра
, поэтому если планируете ограничивать регистр сведений, надо будет создать в данном справочнике предопределённые элементы. В моём примере тут будет 1 элемент РегистрСведенийГражданство
Объект метаданных | Подсистема БСП | ТекстОшибки |
---|---|---|
РегистрСведений.Гражданство |
Управление доступом | Отсутствует предопределенный элемент РегистрСведенийГражданство в справочнике ИдентификаторыОбъектовМетаданных |
Данная ошибка была найдена через отчет Проверка внедрения БСП
, который является незаменимым помощником при внедрении этой подсистемы.
Добавление кода ограничения в модуль менеджера объектов метаданных
О том как писать тексты ограничений очень подробно раскрыто в документации к БСП, мне от себя добавить нечего. Все ссылки есть в начале статьи.
Единственное, что добавлю - упоминал ранее обработку из инструментов разработчика БСП УправлениеДоступом
. В неё можно вставлять текст ограничения и проверять, правильно ли он написан
- Справочник "Организации"
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Ссылка)"; КонецПроцедуры
- Справочник "Физические лица"
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "ПрисоединитьДополнительныеТаблицы |ЭтотСписок КАК ЭтотСписок | |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИстория КАК КадроваяИстория | ПО КадроваяИстория.ФизическоеЛицо = ЭтотСписок.Ссылка |; |РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(КадроваяИстория.Организация)"; КонецПроцедуры
- Документ "Штатное расписание", реквизит шапки "Организация"
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(Организация)"; КонецПроцедуры
- Регистр сведений "Гражданство" - ищем организацию через регистр "КадроваяИстория". Если поле не заполнение, считаем, что чтение разрешено.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = "ПрисоединитьДополнительныеТаблицы |ЭтотСписок КАК ЭтотСписок | |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИстория КАК КадроваяИстория | ПО КадроваяИстория.ФизическоеЛицо = ЭтотСписок.ФизическоеЛицо |; |РазрешитьЧтениеИзменение |ГДЕ | ЗначениеРазрешено(КадроваяИстория.Организация, ПустаяСсылка КАК ИСТИНА)"; КонецПроцедуры
Мои ошибки всегда были связаны с синтаксисом ограничений, но все они легко вылавливались через отчет Проверка внедрения БСП
, а исправлял их потом через обработку УправлениеДоступом
.
Доработка форм объектов
Во все формы объектов необходимо будет вставить дополнительные обращения к подсистеме "Управление доступом" следующего вида
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// СтандартныеПодсистемы.УправлениеДоступом
УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.УправлениеДоступом
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// СтандартныеПодсистемы.УправлениеДоступом
УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
// Конец СтандартныеПодсистемы.УправлениеДоступом
КонецПроцедуры
Каюсь иногда забыл, но это легко ловилось запуском отчета Проверка внедрения БСП
.
Дорабатываем роли, добавляя в них шаблоны доступа и настройки доступа
В данном случае это надо вставлять либо на чтение, либо на добавление, изменение (в зависимости от настройки ваших ролей).
- Cправочник "Физические лица"
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениямРасширенный... #КонецЕсли
- Документ "Штатное расписание"
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям... #КонецЕсли
- Регистр сведений "Гражданство"
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляРегистра("ИдентификаторыОбъектовМетаданных.РегистрСведенийГражданство", "ФизическоеЛицо", "", "", "", "") #Иначе #ПоЗначениямРасширенный... #КонецЕсли
Основная ошибка - пропускал некоторые объекты при массовом изменение текстов ограничений. Это легко ловилось запуском отчета Проверка внедрения БСП
.
Заключение
На этом внедрение подсистемы заканчивается и можно проводить финальную проверку и завершать внедрение. Я специально как можно чаще упоминал отчет Проверка внедрения БСП
и обработку УправлениеДоступом
, так как считаю их незаменимыми помощниками при внедрении и доработке данной подсистемы.
Как всегда, спасибо коллегам из компании Омега за то, что разрешили поделиться материалом.
Спасибо за прочтение. С уважением, Вдовенко Сергей.