Имя: Пароль:
1C
 
v8: Выборка с иерархией - как обойти иерархию ПоГруппировкамСИерархией
0 FReIM
 
20.06.11
14:56
Столкнулся с проблемой и занялся её решением собственно почему не работает выборка по иерархии:
Запрос =Новый Запрос;
   Запрос.Текст="ВЫБРАТЬ
                |    Номенклатура.Ссылка КАК Ссылка
                |ИЗ
                |    Справочник.Номенклатура КАК Номенклатура
                |ИТОГИ ПО
                |    Ссылка ИЕРАРХИЯ";
   Результат=Запрос.Выполнить();
   Выборка=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   ТабДок = Новый ТабличныйДокумент;
   ТабДок.НачатьАвтогруппировкуСтрок();
   ТабДок.Очистить();
   Макет=ПолучитьМакет("Макет");
   Пока Выборка.Следующий() цикл
       ОбластьСсылка=Макет.ПолучитьОбласть("Строка");
       ОбластьСсылка.Параметры.Ссылка=Выборка.Ссылка;
       ТабДок.Вывести(ОбластьСсылка, Выборка.Уровень());
       Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
       Пока Выборка2.Следующий() цикл
       ОбластьСсылка=Макет.ПолучитьОбласть("Строка");
       ОбластьСсылка.Параметры.Ссылка=Выборка2.Ссылка;
       ТабДок.Вывести(ОбластьСсылка, Выборка2.Уровень());
       КонецЦикла
   КонецЦикла;
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
   ТабДок.Показать();

Как выяснилось Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) - явно недостаточно, необходимо для вложенной выборки явно задавать группировку. Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Ссылка")
Иначе метод Выборка.Следующий() для итогов по иерархии будет возвращать всегда "Ложь".
Т.е. если мы захотим для группы справочника получить вложенные группы, то необходимо явное указание наименования группировки "Ссылка".
Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Ссылка")
1 FReIM
 
20.06.11
14:58
Так, небольшая опечатка:
НЕ "Иначе метод Выборка.Следующий() для итогов по иерархии будет возвращать всегда "Ложь".... "
А
Иначе метод Выборка2.Следующий() для итогов по иерархии будет возвращать всегда "Ложь".
Т.е. если мы захотим для группы справочника получить вложенные группы, то необходимо явное указание наименования группировки "Ссылка".
Выборка2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Ссылка")
2 vmv
 
20.06.11
15:00
выгрузи запрос в дерево значений и обходи как хочь, надеюсь функционал по работе с деревьями в кармане

зачем парить репу с какими-то выборками
3 vmv
 
20.06.11
15:02
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
4 Ёпрст
 
20.06.11
15:04
(0) а нахрена 2-ая выборка ? Когда у тебя их всего одна!
   ТабДок.Очистить();
   ТабДок.Вывести(ОбластьЗаголовок);
   ТабДок.Вывести(ОбластьШапкаТаблицы);
   ТабДок.НачатьАвтогруппировкуСтрок();

   ВыборкаСсылка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

   Пока ВыборкаСсылка.Следующий() Цикл
       Если ВыборкаСсылка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда
           Область = ОбластьСсылкаИерархия;
       Иначе
           Область = ОбластьСсылка;
       КонецЕсли;

       Область.Параметры.Заполнить(ВыборкаСсылка);
       ТабДок.Вывести(Область, ВыборкаСсылка.Уровень());
   КонецЦикла;

   ТабДок.ЗакончитьАвтогруппировкуСтрок();
   ТабДок.Вывести(ОбластьПодвалТаблицы);
   ТабДок.Вывести(ОбластьПодвал);
5 Ёпрст
 
20.06.11
15:04
+4 вот тупо код, слепленный конструктором.
6 Defender aka LINN
 
20.06.11
15:15
(4) Иерархия потому что.
7 FReIM
 
20.06.11
15:30
(3)
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Выборка более гибкая штука, там рассчитаны все возможные итоги в любом порядке, т.е. можно выборку вложенную в любом порядке следования итогов выбрать.
Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Ссылка;Период")
так и Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Период;Ссылка").
8 FReIM
 
20.06.11
15:34
И итоги разные будут и обход их может быть разный. Особенно актуально для сложных многоуровневых выборок.
9 FReIM
 
20.06.11
15:36
В любом случае я просто хотел поделиться опытом, чтобы потом никто на эти грабли не наступал.
10 Guk
 
20.06.11
15:36
нажми букву "Я"...
11 FReIM
 
20.06.11
15:38
Лол. Самое смешное, что там я так ничего и не нашел. Просто вопросы без ответов, мало названия в поисковике просмотреть, нужно еще и найденое прочитать.
12 Guk
 
20.06.11
15:41
(11) странно. прямо во второй ссылке приведен пример из Радченко...
13 FReIM
 
20.06.11
16:33
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=537568&threadtype=0

Работать не будет попробуйте запустить написанный выше код. Справочник Номенклатура есть во многих конфигурациях
Примеры есть, но вот только они не рабочие, попробуйте обойти вложенность более 2 х уровней.

пример из митичкина, при развертке рекурсии в цикл работать не будет, так как поле групировки по иерархии явно во второй выборке не задано.

Пример из Митичкина:
Процедура ВыдатьРекурсивно(Выборка) Далее;
Процедура ВыполнитьЗапрос()

   Запрос = Новый Запрос("

   ВЫБРАТЬ Товар, Количество

   ИЗ Документ.РасходнаяНакладная.Состав

   УПОРЯДОЧИТЬ ПО Товар

   |ИТОГИ СУММА(Количество) ПО Товар, Товар ИЕРАРХИЯ");

   СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;

   Выборка = Запрос.Выполнить().Выбрать(СпособВыборки);

   ВыдатьРекурсивно (Выборка) ;

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

Процедура ВыдатьРекурсивно(Выборка)

   Пока Выборка.Следующий() Цикл

       //выведем в окно сообщений поля из результата

       Товар = Выборка.Наименование;

       Количество = Выборка.Количество;

       Сообщить("Товар: " + СокрЛП(Товар) +

       "Количество: " + СокрЛП(Количество));

       //продолжим выборку подчиненных записей

       СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;

       ВыдатьРекурсивно(Выборка.Выбрать(СпособВыборки));

   КонецЦикла;

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

тоже не совсем корректен, а для задачи с задынным уровнем вложений - нуждается в доработке.
14 FReIM
 
20.06.11
16:34
Запрос =Новый Запрос;
   Запрос.Текст="ВЫБРАТЬ
                |    Номенклатура.Ссылка КАК Ссылка
                |ИЗ
                |    Справочник.Номенклатура КАК Номенклатура
                |ИТОГИ ПО
                |    Ссылка ИЕРАРХИЯ";
   Результат=Запрос.Выполнить();
   Выборка=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   ТабДок = Новый ТабличныйДокумент;
   ТабДок.НачатьАвтогруппировкуСтрок();
   ТабДок.Очистить();
   Макет=ПолучитьМакет("Макет");
   Пока Выборка.Следующий() цикл
       ОбластьСсылка=Макет.ПолучитьОбласть("Строка");
       ОбластьСсылка.Параметры.Ссылка=Выборка.Ссылка;
       ТабДок.Вывести(ОбластьСсылка, Выборка.Уровень());
       Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
       Пока Выборка2.Следующий() цикл
       ОбластьСсылка=Макет.ПолучитьОбласть("Строка");
       ОбластьСсылка.Параметры.Ссылка=Выборка2.Ссылка;
       ТабДок.Вывести(ОбластьСсылка, Выборка2.Уровень());
       КонецЦикла
   КонецЦикла;
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
   ТабДок.Показать();
15 FReIM
 
20.06.11
16:35
код примитивный и из-за описанных выше не соблюденных условий работать не будет.
16 FReIM
 
20.06.11
16:42