При разработке отчетов на платформе 1С:Предприятие 8 часто возникает задача предоставить пользователю с ограниченными правами сводные данные (например, отчет по продажам или взаиморасчетам), к части которых у него нет прямого доступа по механизму RLS (ограничение доступа на уровне записей). Разберем, как правильно реализовать выполнение отчета на СКД в привилегированном режиме и какие нюансы платформы необходимо учитывать.
Прежде чем приступать к коду, проанализируем разграничение уровней безопасности в платформе 1С:
Привилегированный режим позволяет временно отключить проверку прав доступа и RLS на сервере. Однако встроенный механизм СКД имеет специфику, из-за которой простой вызов процедуры УстановитьПривилегированныйРежим(Истина) в стандартном отчете может не сработать.
Если у пользователя нет прав на чтение таблицы, используемой в схеме отчета, ошибка «Недостаточно прав для работы с таблицей...» часто возникает в момент открытия формы. Выясним причину такого поведения.
При стандартном открытии формы отчета платформа автоматически инициализирует КомпоновщикНастроек на основании указанной основной схемы компоновки данных. Этот процесс выполняется в контексте текущего сеанса пользователя без привилегированного режима. Платформа анализирует доступность полей схемы для вывода пользовательских настроек и отборов. Если прав на таблицу нет, исключение выбрасывается до вызова событий модуля объекта.
Рассмотрим основной способ обхода RLS, когда у пользователя есть базовые права на чтение метаданных, но часть строк заблокирована шаблонами ограничений. Для этого переопределим процедуру ПриКомпоновкеРезультата в модуле объекта отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартную компоновку отчета платформой
СтандартнаяОбработка = Ложь;
// Включаем привилегированный режим для обхода RLS
УстановитьПривилегированныйРежим(Истина);
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Шестой параметр ПроверятьДоступностьПолей устанавливаем в Ложь
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
НастройкиОтчета,
ДанныеРасшифровки,
,
,
Ложь
);
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Обратим внимание на метод КомпоновщикМакета.Выполнить(). Передача значения Ложь в шестой параметр ПроверятьДоступностьПолей отключает платформенную валидацию прав на просмотр полей при генерации макета компоновки.
Если требуется полностью скрыть схему от автоматической проверки прав при открытии формы (когда у пользователя вообще нет роли с правом на таблицу), разберем по шагам альтернативный подход:
ОсновнаяСхемаКомпоновкиДанных.ПриСозданииНаСервере программно инициализируем компоновщик настроек в привилегированном режиме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьПривилегированныйРежим(Истина);
Схема = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
КонецПроцедуры
В сочетании с переопределенной процедурой ПриКомпоновкеРезультата это позволяет пользователю изменять пользовательские настройки отчета, не вызывая исключений при открытии формы.
При выводе запрещенных по RLS данных в отчет необходимо учитывать следующие особенности платформы:
Ссылка на клиенте платформа не сможет получить его представление, в результате чего пользователь увидит строку <Объект не найден...>. Чтобы избежать этого, в тексте запроса СКД для закрытых объектов следует явно формировать строковые представления: ПРЕДСТАВЛЕНИЕ(Таблица.Ссылка) КАК ПолеПредставление.