Имя: Пароль:
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) обработкой первое время будут отправлять данные вручную (для проверки корректности), затем она должна будет по расписанию запускаться. Поэтому через реквизиты делал
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан