Как результат СКД в виде Табличного Документа разобрать и вывести в Дерево Значений Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица - выдает ошибку "Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений".
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме
Код 1C v 8.х Процедура ЗаполнитьДерево()
ДеревоЗначений. Строки. Очистить( ) ;
КолРазмеров = 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 ;
ИначеЕсли i9 Тогда Кол. Ширина = 7 ;
Иначе Кол. Ширина = 5 ;
КонецЕсли ;
Кол. ИзменениеРазмера = ИзменениеРазмераКолонки. НеИзменять;
КонецЕсли ;
i= i+ 1 ;
КонецЦикла ;
КонецПроцедуры
Автор: Абазин Антон Опубликовано на сайте: https://HelpF.pro Прямая ссылка: https://HelpF.pro/faq/view/1325.html