«Подводные камни», мешающие реализовать обход иерархии:
1) В запросе в итогах нужно использовать ключевое слово ИЕРАРХИЯ, например, «ИТОГИ ПО Номенклатура Иерархия»
2) При использовании Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) ,если есть несколько уровней группировки, нужно указывать второй параметр, строку с именем поля группировки. Например, для иерархической группироки по номенклатуре правильно будет Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, «Номенклатура»)
3) При обходе выборки мы можем находиться в текущий момент на элементе или папке, для папки необходимо запускать рекурсивно выборку элементов в этой папке. А для элемента нижестоящую выборку, если есть группировки в запросе ниже нашей иерархической группировки, либо ничего не делать, если наша группировка нижняя. Чтобы определить тип элемента, используется функция ТипЗаписи()
Сам алгоритм обхода.
1) Без иерархии
Выборка1 = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка1.Следующий() Цикл
// Вставить обработку выборки Выборка1
Выборка2 = Выборка1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка2.Следующий() Цикл
// Вставить обработку выборки Выборка2
ОбработатьЭлемент();
КонецЦикла;
КонецЦикла;
2) Иерархия на первом уровне группировки, второй уровень без иерархии
ВыборкаСИерархией = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура");
ВыбратьЭлементыВИерархии(ВыборкаСИерархией);
Процедура ВыбратьЭлементыВИерархии(ВыборкаСИерархией)
Пока ВыборкаСИерархией.Следующий() Цикл
Если ВыборкаСИерархией.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоИерархии Тогда
ВыбратьЭлементыВИерархии (ВыборкаСИерархией.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура"));
ИначеЕсли ВыборкаСИерархией.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
ВыбратьЭлементыБезИерархии (ВыборкаСИерархией.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ВыбратьЭлементыБезИерархии (ВыборкаБезИерархии)
Пока ВыборкаБезИерархии.Следующий() Цикл
// Вставить обработку выборки ВыборкаБезИерархии
ОбработатьЭлемент();
КонецЦикла;
КонецПроцедуры
3) Первый уровень без иерархии, второй с иерархией
ВыборкаБезИерахии = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаБезИерахии.Следующий() Цикл
// Вставить обработку выборки ВыборкаБезИерахии
ВыборкаСИерархией = ВыборкаБезИерахии.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура"));
ВыбратьЭлементыВИерархии(ВыборкаСИерархией);
КонецЦикла;
Процедура ВыбратьЭлементыВИерархии(ВыборкаСИерархией)
Пока ВыборкаСИерархией.Следующий() Цикл
Если ВыборкаСИерархией.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоИерархии Тогда
ВыбратьЭлементыВИерархии (ВыборкаСИерархией.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура"));
ИначеЕсли ВыборкаСИерархией.ТипЗаписи()=ТипЗаписиЗапроса. ДетальнаяЗапись Тогда
ОбработатьЭлемент();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
4) Первый уровень без иерархии, второй с иерархией (без рекурсии)
ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура");
Стек = Новый Массив ( 200 );
КоличествоВСтеке=0;
Выход=Не ВыборкаНоменклатура.Следующий();
Пока Не Выход Цикл
Пока ВыборкаНоменклатура.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоИерархии Цикл
Стек[КоличествоВСтеке]=ВыборкаНоменклатура;
КоличествоВСтеке=КоличествоВСтеке+1;
// Обработка папки
Сообщить(ВыборкаНоменклатура.Номенклатура);
ВыборкаНоменклатура=ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура");
ВыборкаНоменклатура.Следующий();
КонецЦикла;
// Обработка элемента
Сообщить(ВыборкаНоменклатура.Номенклатура);
// Обработка следующей группировки
ВыбратьДанные(ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам));
ЕстьСледующий= ВыборкаНоменклатура.Следующий();
Пока Не ЕстьСледующий И КоличествоВСтеке>0 Цикл
КоличествоВСтеке=КоличествоВСтеке-1;
ВыборкаНоменклатура=Стек[КоличествоВСтеке];
ЕстьСледующий= ВыборкаНоменклатура.Следующий();
КонецЦикла;
Если Не ЕстьСледующий И КоличествоВСтеке=0 Тогда
Выход=Истина;
КонецЕсли;
КонецЦикла;