1c

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

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


 УстановитьВидимостьЗаголовкаОтчета(ТабличныйДокумент);
 УстановитьВидимостьПараметровОтчета(ТабличныйДокумент);    
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры // СформироватьОтчет()


Report Page