Имя: Пароль:
1C
1С v8
Как вывести группы справочника иерархически?
0 lanc2233
 
30.01.15
22:42
ТекстЗапроса =
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.ПометкаУдаления = ЛОЖЬ
    |    И Номенклатура.ЭтоГруппа = ИСТИНА
    |ИТОГИ ПО
    |    Ссылка  ИЕРАРХИЯ"
    ;
    Запрос = Новый Запрос(ТекстЗапроса);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        // ... сообщить    
    КонецЦикла;

Пробовал разные варианты, вроде ОбходРезультатаЗапросаПоГруппировкам,
ставить внутри условия вроде
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда
КонецЕсли;

Все время вывод не такой получается. Задача просто получить группы как в форме списка справочника.

можете подсказать как это сделать?
1 Sereja
 
30.01.15
23:02
ПоГруппировкамСИерархией (ByGroupsWithHierarchy)


Это надо в выбрать писать
2 Sereja
 
30.01.15
23:03
Результат = Запрос.Выполнить();
        Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
3 lanc2233
 
30.01.15
23:03
(1) выбираются только группы нулевого уровня
4 Sereja
 
30.01.15
23:13
Так это ж дерево получается. Обходи сейчас дерево. Каждый узел дерева, и все там будет. Я скинул кусок рабочего кода
5 lanc2233
 
30.01.15
23:27
ТекстЗапроса =
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка,
    |    Номенклатура.ЭтоГруппа
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.ПометкаУдаления = ЛОЖЬ
    |    И Номенклатура.ЭтоГруппа = ИСТИНА
    |ИТОГИ ПО
    |    Ссылка ТОЛЬКО ИЕРАРХИЯ"
    ;
    Запрос = Новый Запрос(ТекстЗапроса);
    Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    ОбойтиПодстроки(Дерево.Строки);

Процедура ОбойтиПодстроки(СтрокиДерева)
    Для Каждого Строка Из СтрокиДерева Цикл
        Сообщить(ДобавитьУровниТабуляции(Строка)+"("+Строка.Ссылка.Уровень() +") - "+ Строка.Ссылка);
        ОбойтиПодстроки(Строка.Строки);
    КонецЦикла;
КонецПроцедуры

Получается такой результат :

http://savepic.su/4888939.png
6 lanc2233
 
30.01.15
23:31
хочу добиться такого http://savepic.su/4913514.png
7 Sereja
 
30.01.15
23:31
(5) Так а что не так?
8 Sereja
 
30.01.15
23:32
(6) Так ты уже добился. Если это на форме надо, то кидай на форму табличное поле. Ставь на 1 колонке Иерирхию и грузи в него результат запроса
9 lanc2233
 
30.01.15
23:35
та мне не на форму, я xml-файл формирую программно.
на скриншоте элемент "2" только шесть раз выводится
10 lanc2233
 
30.01.15
23:36
пять
11 Sereja
 
30.01.15
23:37
Дерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
        
        Запись.ЗаписатьНачалоЭлемента("ТМЦ");
        ОбойтиУровеньДерева(Дерево.Строки, Запись);
        Запись.ЗаписатьКонецЭлемента();
        Запись.ЗаписатьКонецЭлемента();
        Запись.Закрыть();
12 Sereja
 
30.01.15
23:37
Процедура ОбойтиУровеньДерева(Строки,Запись) Экспорт
    Для Каждого Строка из Строки Цикл
        СсылкаНаЭлемент  = Строка.Ссылка;
        Запись.ЗаписатьНачалоЭлемента("Номенклатура");
        Если Строка.ЭтоГруппа = Истина Тогда
            Запись.ЗаписатьАтрибут("ЭтоГруппа", СокрЛП(Строка.ЭтоГруппа));
            Запись.ЗаписатьАтрибут("Код", СокрЛП(Строка(СсылкаНаЭлемент.Код)));
            Запись.ЗаписатьАтрибут("Наименование", СокрЛП(СсылкаНаЭлемент.Наименование));
            Запись.ЗаписатьАтрибут("Артикул", СокрЛП(Строка(СсылкаНаЭлемент.Артикул)));
            Запись.ЗаписатьАтрибут("Родитель", СокрЛП(Строка.Ссылка.Родитель));
            //
            Запись.ЗаписатьАтрибут("УИД", СокрЛП(Строка(СсылкаНаЭлемент.УникальныйИдентификатор())));
            Запись.ЗаписатьАтрибут("УИДРодитель", СокрЛП(Строка.Ссылка.Родитель.УникальныйИдентификатор()));
            //
            ОбойтиУровеньДерева(Строка.Строки, Запись);
            Запись.ЗаписатьКонецЭлемента();
        ИначеЕсли Строка.ЭтоГруппа = Ложь Тогда
            Запись.ЗаписатьАтрибут("ЭтоГруппа", СокрЛП(Строка.ЭтоГруппа));
            Запись.ЗаписатьАтрибут("Код", СокрЛП(Строка(СсылкаНаЭлемент.Код)));
            Запись.ЗаписатьАтрибут("Наименование", СокрЛП(СсылкаНаЭлемент.Наименование));
            Запись.ЗаписатьАтрибут("Артикул", СокрЛП(Строка(СсылкаНаЭлемент.Артикул)));
            Запись.ЗаписатьАтрибут("Родитель", СокрЛП(Строка.Ссылка.Родитель));
            Запись.ЗаписатьАтрибут("ПутьКФото", СокрЛП(Строка.ПутьКФото));
            //
            Запись.ЗаписатьАтрибут("УИД", СокрЛП(Строка(СсылкаНаЭлемент.УникальныйИдентификатор())));
            Запись.ЗаписатьАтрибут("УИДРодитель", СокрЛП(Строка.Ссылка.Родитель.УникальныйИдентификатор()));
            //
            Запись.ЗаписатьКонецЭлемента();
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
13 Sereja
 
30.01.15
23:37
Этой процедурой пишу xml
14 lanc2233
 
30.01.15
23:41
(13) я не об этом спрашиваю.
на скриншоте1 - 16 строк
на скриншоте2 - 8 строк.

как получить на первом скриншоте такой-же результат как на втором?
15 lanc2233
 
31.01.15
11:17
Актуально ..
16 lanc2233
 
31.01.15
19:51
up
17 iceman2112
 
31.01.15
20:33
стесняюсь спросить, а ты потом куда это xml файл?
18 iceman2112
 
31.01.15
20:43
Вообще в гугле и на той же мисте в книге знаний, такие запросы есть, вроде там не ссылка выбирается а родитель
19 lanc2233
 
31.01.15
20:51
на сайт.
уже несколько часов потратил на все что в гугле и перебор разных вариантов. Про вариант с родителем в запросе правда не помню был или нет.

В принципе сейчас нашел возможность получить нормально, если есть хотя-бы один элемент в каждой папке. Как временный вариант проканает.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший