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