Перечитал и вообще не понял вопроса. Есть же стандартный
CIblockSection::GetList() который за 1 запрос прекрасно все достает и со вложенностью.
В спойлере указал код, который получить все разделы включая подразделы для конкретного инфоблока, отсортированные по левому отступу (т.е. сверху вниз, слева на право). И все это за 1 запрос к БД средствами API.
Пример который проверял/**
* Всегда считаем что модуль установлен,
* поэтому просто подключаем его
*/
\Bitrix\Main\Loader::IncludeModule('iblock');
/**
* У меня для тестирования инфоблок с номером 5,
* у тебя может быть любой другой инфобло
*
* @var array Параметры фильтрации
*/
$arFilter = [
'IBLOCK_ID' => 5
];
/**
* В Битриксе разделы хранятся по принципу Nested sets
*
* @var array Параметры сортировки
*/
$arOrder = [
'LEFT_MARGIN' => 'ASC'
];
/**
* @var array Поля разделов
*/
$arSelect = [
'ID',
'LEFT_MARGIN',
'DEPTH_LEVEL',
'NAME'
];
$resSections = \CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect);
while( $arSection = $resSections->fetch() )
{
var_dump($arSection);
}
В чем я ошибся и где я делаю не так?