Логотип 2А СОФТ

Разграничение прав в 1С: основы RLS и готовый шаблон на простом примере

1С

Легкий старт в 1С: RLS и шаблоны прав для начинающих. Всё об основах RLS и шаблонах ограничений в 1С. Два простых примера настройки прав доступа на уровне записей для начинающих разработчиков и администраторов.

6 мин
Доступно для: Программист
статья

Просто о сложных вещах: разбираемся с RLS и шаблонами ограничений в 1С на пальцах

Рано или поздно каждая команда, которая начала дорабатывать типовую конфигурацию 1С, сталкивается с необходимостью настроить права доступа в 1С. Как правило после внедрения дополнительных возможностей стандартных ролей конфигурации становится недостаточно, а создание простых ролей (без RLS) позволяет лишь целиком открыть или закрыть чтение, запись документов/справочников, однако бизнес требует гибкости, например, чтобы менеджеры из филиала в Москве видели только свои документы, а менеджеры из Санкт-Петербурга — только свои.

Для этого в 1С существует механизм RLS (Record Level Security) — ограничение прав на уровне записей. Многих новичков пугает эта аббревиатура из-за сложных конструкций на языке запросов. В этой статье мы максимально просто разберем, как устроены базовые RLS и как готовые шаблоны спасают от рутины в разработке прав.

Что такое RLS и как это работает?

Представьте, что база данных 1С — это большой шкаф с документами (например, заполненный документами «Реализация товаров и услуг»).

  • Обычные роли определяют, может ли пользователь вообще подойти к этому шкафу и открыть его.
  • Механизм RLS — это невидимый охранник, который стоит у шкафа. Когда пользователь открывает список, охранник мгновенно перебирает все папки и показывает человеку только те, в которых в графе «Организация» указан его родной филиал. Остальные документы для пользователя просто «исчезают» — их нет ни в списках, ни в отчетах.

⚠️ Главный принцип RLS: ограничение срабатывает непосредственно при обращении к данным. Платформа 1С сама незаметно добавляет к любому запросу специальное условие ГДЕ….

Простой RLS: пишем условие «в лоб»

В самом простом варианте ограничение пишется в Конфигураторе 1С прямо на вкладке «Права» конкретной роли. Вы выбираете объект, например, справочник Организации, находите право Чтение и в поле «Ограничение доступа» пишете условие.

Приступим. Наши действия по шагам:

Шаг 1
В Конфигураторе создаем новую роль “БазоваяРоль”

Шаг 2
Для справочника Организации добавляем в право Чтение в поле «Ограничение доступа» условие: ГДЕ Ссылка В (&РазрешенныеОрганизации)

Создаем новую роль - “БазоваяРоль”

Шаг 3
В Шаге 2 мы использовали параметр запроса &РазрешенныеОрганизации. Данный параметр должен полностью совпасть по имени с Параметром сеанса - “РазрешенныеОрганизации”. Составленное нами ограничение ГДЕ предполагает, что параметр сеанса будет с типом “ФиксированныйМассив”, состоящий из элементов “СправочникСсылка.Организации”. Создадим этот параметр сеанса, “РазрешенныеОрганизации”, в нашей конфигурации.

Шаг 4
Мы добавляли роль в основную конфигурацию на Шаге 1 и туда же добавили параметр сеанса на Шаге 3. Все это можно сделать через механизм Расширений. Однако, следует помнить что:

  • новые объекты, добавленные в Расширение, не видны в другом Расширении
  • ошибка в Расширении отключит данное Расширение. Ошибка в основной конифигурации вызовет Исключение и остановит выполнение кода, в нашем случае выполнение запроса.
Добавлять ли все объекты в Расширение или снять конфигурацию с поддержки - это решение за вами. Исходите из условий конкретной задачи, стоящей перед вами. В текущем же примере, мы создавали новые объекты в основной конфигурации, а вот параметр сеанса заполним в Расширении. Добавляем Расширение.

Шаг 5
В созданном на Шаге 4 Расширении в модуле сеанса напишем следующий код:

 1&После("УстановкаПараметровСеанса")
 2Процедура Расш_УстановкаПараметровСеанса(ИменаПараметровСеанса)
 3	Если РольДоступна("БазоваяРоль") Тогда 
 4	    Если ИменаПараметровСеанса = Неопределено 
 5			Или ИменаПараметровСеанса.Найти("РазрешенныеОрганизации") <> Неопределено Тогда
 6			
 7			Запрос = Новый Запрос;
 8			Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
 9			               |	ГруппыДоступаЗначенияДоступа.ЗначениеДоступа КАК ЗначениеДоступа,
10			               |	ТИПЗНАЧЕНИЯ(ГруппыДоступаЗначенияДоступа.ЗначениеДоступа) КАК ТипЗначениеДоступа
11			               |ИЗ
12			               |	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
13			               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
14			               |		ПО ГруппыДоступаПользователи.Ссылка = ГруппыДоступаЗначенияДоступа.Ссылка
15			               |ГДЕ
16			               |	ГруппыДоступаПользователи.Пользователь = &Пользователь
17			               |	И НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления";
18				
19			Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);	
20			
21			Выборка = Запрос.Выполнить().Выбрать();
22			
23			Массив_РазрешенныеОрганизации = Новый Массив;
24			
25			Пока Выборка.Следующий() Цикл
26				Если Выборка.ТипЗначениеДоступа = Тип("СправочникСсылка.Организации") Тогда      
27						Массив_РазрешенныеОрганизации.Добавить(Выборка.ЗначениеДоступа);
28				КонецЕсли;
29			КонецЦикла;
30
31			ФиксированныйМассив_РазрешенныеОрганизации = Новый ФиксированныйМассив(Массив_РазрешенныеОрганизации);
32	        
33			ПараметрыСеанса.РазрешенныеОрганизации = ФиксированныйМассив_РазрешенныеОрганизации;
34
35		КонецЕсли;
36	КонецЕсли;
37	
38КонецПроцедуры

Выполнение После УстановкаПараметровСеанса гарантирует нам что типовые Параметры сеанса уже инициализированы. Нам нужен всего один из них: ТекущийПользователь.
Логику отбора можно использовать любую вам подходящую. Здесь же, в примере, мы используем типовые настройки Групп доступа. Возьмем Организации, указанные в Группах доступа текущего пользователя, а также допустим, что у нас в Группах доступа всегда Значения доступа: “Все запрещены”, кроме указанных.
Такое упрощение позволит сократить код, что поможет лучше понять пример, не отвлекаясь от основной темы сатьи.

–

Это все. Простой RLS настроен. Запустим пользовательский режим “1С:Предприятие” и посмотрим что произойдет. Платформа будет подставлять это условие каждый раз, когда пользователь с этой ролью захочет посмотреть Организации. В итоге он увидит только те Организации, которые ему выданы в Группе доступа. Помните, что в 1С реализован “мягкий” режим безопасности, т.е. если объект разрешен в любой роли, то объект разрешен!
Также крайне желательно, чтобы не было пересечений по разрешаемым объектам в разных ролях, назначенных одному пользователю. Отсутствие таких пересечений - залог производительной системы!

Минусы «простого» RLS перед шаблоном RLS:

  1. Если у вас 50 видов документов и для них нужно ограничить доступ по Организации, придется писать этот код 50 раз.
  2. Если логика изменится (например, нужно будет показывать документы ответственного + организация), придется вручную переписывать код во всех 50 местах. Чтобы не заниматься этой рутиной, в Платформе 1С предусмотрели шаблоны.

Простой шаблон RLS: пишем один раз, используем везде

Шаблон RLS — это, по сути, функция (или макрос). Вы один раз пишете сложную логику ограничения, даете ей понятное имя, а потом просто «вызываете» этот шаблон для нужных документов и справочников. В типовых конфигурациях (ERP, КА, УТ, БП), созданных на базе БСП (Библиотеки стандартных подсистем), разработчики 1С уже написали тонны готовых шаблонов. Самые популярные из них:

  • #ПоЗначениям
  • #ДляОбъекта
  • #ДляРегистра

Как работает шаблон на практике? Вместо того чтобы городить длинный запрос для каждого документа, в поле ограничения прав вы пишете короткую строчку вызова шаблона. Платформа 1С видит решетку #, понимает, что это шаблон, находит его исходный код у Роли, подставляет туда имя вашего реквизита (в данном случае “Организация”) и сама разворачивает это в полноценное, надежное ограничение прав. Если завтра руководство решит изменить правила игры и добавить к проверке организаций еще и проверку подразделений, разработчику шаблона достаточно будет поправить код в одном месте — внутри самого шаблона. У всех документов права обновятся автоматически.

Шаг 1
Создаем новый шаблон “ШаблонБазовый” в роли “БазоваяРоль” и задаем в нем следующий Текст шаблона:

 1Таблица
 2ИЗ 
 3	#ТекущаяТаблица КАК Таблица
 4	ГДЕ 
 5		Истина
 6
 7#Если "#Параметр(1)" <> "" #Тогда
 8		И Таблица.#Параметр(1) В (&РазрешенныеОрганизации)
 9#КонецЕсли
10
11#Если "#Параметр(2)" <> "" #Тогда
12		//Будущий блок
13#КонецЕсли
Создаем шаблон - “ШаблонБазовый”

Шаг 2
Созданный шаблон на Шаге 1 назначим любому документу, где есть Организация. Например, документу ЗаказНаВнутреннееПотребление. Вызовем шаблон RLS следующей строкой кода:

1#ШаблонБазовый("Организация", "")
Вызов шаблона

–

Простой шаблон RLS готов, можно запускать 1С в режиме 1С:Предприятие и смотреть полученный резудьтат.

Центр реальной автоматизации 1С

Нужно обновить, доработать или настроить вашу 1С под новые требования?

Эксперты ООО «2А СОФТ» сертифицированы фирмой 1С по технологии «Реальная автоматизация»

  • Повышаем эффективность реальных бизнес-процессов компании, используя преимущества платформы 1С:Предприятие
  • Накопленный многолетний опыт работы позволяет нам решать задачи любой сложности

С чего начать новичку?

Если вы работаете в типовой конфигурации, не изобретайте велосипед.

  1. Используйте БСП: В режиме «1С:Предприятие» зайдите в настройки прав (Группы доступа) и настройте ограничения через стандартный интерфейс (по организациям, складам или контрагентам). БСП сама задействует нужные шаблоны «под капотом».
  2. Изучайте готовое: Если вам нужно создать свою роль в конфигураторе, откройте любую типовую роль и посмотрите, как там оформлены ограничения. Скопируйте вызов шаблона к себе.
  3. Помните про производительность: Каждое условие RLS — это дополнительная нагрузка на систему. Старайтесь делать условия максимально простыми и не накладывайте RLS на высоконагруженные регистры без реальной необходимости.

Резюме

RLS — это мощный инструмент безопасности, а шаблоны RLS — это способ держать этот инструмент в чистоте и порядке.
Не бойтесь открывать Конфигуратор: базовые ограничения строятся на стандартных запросах, а использование шаблонов экономит кучу времени и защищает от ошибок.