Я тут поискал-поискал... Ничего толкового не нашел на эту тему. Не знаю, может кому пригодится то, что я накропал:
// Функция ПолучитьГруппу(Уровней, ИмяПоля, ИмяКол) ТекКолонка = Уровней; возвр = ""; Для ТекКолонка = 1 По Уровней-1 Цикл возвр = возвр + " | CASE"; ВерхнийИндекс = Уровней-1; Пока ВерхнийИндекс > 0 Цикл возвр = возвр + " | WHEN "; Для НижнийИндекс = 1 По Уровней-1 Цикл возвр = возвр + "t"+НижнийИндекс+".ID is"+?(НижнийИндекс >= (ВерхнийИндекс-ТекКолонка+1)," not","")+" null "+?(НижнийИндекс = Уровней-1,"","AND "); КонецЦикла; // -- ВерхнийИндекс -- возвр = возвр + "then t"+ВерхнийИндекс+"."+ИмяПоля; ВерхнийИндекс = ВерхнийИндекс - 1; КонецЦикла; // -- ВерхнийИндекс -- возвр = возвр + " | END as "+ИмяКол+ТекКолонка+", "; КонецЦикла; // -- Уровней -- возврат возвр; КонецФункции // ПолучитьОписаниеЭлемента
// Функция ПолучитьЭлемент(Уровней, ИмяПоля) возвр = " | CASE"; Для ВерхнийИндекс = 1 По Уровней Цикл возвр = возвр + " | WHEN "; НижнийИндекс = Уровней; Пока НижнийИндекс >= ВерхнийИндекс Цикл возвр = возвр + "t"+НижнийИндекс+".ID is "+?(НижнийИндекс = ВерхнийИндекс,"not","")+" null "+?(НижнийИндекс = ВерхнийИндекс," AND t"+НижнийИндекс+".IsFolder=2 "," AND "); НижнийИндекс = НижнийИндекс - 1; КонецЦикла; // -- НижнийИндекс > 0 -- возвр = возвр + " then t"+ВерхнийИндекс+"."+ИмяПоля; КонецЦикла; // -- Уровней -- возвр = возвр + " | END "; возврат возвр; КонецФункции // ПолучитьОписаниеЭлемента
// Функция ЭлементыВИерархии(ВидСправочника) Уровней = Метаданные.Справочник(ВидСправочника).КоличествоУровней; Переменных = Уровней*2 + 2; СчетчикФильтров = СчетчикФильтров + 1; ТекстЗапроса = " |SELECT "+ПолучитьГруппу(Уровней, "ID", "lev")+" "+ПолучитьГруппу(Уровней, "Descr", "name"); el = ПолучитьЭлемент(Уровней, "ID"); elName = ПолучитьЭлемент(Уровней, "Descr"); ТекстЗапроса = ТекстЗапроса + el +" as el, "+elName+" as elName |FROM | $Справочник."+ВидСправочника+" as t"+Уровней; инд = Уровней-1; Пока инд > 0 Цикл ТекстЗапроса = ТекстЗапроса + " |LEFT JOIN $Справочник."+ВидСправочника+" as t"+инд+" ON t"+инд+".ID = t"+(инд+1)+".ParentID"; инд = инд - 1; КонецЦикла; // -- ВерхнийИндекс > 0 -- ТекстЗапроса = ТекстЗапроса + " |WHERE | t"+Уровней+".IsFolder = 2"; возврат ТекстЗапроса; КонецФункции //
Функция ЭлементыВИерархии(ВидСправочника) возвращает текст, который можн использовать как подзапрос, где нужно. В результатах запроса мы получаем колонки с группами для выбранных элементов. lev1 - ID группы верхнего уровня, lev2 - группы следующего уровня и т.д.
|