Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица — выдает ошибку «Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений».
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме
используется тут: http://infostart.ru/public/101501
Процедура ЗаполнитьДерево() ДеревоЗначений.Строки.Очистить(); КолРазмеров = 0; СхемаКомпоновкиДанных = ПолучитьМакет("Схема"); Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; Для Каждого ЭлементОтбора Из ПостроительОтчета.Отбор Цикл Если Не ЭлементОтбора.Использование Тогда Продолжить; КонецЕсли; ВидСравненияВОтборе = мСоответствиеВидовСравнения.Получить(ЭлементОтбора.ВидСравнения); Если ВидСравненияВОтборе = Неопределено Тогда Продолжить; КонецЕсли; Если Лев(ЭлементОтбора.ПутьКДанным, 8) = "Свойство" Тогда ИмяПоля = "Номенклатура.["+мСоответствиеНазначений[ЭлементОтбора.Представление]+" (свойство)]"; ИначеЕсли Лев(ЭлементОтбора.ПутьКДанным, 9) = "Категория" Тогда ИмяПоля = "Номенклатура.["+мСоответствиеНазначений[ЭлементОтбора.Представление]+" (категория)]"; Иначе ИмяПоля = ЭлементОтбора.ПутьКДанным; КонецЕсли; ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля); Отбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Отбор.ЛевоеЗначение = ПолеОтбора; Отбор.Использование = Истина; Отбор.ВидСравнения = ВидСравненияВОтборе; Отбор.ПравоеЗначение = ЭлементОтбора.Значение; КонецЦикла; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки,, Тип("ГенераторМакетаКомпоновкиДанных")); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки); ТабличныйДокумент = Новый ТабличныйДокумент; ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина); //ТабличныйДокумент.Показать(); КолДанных = 5; //кол. данных в колонке таблицы СКД СоздатьДерево(ТабличныйДокумент, КолДанных); СтКол = Новый Структура; СтКол.Вставить("Ном", 1); СтКол.Вставить("Дат1", 2); СтКол.Вставить("Дат2", 3); СтКол.Вставить("Прих", 4); СтКол.Вставить("Реал", 5); СтКол.Вставить("Возв", 6); СтКол.Вставить("Остат", 7); СтКол.Вставить("ВПути", 8); СтрНом = Неопределено; СтрДерева = Неопределено; Для i=3 По ТабличныйДокумент.ВысотаТаблицы Цикл ПерваяКолонка = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Ном); Если ТипЗнч(ПерваяКолонка) = Тип("СправочникСсылка.Номенклатура") Тогда Если СтрНом <> Неопределено Тогда СтрНом.Строки.Сортировать("Продажи УБЫВ"); СтрНом.ОстатокМагазин = СтрНом.Строки.Итог("ОстатокМагазин"); СтрНом.ОстатокСклад = СтрНом.Строки.Итог("ОстатокСклад"); КонецЕсли; СтрНом = ДеревоЗначений.Строки.Добавить(); СтрДерева = СтрНом; ИначеЕсли ТипЗнч(ПерваяКолонка) = Тип("СправочникСсылка.Склады") Тогда СтрДерева = СтрНом.Строки.Добавить(); Дат1 = Формат(ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Дат1), "ДФ=dd.MM.yy"); Дат2 = Формат(ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Дат2), "ДФ=dd.MM.yy"); СтрДерева.Период = "" + Дат1 + " - " + Дат2; Иначе Продолжить; КонецЕсли; СтрДерева.Номенклатура = ПерваяКолонка; СтрДерева.Остаток = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Остат, Истина); СтрДерева.Приход = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Прих, Истина); СтрДерева.Продажи = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Реал, Истина); СтрДерева.Возврат = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Возв, Истина); Если ЗначениеЗаполнено(СтрДерева.Родитель) Тогда Если ПерваяКолонка.ТипСклада = Перечисления.ТипыСкладов.ТорговыйЗал Тогда СтрДерева.ОстатокМагазин = СтрДерева.Остаток; Иначе СтрДерева.ОстатокСклад = СтрДерева.Остаток; КонецЕсли; Попытка СтрДерева.ПроцентПродаж = СтрДерева.Продажи * 100 / СтрДерева.Родитель.Продажи; Исключение СтрДерева.ПроцентПродаж = "-"; КонецПопытки; Иначе СтрДерева.ПроцентПродаж = "100%"; КонецЕсли; Для j=1 По КолРазмеров Цикл СтрДерева["Ост" + j] = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, 3 + КолДанных * j + 4, Истина); СтрДерева["Пут" + j] = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, 3 + КолДанных * j + 5, Истина); КонецЦикла; КонецЦикла; КонецПроцедуры Процедура СоздатьДерево(ТабличныйДокумент, КолДанных) КЧ = Новый КвалификаторыЧисла(10, 0); Массив = Новый Массив; Массив.Добавить(Тип("Число")); ОписаниеТиповЧ = Новый ОписаниеТипов(Массив,,,КЧ); Ном = 3 + КолДанных + 1; //колонки в таблич. документе (Ном/Склад, перв. дата, посл. дата) КолРазмеров = (ТабличныйДокумент.ШиринаТаблицы - Ном-1) / КолДанных + 1; Для i=1 По КолРазмеров Цикл Размер = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, 1, Ном, Истина, Ложь); Ном = Ном + КолДанных; Попытка ДеревоЗначений.Колонки.Добавить("Ост" + i, ОписаниеТиповЧ, Размер, 5); ДеревоЗначений.Колонки.Добавить("Пут" + i, ОписаниеТиповЧ, "Путь", 5); ДеревоЗначений.Колонки.Добавить("Пер" + i, ОписаниеТиповЧ, "Пер", 5); Исключение КонецПопытки; КонецЦикла; ЭтаФорма.ЭлементыФормы.ДеревоЗначений.Значение = ДеревоЗначений; ЭтаФорма.ЭлементыФормы.ДеревоЗначений.СоздатьКолонки(); i=1; НомерРазмера=1; Для Каждого Кол Из ЭтаФорма.ЭлементыФормы.ДеревоЗначений.Колонки Цикл Кол.ТолькоПросмотр = Истина; Если i = (НомерРазмера + 8 + 1) Тогда Кол.Положение = ПоложениеКолонки.НоваяКолонка; ИначеЕсли i = (НомерРазмера + 8 + 2) Тогда Кол.Положение = ПоложениеКолонки.НаСледующейСтроке; ИначеЕсли i = (НомерРазмера + 8 + 3) Тогда Кол.Положение = ПоложениеКолонки.ВТойЖеКолонке; Кол.ТолькоПросмотр = Ложь; НомерРазмера = НомерРазмера + 3; КонецЕсли; Если i=1 Тогда Кол.Ширина = 20; Иначе Если i=2 Тогда Кол.Ширина = 11; ИначеЕсли i<=9 Тогда Кол.Ширина = 7; Иначе Кол.Ширина = 5; КонецЕсли; Кол.ИзменениеРазмера = ИзменениеРазмераКолонки.НеИзменять; КонецЕсли; i=i+1; КонецЦикла; КонецПроцедуры