Как разрешить чтение всех данных и обойти RLS при построении отчета в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разберем распространенную ситуацию: в конфигурации настроено ограничение прав доступа на уровне записей (RLS) на чтение документа. Ограничение работает корректно при обычной работе пользователей, однако возникает необходимость сформировать отчет, который должен выводить полные данные по всем документам без учета ограничений RLS.

Стандартная конструкция ВЫБРАТЬ РАЗРЕШЕННЫЕ в тексте запроса в данном случае не подходит, так как она лишь скрывает заблокированные строки, а задача состоит в том, чтобы отчет отображал абсолютно все записи.

Почему изменение прав "Просмотр" или "Чтение" в ролях не всегда помогает

Проанализируем попытки решить проблему через настройку ролей. Если убрать у роли право Просмотр для документа, платформа автоматически снимает права на интерактивное добавление и изменение объектов, что часто недопустимо для рабочих ролей пользователей. Кроме того, настроить ограничение RLS отдельно для права Просмотр платформа 1С не позволяет, поэтому корректировка интерактивных прав на уровне ролей не решает задачу формирования отчета.

Использование привилегированного общего модуля

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

Разберем по шагам порядок реализации этого решения:

  1. В конфигураторе создадим новый или выберем существующий общий модуль с установленными флагами Сервер и Вызов сервера.
  2. В свойствах общего модуля установим флаг Привилегированный в значение Истина.
  3. Создадим в модуле экспортную функцию, внутри которой выполним запрос к объектам базы данных и вернем результат (например, в виде таблицы значений).
  4. При формировании отчета вызовем эту функцию и обработаем полученные данные.

Посмотрим на пример кода в привилегированном общем модуле:


// Серверный общий модуль с установленным флагом "Привилегированный"
Функция ПолучитьДанныеДокументовДляОтчета() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Продажи.Ссылка КАК Ссылка,
		|	Продажи.Дата КАК Дата,
		|	Продажи.Номер КАК Номер,
		|	Продажи.СуммаДокумента КАК СуммаДокумента
		|ИЗ
		|	Документ.Продажи КАК Продажи";
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

Так как процедура выполняется в контексте привилегированного модуля на сервере, платформа полностью отключает проверку RLS для всех запросов внутри этого модуля.

Применение метода УстановитьПривилегированныйРежим

Рассмотрим еще один вариант — применение программного метода УстановитьПривилегированныйРежим().

Этот метод позволяет точечно включать и отключать привилегированный режим прямо в коде программных модулей на сервере:


// Включаем привилегированный режим для обхода RLS
УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	Продажи.Ссылка КАК Ссылка,
	|	Продажи.СуммаДокумента КАК СуммаДокумента
	|ИЗ
	|	Документ.Продажи КАК Продажи";

РезультатТаблица = Запрос.Выполнить().Выгрузить();

// Обязательно отключаем привилегированный режим после выполнения запроса
УстановитьПривилегированныйРежим(Ложь);

Проанализируем важные технические особенности работы этого метода:

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

Особенности работы с Системой компоновки данных (СКД)

Если отчет построен на базе СКД, обычное формирование отчета на клиенте будет выполняться с учетом прав текущего пользователя. Чтобы сформировать отчет СКД в привилегированном режиме, разберем два подхода:

  1. Выгрузка в внешний набор данных: В привилегированном модуле выполняется запрос, результат выгружается в таблицу значений, после чего передается в СКД в качестве внешнего датасета.
  2. Полная компоновка на сервере: Весь процесс компоновки макета и вывода отчета (с использованием объектов КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент) переносится в серверный привилегированный модуль.

Альтернативные архитектурные решения

Рассмотрим дополнительные способы архитектурного решения задачи:

  1. Динамический RLS через параметры сеанса: Текст ограничения RLS в роли дорабатывается с условием проверки параметра сеанса (например, ПараметрыСеанса.ОтключитьRLSДляОтчета). Перед выполнением отчета флаг временно взводится в Истина, а после получения данных сбрасывается обратно.
  2. Построение отчета по регистрам: Рекомендуется строить отчеты не по таблицам документов, а по регистрам накопления или сведений. Если при проведении документа формировать движения в регистре, где RLS не настроен, отчет сможет считывать агрегированные данные без доступа к самим документам.
← На главную