Имя: Пароль:
1C
 
Как заполнить дерево элементами из группы справочника, сохранив иерархию?
0 DTX 4th
 
26.07.17
18:34
Пытался так:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ИСТИНА КАК Пометка,
                   |    1 КАК Цена,
                   |    Номенклатура.Ссылка КАК Номенклатура
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
                   |ИТОГИ ПО
                   |    Номенклатура ТОЛЬКО ИЕРАРХИЯ";
    Запрос.УстановитьПараметр("Группа", ГруппаНоменклатуры);
    РезультатЗапроса = Запрос.Выполнить();
    
    Рез = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    ЗначениеВРеквизитФормы(Рез, "Дерево");


Заполняет, но криво. Плюс есть верхние группы, которые не нужны.
Т.е. если у меня есть вот такое дерево:
А
-А1
--АА
---ааа
--аа
-А2
И пользователь выбирает группу А1, в дереве на форме мне нужно увидеть:
АА
-ааа
аа
1 Dvoe4nik
 
26.07.17
18:42
(0) Номенклатура.ссылка.родитель в иерархии(&Группа) попробуй
2 DTX 4th
 
26.07.17
18:52
(1) Что это изменит?
Не помогло

В справочнике выглядит так:
http://i.imgur.com/TU8lcjZ.png

Результат (0) вот так:
http://i.imgur.com/1T9MI0z.png
3 DTX 4th
 
26.07.17
19:18
Та-дам!
&НаСервере
Процедура ЗаполнитьДерево()
    Д = РеквизитФормыВЗначение("Дерево");
    Д.Строки.Очистить();
    
    ВыборкаПоЦенам = ПолучитьВыборкуПоЦенам();    
    СформироватьДерево(Д, ГруппаНоменклатуры, ВыборкаПоЦенам);
    
    ЗначениеВРеквизитФормы(Д, "Дерево");
КонецПроцедуры

&НаСервере
Функция ПолучитьВыборкуПоЦенам()
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.Цена
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |ГДЕ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура В ИЕРАРХИИ(&Номенклатура)";
    Запрос.УстановитьПараметр("Номенклатура", ГруппаНоменклатуры);
    РезультатЗапроса = Запрос.Выполнить();
    
    Возврат РезультатЗапроса.Выбрать();     
КонецФункции


&НаСервере
Функция СформироватьДерево(Корень, Группа, ВыборкаПоЦенам)
    Отбор = Новый Структура("Номенклатура");
    
    БылиНенулевыеЦены = Ложь;
    
    Выборка = Справочники.Номенклатура.Выбрать(Группа);
    Пока Выборка.Следующий() Цикл
        Отбор.Номенклатура = Выборка.Ссылка;
        ВыборкаПоЦенам.Сбросить();
        Если Выборка.ЭтоГруппа ИЛИ ВыборкаПоЦенам.НайтиСледующий(Отбор) Тогда
            Стр = Корень.Строки.Добавить();
            Стр.Номенклатура = Выборка.Ссылка;
            
            Если Выборка.ЭтоГруппа Тогда
                Если НЕ СформироватьДерево(Стр, Выборка.Ссылка, ВыборкаПоЦенам) Тогда
                    Корень.Строки.Удалить(Стр);                    
                КонецЕсли;
            Иначе
                Стр.Цена = ВыборкаПоЦенам.Цена;
                БылиНенулевыеЦены = Истина;
            КонецЕсли;    
        КонецЕсли;          
    КонецЦикла;        
    Возврат БылиНенулевыеЦены;
КонецФункции

Осталось понять, можно ли это сделать одним запросом.