Имя: Пароль:
1C
1С v8
Свернуть ТаблицаЗначений с агрегатными функциями или СКД с набором данных Объект
,
0 7OH
 
01.04.14
15:38
В общем давно появилось желание сворячивать ТЗ не только с СУММИРОВАНИЕМ колонок, но и с возможностью получения МАКСИМУМ, КОЛВО....
При наличии объекта (как обработка или отчет) - с этим прекрасно справляется СКД, на основании схемы программно вывел в дерево: и итоги есть и детальные записи в случае чего.
Тут на форуме уже поднимали вопрос о создании СКД с набором данных объект (ТаблицаЗначений) с нуля без хранения самой схемы компоновки как объекта, но к сожалению многие темы сданы в архив и зачастую самого решения в ветках нет.
У кого таки вышло это сделать программно - поделитесь.
1 vicof
 
01.04.14
15:44
2 Chai Nic
 
01.04.14
15:49
Через передачу ТЗ в запрос?
3 7OH
 
01.04.14
15:50
(1) Я так тоже умею.
В первой ссылке - выполнение схему по макету, а не с нуля.
Вторая - тоже по макету.
Нет у меня макета - только код.
Я потому тут и спрашиваю - поиски ведут на многи статьи тут, где автор "я понял, у меня заработало" и пропал.
4 7OH
 
01.04.14
15:51
(2)
лучше без запроса
прямо по таблице отработать - установить как набор данных и дальше уже скд с ней пусть что надо то и делает.
5 Maxus43
 
01.04.14
15:53
а что не получается? Добавить поля в СКД программно?
6 7OH
 
01.04.14
15:58
(5)
внешний набор устанавливается в процессоре компоновки, который требует компоновщик
а компоновщик ругается на отсутствие источника

МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
----
В общем ищу хоть какой-то рабочий код
7 Defender aka LINN
 
01.04.14
16:07
(0) Дык создавай. В чем проблема-то?
8 МихаилМ
 
01.04.14
16:12
откройте для себя объект "анализ данных".
он умеет исполнять Ваше желания.
9 МихаилМ
 
01.04.14
16:19
(0)
на 1cskd.ru

есть обработка , преобразующая xml скд в код 1с.

обработка на уф
10 Serginio1
 
01.04.14
17:29
11 7OH
 
01.04.14
19:34
(9) Спасибо.
Таки разобрался.
Если кому тоже будет интерсно, поделюсь.
<code>
Функция РазбитьСтроку(ИсходнаяСтрока,Разделитель)
    Рез = Новый Массив;
    Строки = СтрЗаменить(ИсходнаяСтрока,Разделитель,Символы.ПС);
    Для Ном = 1 По СтрЧислоСтрок(Строки) Цикл
        Рез.Добавить(СтрПолучитьСтроку(Строки,Ном));
    КонецЦикла;
    Возврат Рез;
КонецФункции

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

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


//Вызов где угодно
дОплаты=СвернутьТаблицуСКД(лТаблица,
            "Измерение1,Измерение2,Измерение3",                                "СУММА(Ресурс1),МИНИМУМ(Ресурс2),МАКСИМУМ(Ресурс3),Ложь);
</code>
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший