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

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

- Cправочник "Физические лица"
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениямРасширенный... #КонецЕсли - Документ "Штатное расписание"
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям... #КонецЕсли - Регистр сведений "Гражданство"
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляРегистра("ИдентификаторыОбъектовМетаданных.РегистрСведенийГражданство", "ФизическоеЛицо", "", "", "", "") #Иначе #ПоЗначениямРасширенный... #КонецЕсли
Основная ошибка - пропускал некоторые объекты при массовом изменение текстов ограничений. Это легко ловилось запуском отчета Проверка внедрения БСП.
Заключение
На этом внедрение подсистемы заканчивается и можно проводить финальную проверку и завершать внедрение. Я специально как можно чаще упоминал отчет Проверка внедрения БСП и обработку УправлениеДоступом, так как считаю их незаменимыми помощниками при внедрении и доработке данной подсистемы.
Как всегда, спасибо коллегам из компании Омега за то, что разрешили поделиться материалом.
Спасибо за прочтение. С уважением, Вдовенко Сергей.
Вступайте в нашу телеграмм-группу Инфостарт