RLS в 1С (Record Level Security) — ограничение доступа к данным на уровне записей. Роль даёт право читать документ, а условие в роли отсекает строки, которые пользователю видеть не положено: чужие организации, склады, клиентов другого отдела. Механизм платформенный, но в типовых на БСП он спрятан за видами и группами доступа.
Где встречается задача:
Права с RLS задаются в роли для «Чтения», «Добавления», «Изменения» и «Удаления», у регистров — для «Чтения» и «Изменения». В конфигураторе откройте роль в ветке «Общие → Роли», выберите объект и право: под списком прав есть таблица «Ограничение доступа к данным». Туда пишут условие на языке запросов, помогает «Конструктор ограничений доступа к данным». Запись доступна, если условие для неё истинно. Как создать саму роль — в статье о ролях 1С.
#ИмяШаблона("параметр"); внутри работают #Параметр(N), #ИмяТекущейТаблицы, #ИмяТекущегоПраваДоступа и #Если … #Тогда … #КонецЕсли. Шаблон хранится в роли, его копируют в каждую роль, где он вызывается.Пример без БСП: документ ЗаявкаНаРасход с реквизитом Подразделение и регистр сведений ДоступКПодразделениям — объекты примера, в типовых их нет. Тексты для права «Чтение»:
// Роль «МенеджерПодразделения», Документ.ЗаявкаНаРасход, право «Чтение».
// Вариант 1. Короткая форма: поле таблицы и параметр сеанса.
Подразделение = &ТекущееПодразделение
// Вариант 2. Полная форма: псевдоним текущей таблицы, затем ГДЕ.
// Разрешённые подразделения лежат в регистре сведений
// ДоступКПодразделениям (измерения Пользователь, Подразделение).
Т ГДЕ Т.Подразделение В
(ВЫБРАТЬ
Доступ.Подразделение
ИЗ
РегистрСведений.ДоступКПодразделениям КАК Доступ
ГДЕ
Доступ.Пользователь = &ТекущийПользователь)
// Вариант 3. Шаблон «ПоПодразделению» на вкладке «Шаблоны ограничений».
// #Параметр(1) заменяется текстом первого параметра вызова.
Т ГДЕ Т.#Параметр(1) В
(ВЫБРАТЬ
Доступ.Подразделение
ИЗ
РегистрСведений.ДоступКПодразделениям КАК Доступ
ГДЕ
Доступ.Пользователь = &ТекущийПользователь)
// Вызов шаблона в ограничении права любого объекта с полем Подразделение:
#ПоПодразделению("Подразделение")
Параметры сеанса создают в ветке «Общие → Параметры сеанса», заполняют в модуле сеанса (контекстное меню корня конфигурации → «Открыть модуль сеанса»):
// Модуль сеанса своей конфигурации без БСП.
// Параметры сеанса (Общие → Параметры сеанса):
// ТекущийПользователь - СправочникСсылка.Пользователи;
// ТекущееПодразделение - СправочникСсылка.Подразделения.
// У справочника Пользователи есть реквизиты
// ИдентификаторПользователяИБ (УникальныйИдентификатор) и Подразделение.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Пользователь ИБ, под которым открыт сеанс.
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка КАК Ссылка,
| Пользователи.Подразделение КАК Подразделение
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ";
Запрос.УстановитьПараметр("ИдентификаторПользователяИБ",
ПользовательИБ.УникальныйИдентификатор);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка;
ПараметрыСеанса.ТекущееПодразделение = Выборка.Подразделение;
Иначе
// Пользователя нет в справочнике: пустые ссылки.
// Условие из варианта 1 пропустит только заявки без подразделения.
ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.ПустаяСсылка();
ПараметрыСеанса.ТекущееПодразделение = Справочники.Подразделения.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
Подразделение = &ТекущееПодразделение — короткая форма, когда у пользователя одно значение.Т ГДЕ Т.Подразделение В (ВЫБРАТЬ …) — полная форма с псевдонимом таблицы. Вложенный запрос попадает в каждый запрос к заявкам, поэтому первым измерением регистра ставьте Пользователь: по нему идёт отбор, с него начинается индекс.#ПоПодразделению("Подразделение") — одно условие на все таблицы с подразделением, правится в одном месте.ПользовательИБ.УникальныйИдентификатор — связь с элементом справочника; имя не годится, его переименуют. Пользователь не найден — пустые ссылки, и сотрудник видит только заявки без подразделения.В типовых на БСП — БП 3.0, УТ 11, КА 2, ERP 2 — в ролях стоят стандартные шаблоны библиотеки, логика вынесена в код, значения — в настройки:
СправочникСсылка.СтруктураПредприятия), «Группы партнеров», «Виды цен», «Группы номенклатуры», «Кассы».Связку «поле → вид доступа» задаёт программист: заказ клиента в УТ 11.4 и КА 2.5 проверяется по организации, складу, партнёру и подразделению.
Включается ограничение в «Настройках пользователей и прав» (в УТ 11.4 — раздел «НСИ и администрирование») флажком «Ограничивать доступ на уровне записей». Рядом поле «Вариант работы»:
#ПоЗначениям и #ПоНаборамЗначений. Сложные правила объект описывает наборами значений доступа: процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) в модуле объекта, подписка ЗаписатьНаборыЗначенийДоступа, регистр НаборыЗначенийДоступа. Внутри набора значения объединяются по И, наборы — по ИЛИ.#ДляОбъекта("") или #ДляРегистра(...). БСП заранее считает ключи доступа (регистры КлючиДоступаКОбъектам, КлючиДоступаКРегистрам), и запрос проверяет только ключ.Роли типовых поддерживают оба варианта: #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям(...) #КонецЕсли.
Настройка RLS в типовой начинается с администратора; программист нужен, когда готового разреза нет:
| Где задано ограничение | Кто меняет | Когда выбирать |
|---|---|---|
| Значения в группах доступа | Администратор | Разрез уже есть среди видов доступа: организации, склады, партнёры |
| Текст в модуле менеджера (БСП 3.x) | Программист | Свой объект на БСП или своё правило для типового объекта через расширение |
| Наборы значений доступа | Программист | Сложное правило в стандартном варианте или в БСП 2.x |
| Условие прямо в роли | Программист | Конфигурация без БСП |
Свой документ в конфигурации на БСП 3.x, кроме процедуры ниже, регистрируют в УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа, тип ссылки добавляют в определяемый тип ВладелецЗначенийКлючейДоступа, тип объекта — в ВладелецЗначенийКлючейДоступаДокумент, а в ролях ставят #ДляОбъекта("").
// Модуль менеджера своего документа ЗаявкаНаРасход, конфигурация на БСП 3.x.
// Реквизиты: Организация (СправочникСсылка.Организации),
// Подразделение (СправочникСсылка.СтруктураПредприятия - тип вида доступа
// «Подразделения» в УТ 11 и КА 2), Автор и Ответственный (СправочникСсылка.Пользователи).
// СтандартныеПодсистемы.УправлениеДоступом
// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
// Чтение: организация разрешена в группах доступа пользователя и при этом
// разрешено подразделение или пользователь указан ответственным.
// Изменение: сверх права чтения - только автор или ответственный.
Ограничение.Текст =
"РазрешитьЧтение
|ГДЕ
| ЗначениеРазрешено(Организация)
| И (ЗначениеРазрешено(Подразделение)
| ИЛИ ЭтоАвторизованныйПользователь(Ответственный))
|;
|РазрешитьИзменениеЕслиРазрешеноЧтение
|ГДЕ
| ЭтоАвторизованныйПользователь(Автор)
| ИЛИ ЭтоАвторизованныйПользователь(Ответственный)";
// Пустая строка: внешним пользователям документ недоступен.
Ограничение.ТекстДляВнешнихПользователей = "";
КонецПроцедуры
// Конец СтандартныеПодсистемы.УправлениеДоступом
«Только свои заказы» в типовой группами доступа не настроишь, но и снимать её с поддержки не нужно — хватит расширения конфигурации. Реквизит Менеджер заказа клиента в УТ 11.4 и КА 2.5 имеет тип СправочникСсылка.Пользователи:
// Расширение для УТ 11, КА 2, ERP 2 (БСП 3.x, вариант работы «Производительный»).
// Заимствован документ ЗаказКлиента, обработчик - в его модуле менеджера.
// Роль ЧтениеВсехЗаказовКлиентов создана в расширении без прав:
// её включают в профиль тех, кому нужны все заказы.
&После("ПриЗаполненииОграниченияДоступа")
Процедура Доработка_ПриЗаполненииОграниченияДоступа(Ограничение)
// Типовой текст - одна секция РазрешитьЧтениеИзменение с условиями через И,
// поэтому своё условие дописываем в конец. После обновлений сверяйте текст.
Ограничение.Текст = Ограничение.Текст + "
| И (ЭтоАвторизованныйПользователь(Менеджер)
| ИЛИ РольДоступна(ЧтениеВсехЗаказовКлиентов))";
КонецПроцедуры
ЗначениеРазрешено(Организация) — значение разрешено в группах доступа; тип поля должен совпадать с типом одного из видов доступа.ЭтоАвторизованныйПользователь(Ответственный) — поле равно текущему пользователю.РазрешитьИзменениеЕслиРазрешеноЧтение — секция после точки с запятой: менять можно только видимое и только при её условии.РольДоступна(ЧтениеВсехЗаказовКлиентов) — исключение для руководителей; заказы с пустым менеджером видят только они.ВЫБРАТЬ и внутренних соединений в языке нет: таблицы подключают секцией ПрисоединитьДополнительныеТаблицы через ЛЕВОЕ СОЕДИНЕНИЕ, для табличных частей есть ДляВсехСтрок и ДляОднойИзСтрок.#ПоЗначениям, и текст из модуля менеджера на ограничение заказа не влияет.В режиме «все» платформа не прячет чужие записи: если запросу или чтению объекта нужна запрещённая строка, выполнение прерывается с «У пользователя недостаточно прав на исполнение операции над базой данных». В режиме «разрешённые», который включает ВЫБРАТЬ РАЗРЕШЕННЫЕ, такие строки молча выпадают из результата.
РАЗРЕШЕННЫЕ относится к одному запросу, а не ко всему пакету: пишите его в каждом запросе, читающем ограниченные таблицы. В схеме отчёта «Ведомость по товарам на складах» УТ 11.4 слово повторяется в запросах пакета.РАЗРЕШЕННЫЕ.Заказ.Партнер.Наименование в коде читает объект партнёра; скрыт партнёр — снова «У пользователя недостаточно прав на исполнение операции над базой данных».Результат запроса под конкретным пользователем удобно смотреть в консоли запросов, запущенной под его учётной записью. Для кода — две функции серверного общего модуля:
// Общий модуль РаботаСДоступомСервер: флажок «Сервер», остальные сняты.
// Проверяет, проходит ли объект ограничения доступа текущего пользователя.
// Вызывайте перед ПолучитьОбъект() и чтением реквизитов через точку.
//
// Параметры:
// Ссылка - ЛюбаяСсылка - документ, элемент справочника и т. п.
//
// Возвращаемое значение:
// Булево - Истина, если пользователь видит объект.
//
Функция ОбъектДоступенДляЧтения(Ссылка) Экспорт
ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ИСТИНА КАК Доступен
|ИЗ
| " + ИмяТаблицы + " КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции
// Считает, сколько записей таблицы скрыто от текущего пользователя.
// Для отладки RLS: вызывать в сеансе сотрудника, который «не видит» данные.
//
// Параметры:
// ПолноеИмяТаблицы - Строка - например, "Документ.ЗаказКлиента".
//
// Возвращаемое значение:
// Структура - с полями Всего, Видно, Скрыто.
//
Функция СкрытоОграничениемДоступа(ПолноеИмяТаблицы) Экспорт
Запрос = Новый Запрос;
// В привилегированном режиме RLS не действует: полное количество.
УстановитьПривилегированныйРежим(Истина);
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество ИЗ " + ПолноеИмяТаблицы;
Всего = Запрос.Выполнить().Выгрузить()[0].Количество;
УстановитьПривилегированныйРежим(Ложь);
// Тот же запрос с РАЗРЕШЕННЫЕ в обычном режиме: только видимые записи.
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ КОЛИЧЕСТВО(*) КАК Количество ИЗ " + ПолноеИмяТаблицы;
Видно = Запрос.Выполнить().Выгрузить()[0].Количество;
Возврат Новый Структура("Всего, Видно, Скрыто", Всего, Видно, Всего - Видно);
КонецФункции
Первая функция страхует ПолучитьОбъект() и чтение реквизитов через точку. Вторая включает и выключает привилегированный режим парой вызовов; из привилегированного кода числа совпадут. В БСП вместо первой есть УправлениеДоступом.ЧтениеРазрешено(Ссылка), а кто что видит, покажет отчёт «Анализ прав доступа», вариант «Права пользователей на таблицу».
ЭтоАвторизованныйПользователь строит ключи по пользователям — их становится больше.РАЗРЕШЕННЫЕ: у администратора работает, у менеджера падает. Проверьте каждый запрос пакета и обращения через точку.ВЫБРАТЬ. Под заголовком — список ошибок и сам текст.РольДоступна или отключено расширение.Права доступа к документу в роли открывают таблицу целиком: «может читать заказы клиентов». RLS сужает право до строк: «…только по своим складам».
В типовой на БСП — да, если хватает готовых видов доступа: включите ограничение на уровне записей, настройте вид доступа в профиле и значения в группе доступа. Пошагово — в статье о правах доступа 1С.
Как в УТ 11 и КА 2: та же подсистема БСП, те же варианты работы и общие виды доступа — «Организации», «Склады», «Подразделения», «Группы партнеров». Код из статьи переносится, имена полей сверяйте с релизом.
В роли полных прав ограничений нет, а права ролей складываются. Проверяйте RLS под сотрудником или под тестовым пользователем с тем же профилем.
«Только свои заказы», ограничения для собственных документов, разбор, почему сотрудник не видит нужное или видит лишнее, — работа на стыке платформы и БСП, где ошибка открывает чужие данные. Опишите задачу на странице настройки прав доступа 1С или сразу разместите задачу — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.