Имя: Пароль:
1C
1С v8
Программная настройка СКД
,
0 Кондидат В
 
11.02.19
09:05
Ребят, всем привет!

Необходимо настроить выгрузку данных в JSON из отчета.

Сделал обработку, которая на основе СКД отчета получет данные.

Делаю так:

    СКД = Отчеты.Выработка.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = СКД.НастройкиПоУмолчанию;    
    Настройки.Структура.Очистить();
    Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Группировка.Использование = Истина;
    
    Для Каждого КиЗ ИЗ СтруктураПолей Цикл
        ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        ВыбранноеПоле.Заголовок = КиЗ.Ключ;
        ВыбранноеПоле.Использование = Истина;
        ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(КиЗ.Значение);
    КонецЦикла;

Данные вывожу в ТЗ, но в ней выводится итоговая строка. Собственно вопрос в том, какой настройкой обрать ее?

В коллекции Группировка.ПараметрыВывода.ДоступныеПараметры.Элементы получить ее по имени не могу через [], как и через Настройки
1 Nikoss
 
11.02.19
09:16
(0) имхо, нужно программно настройку СКД поправить, с вкладки "Другие настройки", "Расположение итого" = Нет
2 Кондидат В
 
11.02.19
09:19
(1) Вот и не могу программно найти где в НЕТ выставить группировку.
В сам отчет лезть не хочу :)
3 toypaul
 
гуру
11.02.19
09:28
в отладчике разве не показывает все параметры в списке Группировка.ПараметрыВывода.ДоступныеПараметры.Элементы
?
4 Кондидат В
 
11.02.19
09:30
(3) Эту коллекцию я видел. Изменить ее не могу :(
5 Кондидат В
 
11.02.19
09:32
Забивая Группировка.ПараметрыВывода.Элементы["РасположениеИтогов"] получаю {(1)}: Поле объекта не обнаружено (РасположениеИтогов)
6 toypaul
 
гуру
11.02.19
09:32
ПараметрыВывода.УстановитьЗначениеПараметра ?
7 Кондидат В
 
11.02.19
09:37
(6) Спасибо.
Помогла УстановитьЗначениеПараметра("РасположениеИтогов", РасположениеИтоговКомпоновкиДанных.Нет)
8 Кондидат В
 
11.02.19
11:58
===========================================
Еще вопрос по СКД:
А как добавить группу ИЛИ в отборы программно?
9 toypaul
 
гуру
11.02.19
12:12
Группа = Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
Группа.ТипГруппы  = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
10 Кондидат В
 
12.02.19
07:58
И снова подниму вопрос.
Я тут когнитивный диссонанс поймал.

В общем решил дать пользователю возможность настроек отбора, для чего в обработку добавил реквизит "КомпоновщикНастроек" типа КомпоновщикНастроекКомпоновкиДанных. В процедуре при открытии прописал следующий код:

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

    Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Группировка.Использование = Истина;


И в нем предпоследняя строка дает ошибку:

{Обработка.ВыгрузкаНМГР.Форма.Форма.Форма(70)}: Ошибка при установке значения атрибута контекста (Группировка)
    Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));

Несоответствие типов

хотя следующий код

    СКД = Отчеты.Выработка.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = СКД.НастройкиПоУмолчанию;
    
    Настройки.Структура.Очистить();
    Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
    
    Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Группировка.Использование = Истина;

прекрасно отрабатывает.

Посмотрел в отладчике тип структуры, в обоих случаях это "КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных"

Может кто подскажет направление рытья???
11 toypaul
 
гуру
12.02.19
08:14
не надо было добавлять КомпоновщикНастроек в объект. можно обойтись добавлением его на форму.

вот это вообще не пойму как работает в при открытии

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

оно не должно там работать
12 Кондидат В
 
12.02.19
08:17
(11) ну так на клиенте вызываю серверную ПриОткрытии
13 Кондидат В
 
12.02.19
08:18
+(12) На форму в параметры или в реквизиты лучше пихнуть?
14 DrZombi
 
гуру
12.02.19
08:59
(0) Долго, лень читать....
Вот, в древо значений... это из ЗУП 3.1

    Обработка = РеквизитФормыВЗначение("Объект");    
    СхемаКомпоновкиДанных = Обработка.ПолучитьМакетОтчета2("ОтчетыПоСотрудникамРасширенный");
    
    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    
    СтрОбъект = Новый Структура();
    СтрОбъект.Вставить("СхемаКомпоновкиДанных",СхемаКомпоновкиДанных);
    СтрОбъект.Вставить("КомпоновщикНастроек",КомпоновщикНастроек);
    
    ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(СтрОбъект, СоответсвиеДополнительныхПолейПредставлениям);
    
    //создадим компоновщик настроек и загрузим настройки по умолчанию, вместо настроек по умолчанию можно использовать восстановленные настройки
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    Настройки = КомпоновщикНастроек.Настройки;
    
    //установка параметров отчета, без КомпоновщикНастроекКомпоновкиДанных делать это гораздо сложнее
    //Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СвойствоВодитель",         мСвойствоВодитель);
    //Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок",            Заголовок);
    
    //Установить отбор...
    ЭлементыОтборов = Настройки.Отбор.Элементы;
    
    Если ЗначениеЗаполнено(Подразделение) Тогда
        ЭлемОтбора = ЭлементыОтборов[1];
        ЭлемОтбора.Использование = Истина;
        ЭлемОтбора.ПравоеЗначение = Подразделение;
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Должность) Тогда
        ЭлемОтбора = ЭлементыОтборов[2];
        ЭлемОтбора.Использование = Истина;
        ЭлемОтбора.ПравоеЗначение = Должность;
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Сотрудник) Тогда
        ЭлемОтбора = ЭлементыОтборов[3];
        ЭлемОтбора.Использование = Истина;
        ЭлемОтбора.ПравоеЗначение = Сотрудник;
    КонецЕсли;
    
    //Помещаем в переменную данные о расшифровке данных - здесь ненужный пункт, но пусть будет.
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    
    //Формируем макет, с помощью компоновщика макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    //Передаем в макет компоновки схему, настройки и данные расшифровки
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ВнешниеНаборыДанных = Неопределено;
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, , Истина);
    
    ДанныеОтчета = Новый ДеревоЗначений;
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(ДанныеОтчета);
    
    ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
    
    //ДопСвойства = КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства;
    //ДопСвойства.Вставить("ОтчетПустой", ДанныеОтчета.Строки.Количество() = 0);
    
    //РезультатКомпоновкиМакета.Вставить("ДанныеОтчета", ДанныеОтчета);
    
    //ДопСвойства = КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства;
    //ДопСвойства.Вставить("ОтчетПустой", ДанныеОтчета.Строки.Количество() = 0);
    //РезультатКомпоновкиМакета.Вставить("ДанныеОтчета", ДанныеОтчета);
    
    Объект.Сотрудники.Очистить();
    ТЗ = Объект.Сотрудники.Выгрузить();
    
    Для Каждого СтрокаУр1 Из ДанныеОтчета.Строки Цикл
        Для Каждого СтрокаУр2 Из СтрокаУр1.Строки Цикл
            Для Каждого СтрокаУр3 Из СтрокаУр2.Строки Цикл
                
                НовСтрокаТЗ = ТЗ.Добавить();
                НовСтрокаТЗ.Сотрудник = СтрокаУр3.РабочееМестоСотрудник;
                НовСтрокаТЗ.НомерДоговора = СтрокаУр3.РабочееМестоТрудовойДоговорНомер;
                НовСтрокаТЗ.ДатаДоговора = СтрокаУр3.РабочееМестоТрудовойДоговорДата;
                НовСтрокаТЗ.Оклад = СтрокаУр3.РабочееМестоТарифнаяСтавка;
                НовСтрокаТЗ.Подразделение = СтрокаУр3.РабочееМестоПодразделение;
                НовСтрокаТЗ.Должность = СтрокаУр3.РабочееМестоДолжность;
                
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    
    Объект.Сотрудники.Загрузить(ТЗ);
15 Кондидат В
 
12.02.19
12:38
*****************************************************
Спасибо всем участникам. Для завершенности ветки добавлю от себя:

1. КомпоновщикНастроекКомпоновкиДанных давал ошибку при добавлении группировки, потому что вызывался из модуля формы. Перенес в модуль обработки и все заработало.

2. Для того, что бы КомпоновщикНастроекКомпоновкиДанных увидел все настройки инициировать его надо через временное хранилище

    АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СКД, Новый УникальныйИдентификатор);
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));


При добавлении напрямую в ИсточникДоступныхНастроекКомпоновкиДанных СКД ошибки не вылетало, но в настройках небыло доступных полей.
16 singlych
 
12.02.19
12:51
(13) Он там и так есть как реквизит отчета.
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки()
17 singlych
 
12.02.19
12:54
(16) А, там обработка у тебя. Я бы реквизит формы сделал.
18 Кондидат В
 
12.02.19
13:32
(17) обработкой первое время будут отправлять данные вручную (для проверки корректности), затем она должна будет по расписанию запускаться. Поэтому через реквизиты делал