Как сформировать отчет на СКД в привилегированном режиме и обойти ограничения RLS?

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

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

Разница между базовыми правами и ограничениями RLS

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

  1. Базовые права на объекты метаданных (Чтение, Просмотр, Добавление, Изменение). Если у роли пользователя снята галочка «Чтение» для конкретной таблицы (например, документа или регистра), платформа блокирует доступ к ней на уровне метаданных еще до применения ограничений по строкам.
  2. Ограничения на уровне записей (RLS). Накладываются поверх разрешенного права на чтение и отсекают определенные строки таблиц по заданным условиям (по организациям, подразделениям, группам доступа и т.д.).

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

Почему возникает ошибка прав еще до формирования отчета?

Если у пользователя нет прав на чтение таблицы, используемой в схеме отчета, ошибка «Недостаточно прав для работы с таблицей...» часто возникает в момент открытия формы. Выясним причину такого поведения.

При стандартном открытии формы отчета платформа автоматически инициализирует КомпоновщикНастроек на основании указанной основной схемы компоновки данных. Этот процесс выполняется в контексте текущего сеанса пользователя без привилегированного режима. Платформа анализирует доступность полей схемы для вывода пользовательских настроек и отборов. Если прав на таблицу нет, исключение выбрасывается до вызова событий модуля объекта.

Решение 1: Программное формирование отчета в модуле объекта

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем стандартную компоновку отчета платформой
    СтандартнаяОбработка = Ложь;
    
    // Включаем привилегированный режим для обхода RLS
    УстановитьПривилегированныйРежим(Истина);    
    
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Создаем компоновщик макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    // Шестой параметр ПроверятьДоступностьПолей устанавливаем в Ложь
    МакетКомпоновки = КомпоновщикМакета.Выполнить(
        СхемаКомпоновкиДанных, 
        НастройкиОтчета, 
        ДанныеРасшифровки, 
        , 
        , 
        Ложь
    );
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Обратим внимание на метод КомпоновщикМакета.Выполнить(). Передача значения Ложь в шестой параметр ПроверятьДоступностьПолей отключает платформенную валидацию прав на просмотр полей при генерации макета компоновки.

Решение 2: Динамическая инициализация схемы в форме отчета

Если требуется полностью скрыть схему от автоматической проверки прав при открытии формы (когда у пользователя вообще нет роли с правом на таблицу), разберем по шагам альтернативный подход:

  1. В свойствах отчета в дереве метаданных очищаем поле Основная схема компоновки данных.
  2. Создаем схему компоновки как обычный макет с именем ОсновнаяСхемаКомпоновкиДанных.
  3. В модуле формы отчета в обработчике ПриСозданииНаСервере программно инициализируем компоновщик настроек в привилегированном режиме:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    УстановитьПривилегированныйРежим(Истина);
    
    Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    
КонецПроцедуры

В сочетании с переопределенной процедурой ПриКомпоновкеРезультата это позволяет пользователю изменять пользовательские настройки отчета, не вызывая исключений при открытии формы.

Нюансы отображения ссылочных данных и расшифровки

При выводе запрещенных по RLS данных в отчет необходимо учитывать следующие особенности платформы:

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