Имя: Пароль:
1C
 
вопросы по работе с деревом значений.
0 Zakella86
 
11.08.17
13:59
Добрый день. Есть исходный код. Он программно создает дерево значений . Все норм работает, но проблемы начинаются на уровне оформления и развертки строк.
Хотел развернуть строки таким методом

КоллекцияЭлементовДерева=ДеревоБюджет.ПолучитьЭлементы();
//Свернуть дерево
Для Каждого Строка Из КоллекцияЭлементовДерева Цикл
     ИдентификаторСтроки=Строка.ПолучитьИдентификатор();
     Элементы.ДеревоБюджет.Свернуть(ИдентификаторСтроки);
КонецЦикла;

Но проблема в том что на форме у меня нет ДеревоБюджет как данныеформыдерево. потому что он создается программно. Естественно синтаксис ругается на отсуствие ДеревоБюджет .
Можно ли таблица формы Элементы.ДеревоБюджет как таблица формы перевести  в ДеревоБюджет  как данныеформыдерево? Или есть другой способ?

И второй вопрос , как мне сделать жирным через условное офоррмление только те строки дерева, у которых есть подстроки в иерархии? Т.е по сути жирным должны быть только итоги.

Вот пример кода который нашел в интернете, похожий сделал и у себя


ДеревоОбъект = Новый ДеревоЗначений;
    ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
    Для к1 = 1 По 3 Цикл
        СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
        СтрокаУ1.Узел = "Узел"+к1;
        Для к2 = 1 По 3 Цикл
            СтрокаУ2 = СтрокаУ1.Строки.Добавить();
            СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
            Для к3 = 1 По 3 Цикл
                СтрокаУ3 = СтрокаУ2.Строки.Добавить();
                СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    // Создание Реквизита формы типа ДанныеФормыДерево
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево",
        Новый ОписаниеТипов("ДеревоЗначений")));
    Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
        МассивДобавляемыхРеквизитов.Добавить(
           Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
    КонецЦикла;
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

    // Преобразование объекта прикладного типа ДеревоЗначений
    // в реквизит управляемой формы (данные формы)
    ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");

    // Создание элемента формы типа ТаблицаФормы для отображения дерева
    ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
    ЭлементДерево.ПутьКДанным = "Дерево";
    ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;

    Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
        НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"),
            ЭлементДерево);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
    КонецЦикла;
1 Dvoe4nik
 
11.08.17
16:53
(0) если тебе преобразовать ТЗ в ДЗ то делай запрос с итогами к тз и выгружай в дерево. по второму- обходишь рекурсивно все строки дерева, и если у них есть Строки.Количество()>0 то ставишь условное оформление
2 aleks_default
 
11.08.17
17:32
"Но проблема в том что на форме у меня нет ДеревоБюджет как данныеформыдерево. потому что он создается программно"
Че? Если ты создал программно элемент формы значит он есть, просто может называется по-другому

Я для оформления добавил колонку "Уровень" которую и заполнял при формировании дерева. И в УФ уже завязывался на нее.
3 Zakella86
 
11.08.17
18:03
я не очень понимаю где и как мне вставить условное оформление. Если кому не сложно подскажите. Вот код


&НаСервере
Функция ОбновитьДерево ()
    
    МассивКолонк = Новый Массив;
    МесяцыНомер = Новый Соответствие;
    //КолонкиСостава = ДеревоБюджетОбъект.Колонки;
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("Число"));
    КЧ = Новый КвалификаторыЧисла(19,2);
    ОписаниеЧисло = Новый ОписаниеТипов(МассивТипов,КЧ);
    
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Субпрограмма", Справочники.Субпрограммы.ПустаяСсылка());
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Субпрограммы.Владелец КАК Программа,
    |    Субпрограммы.Ссылка КАК Субпрограмма
    |ИЗ
    |    Справочник.Субпрограммы КАК Субпрограммы
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    &Субпрограмма,
    |    &Субпрограмма
    |ГДЕ
    |    ЛОЖЬ
    |ИТОГИ ПО
    |    Программа";
    
    ПредДеревоЗнач = РеквизитФормыВЗначение("ДеревоБюджет");
    
     ДеревоБюджетОбъект = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    Для каждого СтрокаРодитель Из ДеревоБюджетОбъект.Строки Цикл
        Для каждого Строка Из СтрокаРодитель.Строки Цикл
            Строка.Программа = Строка.Субпрограмма;
        КонецЦикла;
    КонецЦикла;
    
    //ДеревоБюджетОбъект.Колонки.Удалить(ДеревоБюджетОбъект.Колонки.Субпрограмма);
    
    Для каждого ТекКолонка Из ДеревоБюджетОбъект.Колонки Цикл
        
        Если Лев(ТекКолонка.Имя,5) = "Месяц" ИЛИ ТекКолонка.Имя = "Итого" Тогда
            
            МассивКолонк.Добавить(ТекКолонка);
            
        КонецЕсли;
        
    КонецЦикла;
    
    Для каждого ТекКолонка Из МассивКолонк Цикл
        
        ДеревоБюджетОбъект.Колонки.Удалить(ТекКолонка);
        
    КонецЦикла;
    
    
    МассивКолонк = Новый Массив;
    Для каждого ТекКолонка Из ДеревоБюджетОбъект.Колонки Цикл
        
        Если Лев(ТекКолонка.Имя,5) = "Месяц" ИЛИ ТекКолонка.Имя = "Итого" Тогда
            
            МассивКолонк.Добавить(ТекКолонка);
            
        КонецЕсли;
        
    КонецЦикла;
    
    Для каждого ТекКолонка Из МассивКолонк Цикл
        ДеревоБюджетОбъект.Колонки.Удалить(ТекКолонка);
    КонецЦикла;
    
    
    Если ЗначениеЗаполнено(Объект.ДатаНачала) И ЗначениеЗаполнено(Объект.ДатаОкончания) Тогда
        Н = 0;
        ДатаТек = НачалоМесяца(Объект.ДатаНачала);
        Пока ДатаТек <= КонецДня(Объект.ДатаОкончания) Цикл
            Н = Н + 1;
            ДеревоБюджетОбъект.Колонки.Добавить("Месяц"+Н, ОписаниеЧисло, Формат(ДатаТек, "ДФ='MMMM yyyy'"), 19);
            
            
            МесяцыНомер.Вставить(ДатаТек, Н);
            ДатаТек = ДобавитьМесяц(ДатаТек, 1);
        КонецЦикла;
        ДеревоБюджетОбъект.Колонки.Добавить("Итого", ОписаниеЧисло, "Итого", 19);
    КонецЕсли;
    
    
    РасчитатьДанныеПоСТрокамДерева(ДеревоБюджетОбъект,МесяцыНомер);
    
    МассивДобавляемыхРеквизитов = Новый Массив;
    Для Каждого Колонка Из ДеревоБюджетОбъект.Колонки Цикл
        Если ПредДеревоЗнач.Колонки.Найти(Колонка.Имя)=Неопределено  Тогда
            МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ДеревоБюджет"));    
        КонецЕсли;
    КонецЦикла;
    
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    ДеревоБюджет.ПолучитьЭлементы().Очистить();
    ЗначениеВРеквизитФормы(ДеревоБюджетОбъект,"ДеревоБюджет");
    
    // добавить колонки для элемента формы ДеревоЗначений
    Для Каждого Колонка Из ДеревоБюджетОбъект.Колонки Цикл
        Если Элементы.ДеревоБюджет.ПодчиненныеЭлементы.Найти(Колонка.Имя)=Неопределено  Тогда
            НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), Элементы.ДеревоБюджет);
            НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
            НовыйЭлемент.ПутьКДанным = "ДеревоБюджет." + Колонка.Имя;
            НовыйЭлемент.Заголовок  =  Колонка.Заголовок;
            Если Колонка.Имя ="Субпрограмма" Тогда
                НовыйЭлемент.Видимость = Ложь ;
            КонецЕсли;
            НовыйЭлемент.УстановитьДействие("ПриИзменении",
        "МесяцПриИзменении");
        

        КонецЕсли;
        
        
                
    КонецЦикла;
    
        
    КлючНастроек = "ПериодыМесяц";    
    Настройки = Новый Соответствие;
    Настройки.Вставить("МесяцыНомер", МесяцыНомер);
    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПериодыМесяц", КлючНастроек, Настройки);
    
    ПоказатьПрограммыБезСубПРограмм();
КонецФункции