RLS в 1С: ограничение доступа на уровне записей

Дата: 06.10.2026 16:54:16
RLS
Права доступа
Роли
БСП
Управление доступом
Язык запросов
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

RLS в 1С (Record Level Security) — ограничение доступа к данным на уровне записей. Роль даёт право читать документ, а условие в роли отсекает строки, которые пользователю видеть не положено: чужие организации, склады, клиентов другого отдела. Механизм платформенный, но в типовых на БСП он спрятан за видами и группами доступа.

Где встречается задача:

  • бухгалтер филиала видит только свою организацию, кладовщик — свой склад;
  • менеджер видит только заказы, где он указан менеджером;
  • в собственный документ нужны ограничения прав доступа «как в типовой»;
  • отчёт падает с «У пользователя недостаточно прав на исполнение операции над базой данных», а списки после включения ограничений тормозят.

Как работает RLS в 1С 8.3

Права с RLS задаются в роли для «Чтения», «Добавления», «Изменения» и «Удаления», у регистров — для «Чтения» и «Изменения». В конфигураторе откройте роль в ветке «Общие → Роли», выберите объект и право: под списком прав есть таблица «Ограничение доступа к данным». Туда пишут условие на языке запросов, помогает «Конструктор ограничений доступа к данным». Запись доступна, если условие для неё истинно. Как создать саму роль — в статье о ролях 1С.

  • Роли складываются по ИЛИ. Если одна роль даёт чтение с условием, а другая без, пользователь видит всё. Ограничения разных полей одной таблицы объединяются по И.
  • «Кто я» берут из параметров сеанса: 1С рекомендует их именно для ограничений, так быстрее.
  • Шаблоны пишут на вкладке «Шаблоны ограничений» роли и вызывают как #ИмяШаблона("параметр"); внутри работают #Параметр(N), #ИмяТекущейТаблицы, #ИмяТекущегоПраваДоступа и #Если … #Тогда … #КонецЕсли. Шаблон хранится в роли, его копируют в каждую роль, где он вызывается.
  • Поля и измерения. У объектных таблиц и регистров сведений можно задать разные условия для разных полей, у регистров накопления и бухгалтерии доступ режут по измерениям.
  • Привилегированный режим отключает проверку прав вместе с RLS.

Пример без БСП: документ ЗаявкаНаРасход с реквизитом Подразделение и регистр сведений ДоступКПодразделениям — объекты примера, в типовых их нет. Тексты для права «Чтение»:

// Роль «МенеджерПодразделения», Документ.ЗаявкаНаРасход, право «Чтение».

// Вариант 1. Короткая форма: поле таблицы и параметр сеанса.
Подразделение = &ТекущееПодразделение

// Вариант 2. Полная форма: псевдоним текущей таблицы, затем ГДЕ.
// Разрешённые подразделения лежат в регистре сведений
// ДоступКПодразделениям (измерения Пользователь, Подразделение).
Т ГДЕ Т.Подразделение В
	(ВЫБРАТЬ
		Доступ.Подразделение
	ИЗ
		РегистрСведений.ДоступКПодразделениям КАК Доступ
	ГДЕ
		Доступ.Пользователь = &ТекущийПользователь)

// Вариант 3. Шаблон «ПоПодразделению» на вкладке «Шаблоны ограничений».
// #Параметр(1) заменяется текстом первого параметра вызова.
Т ГДЕ Т.#Параметр(1) В
	(ВЫБРАТЬ
		Доступ.Подразделение
	ИЗ
		РегистрСведений.ДоступКПодразделениям КАК Доступ
	ГДЕ
		Доступ.Пользователь = &ТекущийПользователь)

// Вызов шаблона в ограничении права любого объекта с полем Подразделение:
#ПоПодразделению("Подразделение")

Параметры сеанса создают в ветке «Общие → Параметры сеанса», заполняют в модуле сеанса (контекстное меню корня конфигурации → «Открыть модуль сеанса»):

// Модуль сеанса своей конфигурации без БСП.
// Параметры сеанса (Общие → Параметры сеанса):
//   ТекущийПользователь - СправочникСсылка.Пользователи;
//   ТекущееПодразделение - СправочникСсылка.Подразделения.
// У справочника Пользователи есть реквизиты
// ИдентификаторПользователяИБ (УникальныйИдентификатор) и Подразделение.

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

	// Пользователь ИБ, под которым открыт сеанс.
	ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Пользователи.Ссылка КАК Ссылка,
	|	Пользователи.Подразделение КАК Подразделение
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ";
	Запрос.УстановитьПараметр("ИдентификаторПользователяИБ",
		ПользовательИБ.УникальныйИдентификатор);
	Выборка = Запрос.Выполнить().Выбрать();

	Если Выборка.Следующий() Тогда
		ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка;
		ПараметрыСеанса.ТекущееПодразделение = Выборка.Подразделение;
	Иначе
		// Пользователя нет в справочнике: пустые ссылки.
		// Условие из варианта 1 пропустит только заявки без подразделения.
		ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.ПустаяСсылка();
		ПараметрыСеанса.ТекущееПодразделение = Справочники.Подразделения.ПустаяСсылка();
	КонецЕсли;

КонецПроцедуры

Разбор ключевых строк

  • Подразделение = &ТекущееПодразделение — короткая форма, когда у пользователя одно значение.
  • Т ГДЕ Т.Подразделение В (ВЫБРАТЬ …) — полная форма с псевдонимом таблицы. Вложенный запрос попадает в каждый запрос к заявкам, поэтому первым измерением регистра ставьте Пользователь: по нему идёт отбор, с него начинается индекс.
  • #ПоПодразделению("Подразделение") — одно условие на все таблицы с подразделением, правится в одном месте.
  • ПользовательИБ.УникальныйИдентификатор — связь с элементом справочника; имя не годится, его переименуют. Пользователь не найден — пустые ссылки, и сотрудник видит только заявки без подразделения.

Ограничения в БСП: виды доступа, профили и группы

В типовых на БСП — БП 3.0, УТ 11, КА 2, ERP 2 — в ролях стоят стандартные шаблоны библиотеки, логика вынесена в код, значения — в настройки:

  • Вид доступа — разрез с типом значений. В УТ 11.4: «Организации», «Склады», «Подразделения» (СправочникСсылка.СтруктураПредприятия), «Группы партнеров», «Виды цен», «Группы номенклатуры», «Кассы».
  • Профиль групп доступа — роли и способ настройки каждого вида, например «Все запрещены, исключения назначаются в группах доступа».
  • Группа доступа — участники и на вкладке «Ограничения доступа» разрешённые значения.

Связку «поле → вид доступа» задаёт программист: заказ клиента в УТ 11.4 и КА 2.5 проверяется по организации, складу, партнёру и подразделению.

Включается ограничение в «Настройках пользователей и прав» (в УТ 11.4 — раздел «НСИ и администрирование») флажком «Ограничивать доступ на уровне записей». Рядом поле «Вариант работы»:

  • Стандартный — шаблоны #ПоЗначениям и #ПоНаборамЗначений. Сложные правила объект описывает наборами значений доступа: процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) в модуле объекта, подписка ЗаписатьНаборыЗначенийДоступа, регистр НаборыЗначенийДоступа. Внутри набора значения объединяются по И, наборы — по ИЛИ.
  • Производительный — универсальное ограничение БСП 3.x: текст правила в модуле менеджера, в ролях #ДляОбъекта("") или #ДляРегистра(...). БСП заранее считает ключи доступа (регистры КлючиДоступаКОбъектам, КлючиДоступаКРегистрам), и запрос проверяет только ключ.

Роли типовых поддерживают оба варианта: #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда #ДляОбъекта("") #Иначе #ПоЗначениям(...) #КонецЕсли.

Когда ограничение пишут в коде, а когда хватает групп доступа

Настройка RLS в типовой начинается с администратора; программист нужен, когда готового разреза нет:

Где задано ограничениеКто меняетКогда выбирать
Значения в группах доступаАдминистраторРазрез уже есть среди видов доступа: организации, склады, партнёры
Текст в модуле менеджера (БСП 3.x)ПрограммистСвой объект на БСП или своё правило для типового объекта через расширение
Наборы значений доступаПрограммистСложное правило в стандартном варианте или в БСП 2.x
Условие прямо в ролиПрограммистКонфигурация без БСП

Свой документ в конфигурации на БСП 3.x, кроме процедуры ниже, регистрируют в УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа, тип ссылки добавляют в определяемый тип ВладелецЗначенийКлючейДоступа, тип объекта — в ВладелецЗначенийКлючейДоступаДокумент, а в ролях ставят #ДляОбъекта("").

// Модуль менеджера своего документа ЗаявкаНаРасход, конфигурация на БСП 3.x.
// Реквизиты: Организация (СправочникСсылка.Организации),
// Подразделение (СправочникСсылка.СтруктураПредприятия - тип вида доступа
// «Подразделения» в УТ 11 и КА 2), Автор и Ответственный (СправочникСсылка.Пользователи).

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	// Чтение: организация разрешена в группах доступа пользователя и при этом
	// разрешено подразделение или пользователь указан ответственным.
	// Изменение: сверх права чтения - только автор или ответственный.
	Ограничение.Текст =
	"РазрешитьЧтение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)
	|	И (ЗначениеРазрешено(Подразделение)
	|		ИЛИ ЭтоАвторизованныйПользователь(Ответственный))
	|;
	|РазрешитьИзменениеЕслиРазрешеноЧтение
	|ГДЕ
	|	ЭтоАвторизованныйПользователь(Автор)
	|	ИЛИ ЭтоАвторизованныйПользователь(Ответственный)";

	// Пустая строка: внешним пользователям документ недоступен.
	Ограничение.ТекстДляВнешнихПользователей = "";

КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

«Только свои заказы» в типовой группами доступа не настроишь, но и снимать её с поддержки не нужно — хватит расширения конфигурации. Реквизит Менеджер заказа клиента в УТ 11.4 и КА 2.5 имеет тип СправочникСсылка.Пользователи:

// Расширение для УТ 11, КА 2, ERP 2 (БСП 3.x, вариант работы «Производительный»).
// Заимствован документ ЗаказКлиента, обработчик - в его модуле менеджера.
// Роль ЧтениеВсехЗаказовКлиентов создана в расширении без прав:
// её включают в профиль тех, кому нужны все заказы.

&После("ПриЗаполненииОграниченияДоступа")
Процедура Доработка_ПриЗаполненииОграниченияДоступа(Ограничение)

	// Типовой текст - одна секция РазрешитьЧтениеИзменение с условиями через И,
	// поэтому своё условие дописываем в конец. После обновлений сверяйте текст.
	Ограничение.Текст = Ограничение.Текст + "
	|	И (ЭтоАвторизованныйПользователь(Менеджер)
	|		ИЛИ РольДоступна(ЧтениеВсехЗаказовКлиентов))";

КонецПроцедуры

Разбор: язык ограничений БСП

  • ЗначениеРазрешено(Организация) — значение разрешено в группах доступа; тип поля должен совпадать с типом одного из видов доступа.
  • ЭтоАвторизованныйПользователь(Ответственный) — поле равно текущему пользователю.
  • РазрешитьИзменениеЕслиРазрешеноЧтение — секция после точки с запятой: менять можно только видимое и только при её условии.
  • РольДоступна(ЧтениеВсехЗаказовКлиентов) — исключение для руководителей; заказы с пустым менеджером видят только они.
  • ВЫБРАТЬ и внутренних соединений в языке нет: таблицы подключают секцией ПрисоединитьДополнительныеТаблицы через ЛЕВОЕ СОЕДИНЕНИЕ, для табличных частей есть ДляВсехСтрок и ДляОднойИзСтрок.
  • Доработка из расширения работает только в производительном варианте: в стандартном роль заказа берёт ветку #ПоЗначениям, и текст из модуля менеджера на ограничение заказа не влияет.

РАЗРЕШЕННЫЕ в запросах и отчётах

В режиме «все» платформа не прячет чужие записи: если запросу или чтению объекта нужна запрещённая строка, выполнение прерывается с «У пользователя недостаточно прав на исполнение операции над базой данных». В режиме «разрешённые», который включает ВЫБРАТЬ РАЗРЕШЕННЫЕ, такие строки молча выпадают из результата.

  • РАЗРЕШЕННЫЕ относится к одному запросу, а не ко всему пакету: пишите его в каждом запросе, читающем ограниченные таблицы. В схеме отчёта «Ведомость по товарам на складах» УТ 11.4 слово повторяется в запросах пакета.
  • Динамический список сам показывает только разрешённые строки: в УТ 11.4 произвольный запрос списка заказов клиентов написан без РАЗРЕШЕННЫЕ.
  • Заказ.Партнер.Наименование в коде читает объект партнёра; скрыт партнёр — снова «У пользователя недостаточно прав на исполнение операции над базой данных».
  • Итоги отчётов считаются по видимым строкам, поэтому у менеджера и главбуха они разные — это не ошибка.

Результат запроса под конкретным пользователем удобно смотреть в консоли запросов, запущенной под его учётной записью. Для кода — две функции серверного общего модуля:

// Общий модуль РаботаСДоступомСервер: флажок «Сервер», остальные сняты.

// Проверяет, проходит ли объект ограничения доступа текущего пользователя.
// Вызывайте перед ПолучитьОбъект() и чтением реквизитов через точку.
//
// Параметры:
//  Ссылка - ЛюбаяСсылка - документ, элемент справочника и т. п.
//
// Возвращаемое значение:
//  Булево - Истина, если пользователь видит объект.
//
Функция ОбъектДоступенДляЧтения(Ссылка) Экспорт

	ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	|	ИСТИНА КАК Доступен
	|ИЗ
	|	" + ИмяТаблицы + " КАК Т
	|ГДЕ
	|	Т.Ссылка = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка", Ссылка);

	Возврат Не Запрос.Выполнить().Пустой();

КонецФункции

// Считает, сколько записей таблицы скрыто от текущего пользователя.
// Для отладки RLS: вызывать в сеансе сотрудника, который «не видит» данные.
//
// Параметры:
//  ПолноеИмяТаблицы - Строка - например, "Документ.ЗаказКлиента".
//
// Возвращаемое значение:
//  Структура - с полями Всего, Видно, Скрыто.
//
Функция СкрытоОграничениемДоступа(ПолноеИмяТаблицы) Экспорт

	Запрос = Новый Запрос;

	// В привилегированном режиме RLS не действует: полное количество.
	УстановитьПривилегированныйРежим(Истина);
	Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество ИЗ " + ПолноеИмяТаблицы;
	Всего = Запрос.Выполнить().Выгрузить()[0].Количество;
	УстановитьПривилегированныйРежим(Ложь);

	// Тот же запрос с РАЗРЕШЕННЫЕ в обычном режиме: только видимые записи.
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ КОЛИЧЕСТВО(*) КАК Количество ИЗ " + ПолноеИмяТаблицы;
	Видно = Запрос.Выполнить().Выгрузить()[0].Количество;

	Возврат Новый Структура("Всего, Видно, Скрыто", Всего, Видно, Всего - Видно);

КонецФункции

Первая функция страхует ПолучитьОбъект() и чтение реквизитов через точку. Вторая включает и выключает привилегированный режим парой вызовов; из привилегированного кода числа совпадут. В БСП вместо первой есть УправлениеДоступом.ЧтениеРазрешено(Ссылка), а кто что видит, покажет отчёт «Анализ прав доступа», вариант «Права пользователей на таблицу».

Влияние на производительность

  • Условие роли попадает в каждый запрос к таблице — в списки, формы выбора, отчёты. Поле условия индексируйте, «кто я» берите из параметров сеанса, а не вложенным запросом, и избегайте в ограничении обращений через точку: каждое — лишнее соединение.
  • Стандартный вариант БСП достраивает к запросу вложенные запросы к группам доступа и их значениям: чем больше видов доступа в условии, тем тяжелее запрос.
  • Производительный вариант переносит расчёт на запись: подписка «Проверить доступ при записи…» обновляет устаревший ключ объекта, а запрос сверяет только ключ. Подсказка в УТ 11.4 советует этот вариант для клиент-серверной базы; в многопользовательской файловой он может ограничивать одновременную работу.
  • После переключения варианта ключи пересчитывает регламентное задание «Обновление доступа на уровне записей», ход виден по одноимённой ссылке в настройках.
  • ЭтоАвторизованныйПользователь строит ключи по пользователям — их становится больше.

Типичные ошибки

  • «У пользователя недостаточно прав на исполнение операции над базой данных» в отчёте или обработке. Если же текст «Нарушение прав доступа!», в ролях нет права на сам объект — тут поможет только роль. В запросе нет РАЗРЕШЕННЫЕ: у администратора работает, у менеджера падает. Проверьте каждый запрос пакета и обращения через точку.
  • Ограничение «не работает». Есть другая роль на ту же таблицу без условия, или код идёт в привилегированном режиме. В БСП — снят флажок «Ограничивать доступ на уровне записей» или вид доступа в профиле «Все разрешены».
  • «Ошибка в ограничении доступа пользователей к списку "Документ.ЗаявкаНаРасход", указанному в процедуре ПриЗаполненииОграниченияДоступа модуля менеджера объекта метаданных». БСП не разобрала текст: опечатка в поле, тип поля не совпал с видом доступа, использован ВЫБРАТЬ. Под заголовком — список ошибок и сам текст.
  • «Роль "ЧтениеВсехЗаказовКлиентов" отсутствует в метаданных». Опечатка в РольДоступна или отключено расширение.
  • «Требуется обновить шаблон на актуальную версию, поставляемую в роли ИзменениеУчастниковГруппДоступа». В свою роль скопировали шаблон из старой БСП — возьмите его из этой роли текущей конфигурации.
  • Утечка через привилегированный режим. Функция включила его и вернула таблицу на клиент целиком. Отдавайте наружу только итог или признак.

Частые вопросы

Чем RLS отличается от прав роли?

Права доступа к документу в роли открывают таблицу целиком: «может читать заказы клиентов». RLS сужает право до строк: «…только по своим складам».

Можно ли настроить RLS без программиста?

В типовой на БСП — да, если хватает готовых видов доступа: включите ограничение на уровне записей, настройте вид доступа в профиле и значения в группе доступа. Пошагово — в статье о правах доступа 1С.

Как устроен RLS в 1С ERP?

Как в УТ 11 и КА 2: та же подсистема БСП, те же варианты работы и общие виды доступа — «Организации», «Склады», «Подразделения», «Группы партнеров». Код из статьи переносится, имена полей сверяйте с релизом.

Почему администратор видит всё?

В роли полных прав ограничений нет, а права ролей складываются. Проверяйте RLS под сотрудником или под тестовым пользователем с тем же профилем.

Когда проще заказать

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

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.