Сформировать отчет СКД в привилегированном режиме

1. sajmon45 20.12.21 00:05 Сейчас в теме
Как сформировать отчет СКД в привилегированном режиме? Делаю так не работает:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка= Ложь;
	
	УстановитьПривилегированныйРежим(Истина);
  	
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	П_пользователь = Настройки.ПараметрыДанных.Элементы.Найти("ТекущийПользователь");
	Если Не П_пользователь = Неопределено Тогда 
		П_пользователь.Значение = Пользователи.ТекущийПользователь();
	КонецЕсли;
	
	Если Не РольДоступна("Снабжение") Тогда
		Для Каждого ЭлКолонки Из Настройки.Выбор.Элементы Цикл
			Если ЭлКолонки.Поле = Новый ПолеКомпоновкиДанных("Цена") Тогда
				ЭлКолонки.Использование = Ложь;
			КонецЕсли;
			
			Если ЭлКолонки.Поле = Новый ПолеКомпоновкиДанных("СуммаЗаказа") Тогда
				ЭлКолонки.Использование = Ложь;
			КонецЕсли;
			
			Если ЭлКолонки.Поле = Новый ПолеКомпоновкиДанных("ЦенаПоступления") Тогда
				ЭлКолонки.Использование = Ложь;
			КонецЕсли;
			
			Если ЭлКолонки.Поле = Новый ПолеКомпоновкиДанных("СуммаПоступления") Тогда
				ЭлКолонки.Использование = Ложь;
			КонецЕсли;
			
			Если ЭлКолонки.Поле = Новый ПолеКомпоновкиДанных("ЦенаТребуется") Тогда
				ЭлКолонки.Использование = Ложь;
			КонецЕсли;
			
			Если ЭлКолонки.Поле = Новый ПолеКомпоновкиДанных("СуммаТребуется") Тогда
				ЭлКолонки.Использование = Ложь;
			КонецЕсли;
			
		КонецЦикла;
	КонецЕсли;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.НачатьВывод();

    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Пока ЭлементРезультата <> Неопределено Цикл
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();
	
	УстановитьПривилегированныйРежим(Ложь );
	
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Swetlana 25 20.12.21 07:51 Сейчас в теме
(1)
Делаю так не работает

Что именно у вас не работает?

ссылка
5. glek 119 20.12.21 11:13 Сейчас в теме
(1) Выполнить отчет в прив. режиме не получится. Единственный вариант, это написать отчет на объект данных и его заполнять в прив. режиме.
7. Oliver 19.03.23 02:41 Сейчас в теме
(5) А почему не получится? У меня вроде получается.
3. ISP 20.12.21 08:32 Сейчас в теме
как внешний отчет ?

Давно тоже пробовал - не получилось. Пришлось извращение делать - СКД сохранял в базе и выполнял в привилигированном модуле. Потом передавал результат
4. sajmon45 20.12.21 09:21 Сейчас в теме
(3) Да, как внешней отчет
6. VZyryanov 20.12.21 11:43 Сейчас в теме
Установить привилегированный режим можно в общем модуле.
В модуле объекта внешнего отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	Организации=КФ_СерверВызов.ДоступныеОрганизацииПоДокументам("ЗаявкаНаРасходованиеДенежныхСредств");
	Параметры=Новый Структура("Организации",Организации);
	
	ВПривилегированномРежиме=Истина;
	ССообщениями=Истина;
	КФ_СерверВызов.СКДПриКомпоновкеРезультата(ЭтотОбъект,ДокументРезультат,ДанныеРасшифровки,СтандартнаяОбработка, 
		ВПривилегированномРежиме,Параметры,ССообщениями);

КонецПроцедуры
Показать


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

КонецФункции
Показать
8. echo77 1880 19.03.23 09:36 Сейчас в теме
(1) Возможно отключение безопасного режима поможет
Прикрепленные файлы:
9. romulanin 13.04.23 14:53 Сейчас в теме
(8) не поможет

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

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки,,,Ложь);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.НачатьВывод();

    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Пока ЭлементРезультата <> Неопределено Цикл
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();
    
КонецПроцедуры
Показать
user1225706; +1 Ответить
10. itmind 308 12.09.23 08:14 Сейчас в теме
(9) Так не работает, пишет, что ресурсы и измерения не выбраны. Т.е. ошибка в настройках.
Причина в том, что при получении настроек отбрасываются поля на которые нет прав. Даже если стоит УстановитьПривилегированныйРежим(Истина);

Решение - использовать настройки по умолчанию:
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию,ДанныеРасшифровки);

Но тогда настройки сделанные на форме не будет действовать.
Возможно это зависит от версии платформы, использую 8.3.22.2143
11. itmind 308 29.01.24 09:49 Сейчас в теме
Дополнение.

Что бы не отбрасывались поля есть еще два варианта:
1. Делать две схемы, одну для настроек, одну для формирования и при исполнении отчета программно подменять схему компоновки данных на нужную
2. В СКД сделать "объединение" и второй запрос в объединении в котором прописать нужные поля. В этом случае отчет сформируется со всеми полями, но будет одна пустая строка. Ее нужно убрать через Отбор.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот