1c
Как сформировать отчет СКД без проверки прав (в привилегированном режиме)?
Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав!
Особенно если настроен RLS
Есть несколько способов как это сделать:
1. Установить привилегированный режим в модуле отчета
Форма отчета должна быть Управляемой, далее в модуле отчета процедура обработчика «При компоновке результата»:
Код 1C v 8.3
//Перехватываем событие вывода компоновки данных в табличный документ и выводим со своим заголовком Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; УстановитьПривилегированныйРежим(Истина); //Сформируем отчет СформироватьОтчет(ДокументРезультат, ДанныеРасшифровки); УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры
2. Формирование в привилегированном режиме через Общий модуль с галкой Привелигерованный
Создаем общий модуль
так же как в пункте 1 в обработчике «При компоновке результата» пишем:
Код 1C v 8.3
//Перехватываем событие вывода компоновки данных в табличный документ и выводим со своим заголовком Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; МЕ_ДляОтчетаСКД_ПривелРежим.СформироватьОтчетПривРеж(ДокументРезультат, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек); КонецПроцедуры
В общем модуле МЕ_ДляОтчетаСКД_ПривелРежим код:
Код 1C v 8.3
Процедура СформироватьОтчетПривРеж(ТабличныйДокумент, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек) Экспорт ТабличныйДокумент.Очистить(); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки,,,Ложь); ВнешниеНаборыДанных = Новый Структура; /// можно передать внешние данные ВнешниеНаборыДанных.Вставить("тзПродаж", СформироватьТЗПродаж()); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры
3. Если включен режим Использовать ограничение на уровне прав доступа - RLS
Часто используется в типовых. Тут в модуле для текущего пользователя можно на время формирования отчету установить параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей в Ложь и RLS не сработает.
Код 1C v 8.3
ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей=Ложь;
После завершения формирования, не забудьте включить rls обратно установив = Истина
4. Если в запросе используется конструкция вида регистратор.дата и это поле не отображается в полях отчета СКД
Допустим Вы сделали запрос по регистру накоплений и через регистратор обратились к дате или сумме документа и при формировании отчета СКД, эти поля недоступны !? как же быть?
Проблема в том - что у регистратором может выступать несколько документов и видимо права чтение/просмотр есть не на все - поэтому через скд эта таблица целиком недоступна, решение:
1. открыть доступ на все регистраторы регистра
2. в запросе четко обозначить тип
Код 1C v 8.3
//примеры ВЫРАЗИТЬ(ДокументыОплаты.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).СуммаДокумента //или так ВЫБОР КОГДА РАЗНОСТЬДАТ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата,КонецПериода, ДЕНЬ) > ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности ТОГДА ДОБАВИТЬКДАТЕ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата, ДЕНЬ, ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности) ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1) КОНЕЦ КАК ДеньВозникновенияЗадолженности
В дополнении у пункту 1, код процедуры сформировать отчет(). Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах:
Код 1C v 8.3
// Процедура выполняет формирование табличного документа по настройкам СКД Процедура СформироватьОтчет(ТабличныйДокумент, ДанныеРасшифровки) УстановитьПривилегированныйРежим(Истина); // если отчет открывается по расшифровке, отбору, упорядочиванию, // группировке или условному оформлению - восстановим настройки вывода заголовка, // т.к., в переданных настройках при этом, вывод заголовка отключен // для того, чтобы не выводился встроенный заголовок компоновки. ВосстановитьНастройкиВыводаЗаголовка(); ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ТабличныйДокумент.Очистить(); // установим обязательные настройки отчета УстановитьПараметрыОтчета(); // Сделаем копию настроек вывода заголовка СохранитьНастройкиВыводаЗаголовка(); ВыводитьЗаголовок = ВыводитьЗаголовокОтчета(); Если ВыводитьЗаголовок Тогда ПрисоединитьЗаголовокОтчетаКТабличномуДокументу(ТабличныйДокумент, ПолучитьТекстЗаголовкаОтчета()); // Отключим в настройках вывод встроенного заголовка НайденнаяНастройкаВыводаЗаголовка = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок"); НайденнаяНастройкаВыводаЗаголовка.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить; НайденнаяНастройкаВыводаЗаголовка.Использование = Истина; КонецЕсли; КопияДополнительныхНастроек = УстановитьДополнительныеНастройкиДляРасшифровки(); МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки); // при необходимости вставим внешние наборы данных в СКД ВнешниеНаборыДанных = Новый Структура; ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных(); ВнешниеНаборыДанных.Вставить("ТаблицаВнешнегоНабораДанных",ТаблицаВнешнегоНабораДанных); ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки); ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы,,,КоличествоФиксируемыхСтолбцов); ДополнительнаяОбработкаРезультатаОтчета(ТабличныйДокумент); Если ВыводитьЗаголовок Тогда // вернем настройки вывода заголовка на место ВосстановитьНастройкиВыводаЗаголовка(); КонецЕсли; // восстановим дополнительные настройки Для Каждого ЭлементСтруктуры Из КопияДополнительныхНастроек Цикл КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение); КонецЦикла; // сохраненные настройки нужны только при расшифровке и т.п. // и не будуть давать изменить вывоз заголовка при обычном формировании. ОчиститьСохраненныеНастройкиВыводаЗаголовка(); УстановитьВидимостьЗаголовкаОтчета(ТабличныйДокумент); УстановитьВидимостьПараметровОтчета(ТабличныйДокумент); УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры // СформироватьОтчет()