ГлавнаяБлогРазделы инфоблока в 1С-Битрикс: D7 и без ручного разбора массива

Разделы инфоблока в 1С-Битрикс: D7 и без ручного разбора массива

Рамиль Юналиев
Рамиль Юналиев
E-Commerce Lead
20 июля 2026 г.
3 мин чтения

Старый пост «Разделы инфоблока в виде массива» набрал много комментариев — тема живая. Но код там 2014 года: CIBlockSection::GetList(), венгерская нотация, и во втором способе — unset элемента прямо во время перебора массива с последующим usort. Работает, но такой код сложно сопровождать и менять.

Здесь — тот же результат (дерево разделов, плоский список с уровнем вложенности, breadcrumbs), но через D7 и без ручной пересборки массива.

Получаем разделы через D7

Для простого чтения разделов удобно использовать \Bitrix\Iblock\SectionTable — если нужны только сами разделы, без счётчиков элементов и параметров навигации, которые умеет CIBlockSection::GetList():

use Bitrix\Iblock\SectionTable;
use Bitrix\Main\Loader;
 
Loader::includeModule('iblock');
 
$sections = SectionTable::getList([
    'filter' => ['IBLOCK_ID' => 8],
    'select' => ['ID', 'IBLOCK_SECTION_ID', 'NAME', 'SORT'],
])->fetchAll();

Важная оговорка: SectionTable — класс для чтения. Методы add, update и delete в нём заблокированы (как и в соседнем ElementTable) — создавать и менять разделы всё ещё нужно через старый API (CIBlockSection::Add()/Update()/Delete()). D7 здесь только читает.

Собираем дерево без ручного разбора

$sections — плоский список, IBLOCK_SECTION_ID у каждого элемента ссылается на родителя. Раньше отсюда собирали дерево через unset внутри foreach — здесь то же самое делает одна функция из отдельной библиотеки, yunaweb/bitrix-section-tree:

composer require yunaweb/bitrix-section-tree
use Yunaweb\SectionTree\SectionTree;
 
$tree = SectionTree::toTree($sections);
// $tree[0]['NAME'] — раздел верхнего уровня
// $tree[0]['CHILDREN'] — его дочерние разделы

Библиотека не завязана на Bitrix — принимает обычный массив, где у каждого элемента есть свой id и ссылка на id родителя, и в этом же виде возвращает результат. Битые ссылки на родителя (раздел отфильтрован, а его дочерний остался) — не ошибка Bitrix, это вопрос дизайна самой библиотеки: она решает не ронять сборку, а делает такой раздел корнем. Дубли ID и циклическая ссылка на родителя — это ошибка данных, на неё библиотека бросает исключение, чтобы не собрать и вернуть заведомо некорректное дерево.

Плоский список с уровнем вложенности

В старом посте это был «Способ 1» — плоский массив с DEPTH_LEVEL для <select>. Теперь считать вложенность вручную не нужно — можно развернуть уже собранное дерево обратно в список, глубина посчитается сама. DEPTH здесь — не поле SectionTable, а то, что вычисляет сама библиотека при развороте дерева:

$flat = SectionTree::toFlat($tree);
 
foreach ($flat as $section) {
    $indent = str_repeat('— ', $section['DEPTH']);
    echo '<option value="' . htmlspecialchars((string) $section['ID']) . '">'
        . $indent . htmlspecialchars($section['NAME']) . "</option>\n";
}

Цепочка разделов до корня

Раздел иногда нужно показать вместе с путём от корня — например, для breadcrumbs на странице каталога:

$chain = SectionTree::breadcrumbs($sections, 42);
// array_column($chain, 'NAME') — имена разделов от корня до раздела 42 включительно

Рекурсивное меню

Второй способ из старого поста — вывод дерева вложенными <ul>. Рекурсия по CHILDREN не изменилась, просто дерево теперь собрано без побочных эффектов:

function renderMenu(array $items): string
{
    $html = '<ul>';
    foreach ($items as $item) {
        $html .= '<li>' . htmlspecialchars($item['NAME']);
        if ($item['CHILDREN'] !== []) {
            $html .= renderMenu($item['CHILDREN']);
        }
        $html .= '</li>';
    }
 
    return $html . '</ul>';
}
 
echo renderMenu($tree);

Итог

Вместо того чтобы в каждом проекте заново писать сборку дерева, расчёт уровня вложенности и цепочки родителей — три готовые функции: toTree(), toFlat(), breadcrumbs(). Исходники и тесты — в репозитории yunaweb/bitrix-section-tree.