Имя: Пароль:
1C
1С v8
СКД Программный вывод из таблицы значений
0 skaparez
 
25.10.14
00:01
Доброй ночи.

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

Может есть у кого рабочий пример программного вывода таблицы значений в табличный документ через СКД где в качестве группировки используются элементы иерархического справочника с выводом собственно этой самой иерархии (таблица значений допустим - одна строка и один столбец - элемент, а выше видно его родителей).

пример кода сча добавлю.
1 skaparez
 
25.10.14
00:05

Функция   ПолучитьПредставлениеИзИдентификатора(ИсходнаяСтрока)

    СтрокаВозврата = Сред(ИсходнаяСтрока, 1, 1);
    
    Для Сч = 2 По СтрДлина(ИсходнаяСтрока) Цикл
        
        ПредыдущийСимвол     = Сред(ИсходнаяСтрока, Сч - 1, 1);
        ТекущийСимвол        = Сред(ИсходнаяСтрока, Сч    , 1);
        СледующийСимвол      = Сред(ИсходнаяСтрока, Сч + 1, 1);
        ПослеследующийСимвол = Сред(ИсходнаяСтрока, Сч + 2, 1);
        
        Если ТекущийСимвол = "_" Тогда
            
            СтрокаВозврата = СтрокаВозврата + " ";
            Продолжить;
            
        ИначеЕсли ВРег(ТекущийСимвол) = ТекущийСимвол Тогда
            
            Если ВРег(ПредыдущийСимвол) <> ПредыдущийСимвол ИЛИ (ПредыдущийСимвол <> "_" И ВРег(ПредыдущийСимвол) = ПредыдущийСимвол И ВРег(СледующийСимвол) <> СледующийСимвол) Тогда
                
                СтрокаВозврата = СтрокаВозврата + " ";
                
                Если ВРег(СледующийСимвол) <> СледующийСимвол ИЛИ ВРег(ПослеследующийСимвол) <> ПослеследующийСимвол Тогда
                    ТекущийСимвол = НРег(ТекущийСимвол);
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
        СтрокаВозврата = СтрокаВозврата + ТекущийСимвол;
        
    КонецЦикла;
    
    Возврат СтрокаВозврата;
    
КонецФункции // ПолучитьПредставлениеИзИдентификатора()

Процедура СохранитьСКД(пСхемаКомпоновкиДанных, ИмяФайла)
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("e:\" + ИмяФайла + ".xml");
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, пСхемаКомпоновкиДанных, "dataComposition", "http://v8.1c.ru/8.1/data-composition-system/composition-template";);
    
КонецПроцедуры

// Добавляет группировку в компоновщик настроек в самый нижний уровень структуры, если поле не укзано - детальные поля
Функция ДобавитьГруппировку(КомпоновщикНастроек, Знач Поле = Неопределено, Строки = Истина) Экспорт
    
    ЭлементСтруктуры = Неопределено;
    
    Если ТипЗнч(КомпоновщикНастроек) = Тип("КомпоновщикНастроекКомпоновкиДанных") тогда
        ЭлементСтруктуры = ТиповыеОтчеты.ПолучитьПоследнийЭлементСтруктуры(КомпоновщикНастроек, Строки);
        Если ЭлементСтруктуры = Неопределено
            ИЛИ ТиповыеОтчеты.ПолучитьЭлементСтруктурыДетальныеЗаписи(КомпоновщикНастроек) <> Неопределено
            И Поле = Неопределено Тогда
            Возврат Неопределено;
        КонецЕсли;
    ИначеЕсли ТипЗнч(КомпоновщикНастроек) = Тип("ГруппировкаТаблицыКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("ГруппировкаДиаграммыКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("ГруппировкаКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("ТаблицаКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("ДиаграммаКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных")
        ИЛИ ТипЗнч(КомпоновщикНастроек) = Тип("НастройкиКомпоновкиДанных")
        тогда
        Если ТипЗнч(КомпоновщикНастроек) = Тип("ТаблицаКомпоновкиДанных") тогда
            Если Строки тогда
                ЭлементСтруктуры = КомпоновщикНастроек.Строки;
            Иначе
                ЭлементСтруктуры = КомпоновщикНастроек.Колонки;
            КонецЕсли;
        ИначеЕсли ТипЗнч(КомпоновщикНастроек) = Тип("ДиаграммаКомпоновкиДанных") тогда
            Если Строки тогда
                ЭлементСтруктуры = КомпоновщикНастроек.Серии;
            Иначе
                ЭлементСтруктуры = КомпоновщикНастроек.Точки;
            КонецЕсли;
        Иначе
            ЭлементСтруктуры = КомпоновщикНастроек;
        КонецЕсли;
    КонецЕсли;
    
    Если ТипЗнч(Поле) = Тип("Строка") Тогда
        Поле = Новый ПолеКомпоновкиДанных(Поле);
    КонецЕсли;
    
    Если ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаТаблицыКомпоновкиДанных")
        ИЛИ ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда
        НоваяГруппировка = ЭлементСтруктуры.Структура.Добавить();
    ИначеЕсли ТипЗнч(ЭлементСтруктуры) = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных")
        ИЛИ ТипЗнч(ЭлементСтруктуры) = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") Тогда
        НоваяГруппировка = ЭлементСтруктуры.Добавить();
    Иначе
        НоваяГруппировка = ЭлементСтруктуры.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    КонецЕсли;
    
    
    
    НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    НоваяГруппировка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
    Если Поле <> Неопределено Тогда
        ПолеГруппировки = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
        ПолеГруппировки.Поле = Поле;
    КонецЕсли;
    Возврат НоваяГруппировка;
    
КонецФункции


Функция   ТаблицаЗначенийВТабличныйДокументСКД(ТаблицаЗначений, ТабличныйДокумент = Неопределено, ФлагИспользованиеРасшифровки = Ложь, СтруктураПоляГруппировок = Неопределено, СтруктураПоляИтогов = Неопределено, СтруктураПоляИтоговОформление = Неопределено) Экспорт
    
    Перем СхемаКомпоновкиДанных;
    
    Если ТабличныйДокумент = Неопределено Тогда
        ТабличныйДокумент = Новый ТабличныйДокумент;
    Иначе
        ТабличныйДокумент.Очистить();
    КонецЕсли;
    
    Если СтруктураПоляГруппировок = Неопределено Тогда
        СтруктураПоляГруппировок = Новый Структура;
    КонецЕсли;
    
    Если СтруктураПоляИтогов = Неопределено Тогда
        СтруктураПоляИтогов = Новый Структура;
    КонецЕсли;
    
    Если СтруктураПоляИтоговОформление = Неопределено Тогда
        СтруктураПоляИтоговОформление = Новый Структура;
    КонецЕсли;
    
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    
    ИсточникДанных = ТиповыеОтчеты.ДобавитьЛокальныйИсточникДанных(СхемаКомпоновкиДанных);
    
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    НаборДанных.Имя            = "НаборДанных1";
    НаборДанных.ИмяОбъекта     = "Таблица";
    НаборДанных.ИсточникДанных = ИсточникДанных.Имя;
    
    ОписаниеТиповДата = Новый Массив;
    ОписаниеТиповДата.Добавить(Тип("Null"));
    ОписаниеТиповДата.Добавить(Тип("Дата"));
    
    КвалификаторДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата);
    
    Для Каждого КолонкаТаблицаЗначений Из ТаблицаЗначений.Колонки Цикл
        
        ИмяКолонки = КолонкаТаблицаЗначений.Имя;
        Заголовок  = ПолучитьПредставлениеИзИдентификатора(КолонкаТаблицаЗначений.Имя);
        
        ПолеНабораДанных = ТиповыеОтчеты.ДобавитьПолеНабораДанных(НаборДанных, ИмяКолонки, Заголовок, ИмяКолонки);
        
        Если КолонкаТаблицаЗначений.ТипЗначения = Новый ОписаниеТипов(ОписаниеТиповДата,,, КвалификаторДаты) Тогда
            ПолеНабораДанных.Оформление.УстановитьЗначениеПараметра("Формат", "ДЛФ=Д");
        КонецЕсли;
        
        НайденноеЗначение = "";
        
        Если СтруктураПоляИтогов.Свойство(ИмяКолонки, НайденноеЗначение) Тогда
            
            Если НайденноеЗначение = Неопределено Тогда
                НайденноеЗначение = "Сумма";
            КонецЕсли;
            
            ПолеИтога = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
            ПолеИтога.ПутьКДанным = ПолеНабораДанных.ПутьКДанным;
            ПолеИтога.Выражение   = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1(%2)", НайденноеЗначение, ПолеИтога.ПутьКДанным);
            
        КонецЕсли;
        
        Если СтруктураПоляИтоговОформление.Свойство(ИмяКолонки, НайденноеЗначение) Тогда
            ПолеНабораДанных.Оформление.УстановитьЗначениеПараметра("Формат", НайденноеЗначение);
        КонецЕсли;
        
    КонецЦикла;
    
    НастройкиПоУмолчанию = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    
    ТиповыеОтчеты.ДобавитьВыбранноеПоле(НастройкиПоУмолчанию.Выбор, "Подразделение");
    ТиповыеОтчеты.ДобавитьВыбранноеПоле(НастройкиПоУмолчанию.Выбор, "Сотрудник");
    
    й = ДобавитьГруппировку(НастройкиПоУмолчанию, "Подразделение");
    
    Для Каждого ПолеГруппировки Из й.ПоляГруппировки.Элементы Цикл
        
        ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;
        
    КонецЦикла;
    
    н = ДобавитьГруппировку(й);
    
    //Поле = НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    //Поле.Поле = Новый ПолеКомпоновкиДанных("Подразделение");
    //Поле.Поле = Новый ПолеКомпоновкиДанных("Подразделение");
    
    КомпоновщикНастроекКомпоновкиДанных = ТиповыеОтчеты.ПолучитьКомпоновщикПоСхемеИНастройкам(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    
    //таб = Новый ТабличныйДокумент;
    
    //ТиповыеОтчеты.СформироватьТиповойОтчет(Новый Структура("СхемаКомпоновкиДанных, КомпоновщикНастроек, ОтрицательноеКрасным, РасширеннаяНастройка", СхемаКомпоновкиДанных, КомпоновщикНастроекКомпоновкиДанных, ложь, ложь), таб);
    
    //таб.Показать("!");
    
    СохранитьСКД(СхемаКомпоновкиДанных, "2");
    
    //Для Каждого Элемент Из СтруктураПоляГруппировок Цикл
    //    
    //    НоваяГруппировка = ТиповыеОтчеты.ДобавитьГруппировку(КомпоновщикНастроекКомпоновкиДанных, Элемент.Ключ);
    //    
    //    Если НЕ Элемент.Значение = Неопределено Тогда
    //        
    //        МассивПоляГруппировки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Элемент.Значение,, Истина);
    //        
    //        Для Каждого ИмяПоляГруппировки Из МассивПоляГруппировки Цикл
    //            
    //            НовоеПолеГруппировки = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    //            НовоеПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляГруппировки);
    //            
    //        КонецЦикла;
    //        
    //    КонецЕсли;
    //    
    //КонецЦикла;
    
    //ТиповыеОтчеты.ДобавитьГруппировку(КомпоновщикНастроекКомпоновкиДанных);
    
    //Для Каждого КолонкаТаблицаЗначений Из ТаблицаЗначений.Колонки Цикл
    //    ТиповыеОтчеты.ДобавитьВыбранноеПоле(КомпоновщикНастроекКомпоновкиДанных, КолонкаТаблицаЗначений.Имя);
    //КонецЦикла;
    
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекКомпоновкиДанных.Настройки, ДанныеРасшифровки);
    
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("Таблица", ТаблицаЗначений);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
    
    ПроцессорВыводаРезультата = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВыводаРезультата.УстановитьДокумент(ТабличныйДокумент);
    
    Если ФлагИспользованиеРасшифровки Тогда
        
        ТабличныйДокумент.ТолькоПросмотр        = Истина;
        ТабличныйДокумент.ОтображатьГруппировки = истина;//Булево(СтруктураПоляГруппировок.Количество());
        ТабличныйДокумент.ОтображатьЗаголовки   = Ложь;
        ТабличныйДокумент.ОтображатьСетку       = Ложь;
        
        ПроцессорВыводаРезультата.НачатьВывод();
        
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
        
        Пока НЕ ЭлементРезультата = Неопределено Цикл
            
            ПроцессорВыводаРезультата.ВывестиЭлемент(ЭлементРезультата);
            
            Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
                
                Для СчетчикКолонок = 1 по ТабличныйДокумент.ШиринаТаблицы Цикл
                    
                    ТекРасшифровкаИдентификатор = ТабличныйДокумент.Область(ТабличныйДокумент.ВысотаТаблицы, СчетчикКолонок).Расшифровка;
                    
                    Если ТипЗнч(ТекРасшифровкаИдентификатор) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
                        ТабличныйДокумент.Область(ТабличныйДокумент.ВысотаТаблицы, СчетчикКолонок).Расшифровка = ДанныеРасшифровки.Элементы[ТекРасшифровкаИдентификатор].ПолучитьПоля()[0].Значение;
                    КонецЕсли;
                    
                КонецЦикла;
                
            КонецЕсли;
            
            ЭлементРезультата = ПроцессорКомпоновки.Следующий();
            
        КонецЦикла;
        
        ПроцессорВыводаРезультата.ЗакончитьВывод();
        
    Иначе
        
        ПроцессорВыводаРезультата.Вывести(ПроцессорКомпоновки);
        
    КонецЕсли;
    
    Возврат ТабличныйДокумент;
    
КонецФункции

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



2 ssh2QQ6
 
25.10.14
01:10
Настроить иерархию у поля нужно на вкладке наборы данных
3 skaparez
 
25.10.14
11:26
(2) Волшебник, я хотел уже забить (а так трудно жить потом с нерешённой проблемой), но помогло не настройка поля "Проверка иерархии" (вывожу ведь полностью программно) - интуитивно понял с подсказки что копать нужно там. И действительно: добавив строку

ПолеНабораДанных.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Подразделения");

получил нужный результат (УРА!)

источник тут: [a]http://forums.kuban.ru/f1040/skd_vyvod_dannyh_s_ierarhiej-3900631.html[/a]
4 Chameleon1980
 
25.10.14
12:58
убита
5 skaparez
 
25.10.14
13:04
(4) не убита, я не так оформил. http://forums.kuban.ru/f1040/skd_vyvod_dannyh_s_ierarhiej-3900631.html
Закон Брукера: Даже маленькая практика стоит большой теории.