Волшебная процедура СКД — Таблица значений

Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица — выдает ошибку «Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений».
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме

используется тут: 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;

    КонецЦикла;

КонецПроцедуры

Добавить комментарий