Имя: Пароль:
1C
1С v8
Дерево значений, выгрузка из запроса
0 mpv-faq
 
11.08.17
11:51
Здравствуйте, есть запрос
Запрос.Текст = "ВЫБРАТЬ
                   |    СправочникНоменклатура.Ссылка КАК Категория,
                   |    ЛОЖЬ КАК Выгружать
                   |ИЗ
                   |    Справочник.Номенклатура КАК СправочникНоменклатура
                   |ГДЕ
                   |    СправочникНоменклатура.ЭтоГруппа
                   |    И СправочникНоменклатура.Ссылка <> &ВерхняяГруппа
                   |    И СправочникНоменклатура.Ссылка В ИЕРАРХИИ(&ВерхняяГруппа)
                   |СГРУППИРОВАТЬ ПО
                   |    СправочникНоменклатура.Ссылка
                   |ИТОГИ ПО
                   |    Категория ТОЛЬКО ИЕРАРХИЯ";
    Запрос.УстановитьПараметр("ВерхняяГруппа", ВерхняяГруппа);
    РезультатЗапроса = Запрос.Выполнить();    
    Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

В этом дереве нет последних каталогов по иерархии в каждом каталоге, как быть?
1 pessok
 
11.08.17
11:52
|    И СправочникНоменклатура.Ссылка <> &ВерхняяГруппа

а что ты ожидал?
2 mpv-faq
 
11.08.17
11:53
(1) Что он не возьмет этот каталог в иерерхию а только подлежащие к нему
3 mpv-faq
 
11.08.17
11:53
Он по 3 - 4 иерархии а послдние в любом каталоге не выгружает
4 mpv-faq
 
11.08.17
11:54
Т. е. скажем
- 1
  -2
    -3
      -4
Так вот 4 не выгрузит то есть не будет его в иерархии
5 mistеr
 
11.08.17
11:55
(0) Вместо "Категория ТОЛЬКО ИЕРАРХИЯ" нужно "Категория ИЕРАРХИЯ"
6 mpv-faq
 
11.08.17
11:56
(5) А так берет себя же самого
7 mpv-faq
 
11.08.17
11:56
(5) т.е. по иерархии вниз сам себе берет каждый родитель
8 pessok
 
11.08.17
11:57
(2) ну так ты и написал в (0), что он его не взял
9 mpv-faq
 
11.08.17
11:57
Как их отсекать?
10 mpv-faq
 
11.08.17
11:58
(8) Не это он неберет верхниюю а получается так
-1
  -1
  -2
    -2
    -3
      -3
      -4
11 mpv-faq
 
11.08.17
11:59
Вот нужно что бы сам себя не брал и будет огонь
12 mpv-faq
 
11.08.17
12:00
Нет мыслей кроме как вручную собирать дерево?
13 mpv-faq
 
11.08.17
12:03
Ну же ребят
14 mistеr
 
11.08.17
12:11
(12) Выгрузить(), перенести строки с 1-го уровня на 0-й, удалить корень.

Но я бы выгружал в цикле. Заодно научишься с выборками работать. :)
15 pessok
 
11.08.17
12:13
а я так и не понял в чем задача...
16 mistеr
 
11.08.17
12:17
(15) Выгрузить некую иерархию без корня, как я понял.
17 МихаилМ
 
11.08.17
12:18
используйте либо сгруппировать либо итоги по
18 mpv-faq
 
11.08.17
12:20
(17) Что это даст
19 mpv-faq
 
11.08.17
12:21
(14) Можно пример если не сложно, пожалуйста
20 mpv-faq
 
11.08.17
12:25
Ладно вроде получилось
Процедура ОбходДерева(перДерево)
    
    Сч = 0;
    Для Каждого тСтр Из перДерево.Строки Цикл
        Если Сч = 0 И НЕ тСтр.Категория.Наименование = "Товары" Тогда // Товары это верхнаяя категория
            
            перДерево.Строки.Удалить(тСтр);    
        Иначе
            тСтр.Выгружать = ЛОЖЬ;    
            Если тСтр.Строки.Количество() > 0 Тогда
                ОбходДерева(тСтр);
            КонецЕсли;    
        КонецЕсли;
        Сч = Сч + 1;
    КонецЦикла;
    
КонецПроцедуры
21 mpv-faq
 
11.08.17
13:45
МассивУдалСтрок = Новый Массив;
    ОбходДерева(РезДерево, "", МассивУдалСтрок);
    Для Каждого ЭлМассива Из МассивУдалСтрок Цикл
        ЭлМассива.Дерево.Строки.Удалить(ЭлМассива.тСтр);        
    КонецЦикла;




Процедура ОбходДерева(перДерево, удалРодитель, МассивУдалСтрок)
    
    Для Каждого тСтр Из перДерево.Строки Цикл    
        Если удалРодитель = тСтр.Категория Тогда
            СтруктураУдаления = Новый Структура;
            СтруктураУдаления.Вставить("Дерево", перДерево);
            СтруктураУдаления.Вставить("тСтр", тСтр);
            МассивУдалСтрок.Добавить(СтруктураУдаления);
            //Сообщить("Удалено " + удалРодитель + " | " + тСтр.Категория.Наименование + " | Количество = " + тСтр.Строки.Количество());    
            //перДерево.Строки.Удалить(тСтр);
        Иначе
            Сообщить("НЕ Удалено " + удалРодитель + " | " + тСтр.Категория.Наименование + " | Количество = " + тСтр.Строки.Количество());
            тСтр.Выгружать = ЛОЖЬ;
            Если тСтр.Строки.Количество() >= 0 Тогда
                локУдалРодитель = тСтр.Категория;
                ОбходДерева(тСтр, локУдалРодитель, МассивУдалСтрок);
            КонецЕсли;
        КонецЕсли;            
    КонецЦикла;
    
КонецПроцедуры
Основная теорема систематики: Новые системы плодят новые проблемы.