Каталог решений - Обход группировок по иерархии

Обход группировок по иерархии

Обход группировок по иерархии

В наличии

Вроде и тема небольшая, не для статьи, но поиски в интернете показали, что найти ответ довольно сложно. Из-за простоты вопроса специалисты обычно отмахиваются, считая, что вопрошающий не разбирается с азами программирования, не понимает рекурсии. В итоге на форумах тема обычно остается без ответа, либо приводится только часть ответа кратко. На самом деле есть «подводные камни»,  которые нужно знать.

Категория:

Описание

«Подводные камни», мешающие реализовать обход иерархии:

1)      В запросе в итогах нужно использовать ключевое слово ИЕРАРХИЯ, например, «ИТОГИ ПО Номенклатура Иерархия»

2)      При использовании Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) ,если есть несколько уровней группировки, нужно указывать второй параметр, строку с именем поля группировки. Например, для иерархической группироки по номенклатуре правильно будет Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, «Номенклатура»)

3)      При обходе выборки мы можем находиться в текущий момент на элементе или папке, для папки необходимо запускать рекурсивно выборку элементов в этой папке. А для элемента нижестоящую выборку, если есть группировки в запросе ниже нашей иерархической группировки, либо ничего не делать, если наша группировка нижняя. Чтобы определить тип элемента, используется функция ТипЗаписи()

Сам алгоритм обхода.

1)      Без иерархии

Выборка1 = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); 
Пока Выборка1.Следующий() Цикл
  // Вставить обработку выборки Выборка1
  Выборка2 = Выборка1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
  Пока Выборка2.Следующий() Цикл
    // Вставить обработку выборки Выборка2
    ОбработатьЭлемент();
  КонецЦикла;
КонецЦикла;

2)      Иерархия на первом уровне группировки, второй уровень без иерархии

           

ВыборкаСИерархией = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура");
ВыбратьЭлементыВИерархии(ВыборкаСИерархией);
 
Процедура ВыбратьЭлементыВИерархии(ВыборкаСИерархией)
  Пока ВыборкаСИерархией.Следующий() Цикл
    Если ВыборкаСИерархией.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоИерархии Тогда
      ВыбратьЭлементыВИерархии (ВыборкаСИерархией.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура"));
    ИначеЕсли ВыборкаСИерархией.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
      ВыбратьЭлементыБезИерархии (ВыборкаСИерархией.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам));
    КонецЕсли;   
  КонецЦикла;
КонецПроцедуры
 
Процедура ВыбратьЭлементыБезИерархии (ВыборкаБезИерархии)
  Пока ВыборкаБезИерархии.Следующий() Цикл
    // Вставить обработку выборки ВыборкаБезИерархии
    ОбработатьЭлемент();
  КонецЦикла;
КонецПроцедуры

 

3) Первый уровень без иерархии, второй с иерархией

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

4) Первый уровень без иерархии, второй с иерархией (без рекурсии)

    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура");
    
    Стек = Новый Массив ( 200 );
    КоличествоВСтеке=0;
    Выход=Не ВыборкаНоменклатура.Следующий();
    
    Пока Не Выход Цикл
        Пока ВыборкаНоменклатура.ТипЗаписи()=ТипЗаписиЗапроса.ИтогПоИерархии Цикл
            Стек[КоличествоВСтеке]=ВыборкаНоменклатура;
            КоличествоВСтеке=КоличествоВСтеке+1;
            // Обработка папки
            Сообщить(ВыборкаНоменклатура.Номенклатура);
            ВыборкаНоменклатура=ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Номенклатура");
            ВыборкаНоменклатура.Следующий();
        КонецЦикла;
        // Обработка элемента
        Сообщить(ВыборкаНоменклатура.Номенклатура);
        // Обработка следующей группировки
        ВыбратьДанные(ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам));
        ЕстьСледующий= ВыборкаНоменклатура.Следующий();
        Пока Не ЕстьСледующий И КоличествоВСтеке>0 Цикл
            КоличествоВСтеке=КоличествоВСтеке-1;
            ВыборкаНоменклатура=Стек[КоличествоВСтеке];
            ЕстьСледующий= ВыборкаНоменклатура.Следующий();
        КонецЦикла;
        Если Не ЕстьСледующий И КоличествоВСтеке=0 Тогда
            Выход=Истина;
        КонецЕсли;
    КонецЦикла;



has been added to your cart:
Оформление заказа