Имя: Пароль:
1C
1С v8
ЗУП 3.х. Внешний отчет на СКД в привилегированном режиме
0 Иван-1C
 
05.06.19
11:49
Добрый день!
Подскажите, пожалуйста, как выполнить внешний отчет на СКД в привилегированном режиме?

При компоновке результата добавляю
    СтандартнаяОбработка = Ложь;
    УстановитьПривилегированныйРежим(Истина);

не помогает.
1 Amra
 
05.06.19
12:14
Только добавлять во внешние отчеты и обработки и выполнение в небезопастном режиме (в СведенияОВнешнейОБработке указывается)
2 palsergeich
 
05.06.19
12:56
Внешние отчёты открываются только в безопасном режиме.
Безопасный режим имеет высший приоритет, нежели установитьПривеллигированныйРежим.
Или писать обёртку, которая будет открывать этот же отчёт через ВнешниеОтчетыМенкджер с безопасный режим = ложь или встраивать в доп отчеты
3 Иван-1C
 
06.06.19
10:26
(1) Не работает.
Кидаю в дополнительные отчеты и обработки.
Вроде бы все классически делаю, ничего лишнего, но не работает. Под админом работает.
А нужно с правами кадровика увидеть суммы по начислениям.

Вот настройка небезопасного режима:

Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("");

    ИмяОтчета = Метаданные().Представление();

    ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", ИмяОтчета);
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительный отчет");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    ДобавитьКоманду(ТаблицаКоманд, ИмяОтчета, Метаданные().ПолноеИмя(), "ОткрытиеФормы", Истина);

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции


Вот Запрос на СКД:

ВЫБРАТЬ
    Начисления.Сотрудник КАК Сотрудник,
    СУММА(Начисления.Результат) КАК РасчетноеНачисление
ИЗ
    РегистрРасчета.Начисления КАК Начисления
ГДЕ
    Начисления.ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
    И Начисления.ВидРасчета В(&СписокНачислений)
    И Начисления.Сотрудник = &Сотрудник

СГРУППИРОВАТЬ ПО
    Начисления.Сотрудник


И вот компоновка результата:

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

    УстановитьПривилегированныйРежим(Истина);
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

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

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

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

    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Пока ЭлементРезультата <> Неопределено Цикл
        ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    КонецЦикла;
    ПроцессорВывода.ЗакончитьВывод();
    
КонецПроцедуры
4 Amra
 
06.06.19
10:30
5 Иван-1C
 
06.06.19
10:39
(4) там написано как ты и сказал.
Должно работать, где-то туплю..
6 toypaul
 
гуру
06.06.19
10:59
тут возможно фишка в методе ПолучитьНастройки

ты же не рассказываешь, что конкретно у тебя не работает. если выводятся какие-то колонки, но данных нет - это одно. если колонки вообще не выводятся, то это другое
7 toypaul
 
гуру
06.06.19
11:01
БезопасныйРежим тут вообще не приделах - на права он никак не действует. это лишь параметр для создания внешней обработки методом Создать
8 toypaul
 
гуру
06.06.19
11:03
у КомпоновщикМакетаКомпоновкиДанных есть параметр в методе Выполнить - ПроверятьДоступностьПолей. попробуй там передать Ложь. а еще посмотри в Настройки список выбранных полей
9 Иван-1C
 
06.06.19
11:04
(7) даже колонки не выводятся. только установленные параметры
10 toypaul
 
гуру
06.06.19
11:10
(9) тогда предлагаю посмотреть для начала Настройки.Выбор и много думать
11 Иван-1C
 
06.06.19
13:35
(10) ПроверятьДоступностьПолей  выставил - не помогло.

А по поводу Настройки.Выбор не пойму что на них смотреть. Два поля всего вывожу:
Сотрудник и Сумма.


Если вместо Регистра расчета Начисления, подставить например Регистр накопления Фактические отпуска, то все работает при тех же условиях, без изменений в коде.
12 toypaul
 
гуру
06.06.19
14:16
а я все-таки предлагаю в отладчике посмотреть что в Настройки.Выбор
13 Иван-1C
 
06.06.19
14:37
(12) Отладчиком я умею смотреть такой отчет только через Файл - открыть.

Под кадровиком там пусто.. Ноль элементов..

Под админом мои две строки.

И что делать-то???? Спаси, уважаемый)
14 toypaul
 
гуру
06.06.19
14:44
(13) уже хорошо. я в (6) уже про это писал.

попробуй вот так

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

и параметр в этом методе ПроверятьДоступностьПолей = ЛОЖЬ

но такой способ отрубит все пользовательские настройки (если они есть)

особенность метода ПолучитьНастройки (насколько я понимаю) в том что он формирует настройки с учетом функ. опций и прав пользователя

у нас (в Ижевске) 29.05 проходил "митапчик" по СКД - я там про это рассказывал
15 toypaul
 
гуру
06.06.19
14:47
а вот как заставить возвращать метод ПолучитьНастройки настройки без учета прав и ФО - это большой вопрос.

непонятненько почему метод УстановитьПривилегированныйРежим не отрубает в нем проверку прав

есть такая мысль ... может быть УстановитьПривилегированныйРежим вызывать в ПриСозданииНаСервере или какой там обрабтчик самым первым срабатывает. чтобы обмануть компоновщик насчет прав...
16 Вафель
 
06.06.19
14:50
в самой внешней обработке вроде никак нельзя привилегированный режим
17 Вафель
 
06.06.19
14:51
но если опасный режим, то привилегерованный режим в коде КОНФЫ не работает
18 Вафель
 
06.06.19
14:51
но можно решить задачу через расширение
19 toypaul
 
гуру
06.06.19
14:52
(13) вот еще какая есть подсказочка Отчет в привилегированном режиме

в самом конце темы - добавить РАЗРЕШЕННЫЕ в запрос. и вроде как должно заработать

подозреваю, что в этом случае ПолучитьНастройки() не "портит" список выбранных полей
20 Иван-1C
 
06.06.19
15:23
1. Разрешенные  - не прокатило.
Это если группы физ.лиц какие-то открыты, какие-то закрыты, тогда да сработало бы для открытых.
А тут в регистр расчетов вообще кадровику нос нельзя совать, но нужно


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

то это убивает все выставленные параметры и отчет даже под админом ничего не выводит
21 toypaul
 
гуру
06.06.19
15:29
(20) так никто счастья прям сразу и не обещал. про настройки я же написал. настройки нужно получать как-то самому и пользовательские настройки из компоновщика передавать
22 toypaul
 
гуру
06.06.19
15:33
кстати ... есть другой обходной вариант. сделать отчет через набор данных объект. и заполняй в модуле в привил. режиме набор как тебе захочется.
23 toypaul
 
гуру
06.06.19
15:35
и есть еще (совсем уж извращенческий вариант) - запрос делать по регистру, на который есть права, но опять же в модуле менять текст запроса на нужный регистр (ну и есс-но привил. режим) . такой варинт будет проще с точки зрения передачи параметров и отборов, заданных пользователем
24 Иван-1C
 
06.06.19
16:13
(21) А как передавать-то параметры?

Когда получил МакетКомпоновки в нем уже ничего менять нельзя.

Можно настраивать и параметры и запрос до команды КомпоновщикМакета.Выполнить.
Установил параметры, написал запрос какой хочу, а потом пишу
МакетКомпоновки = КомпоновщикМакета.Выполнить

И поскольку ставлю СхемаКомпоновкиДанных.НастройкиПоУмолчанию, то все параметры обнуляются.
И подсунуть новые параметры позже уже нельзя. Макет скомпонован.

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию,ДанныеРасшифровки,,,Ложь)
25 toypaul
 
гуру
06.06.19
16:21
"А как передавать-то параметры?" слишком много вопросов :) - а рабочий день уже подошел к концу. направление движения указано. если будет время, может сделаю тестовый пример
26 Иван-1C
 
06.06.19
17:32
(25) Да, буду ждать. было бы очень интересно.. А так по старинке сделал через ТабДок без  СКД  (((
27 craxx
 
07.06.19
09:25
(26) Что мешает запустить формирование табличного документа компоновщиком в модуле с привилегированным режимом? а потом вывести его в твоем отчете?
28 Иван-1C
 
07.06.19
09:43
(27) это же конфу менять
29 craxx
 
07.06.19
10:55
(28) Расширение
30 Иван-1C
 
07.06.19
12:33
(29) Не работает.

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


Вот на первой команде становлюсь отладчиком.
Смотрю КомпоновщикНастроек и уже здесь в списке элементов настройки нет моего ресурса "РасчетноеНачисление".

все дальнейшие действия в серверных модулях ни к чему не приводят
31 Иван-1C
 
07.06.19
12:40
все как toypaul  предсказывал..
32 toypaul
 
гуру
07.06.19
14:01
Самое просто что родилось

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


если будут пользовательские отборы, то их тоже будет нужно переносить из настроек формы в настройки по умолчанию
33 Иван-1C
 
07.06.19
14:31
(32) Жесть жестяная.. работает!!!

100500 лайков! Спасибо огромнейшее!!!!!!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс