На практике запрос ciblocksection getlist и метод CIBlockSection::GetList в PHP - один способ получить дерево разделов инфоблока в 1С-Битрикс: Управление сайтом. Сигнатура: GetList(arOrder, arFilter, bIncCnt, arSelect), результат - CIBlockResult. Если GetList пустой при живом дереве в админке, проверьте IBLOCK_ID, GLOBAL_ACTIVE и nested set после миграции. После гайда вы соберете GetList с UF-полями, выберете метод выборки и перейдете на D7 ORM.
CIBlockSection - legacy-класс 1С-Битрикс: Управление сайтом для иерархии разделов инфоблока (nested set LEFT_MARGIN/RIGHT_MARGIN/DEPTH_LEVEL). Метод GetList(arOrder, arFilter, bIncCnt, arSelect) возвращает CIBlockResult; для UF_* обязателен IBLOCK_ID в фильтре; D7-аналог с пользовательскими полями - Section::compileEntityByIblock, не SectionTable. Сегодня: зафиксируйте IBLOCK_ID, добавьте UF_* в select, прогоните чек-лист "пустого дерева" и ReSort после импорта.
Речь про коробочную CMS на вашем сервере, не про облачную CRM того же вендора. Если инфоблок еще не создан, начните с гайда по созданию инфоблока - без IBLOCK_ID дальше не поедем.
Что такое CIBlockSection и когда он нужен
CIBlockSection - PHP-класс для "папок" каталога: иерархия, UF-поля, символьный код. Элементы (товары) - отдельный класс CIBlockElement, привязка через IBLOCK_SECTION_ID. Делайте: CIBlockSection для меню и импорта. Не делайте: не ждите CRUD разделов от bitrix:catalog.section - витрина описана в гайде по catalog.section.
Разберите параметры CIBlockSection::GetList
Минимальный пример ciblocksection getlist для копирования в staging:
CModule::IncludeModule('iblock');
$iblockId = 5;
$res = CIBlockSection::GetList(
['LEFT_MARGIN' => 'ASC'],
[
'IBLOCK_ID' => $iblockId,
'ACTIVE' => 'Y',
'GLOBAL_ACTIVE' => 'Y',
],
true,
['ID', 'NAME', 'CODE', 'SECTION_PAGE_URL', 'UF_*']
);
while ($section = $res->GetNext()) {
// $section['ELEMENT_CNT'], $section['UF_ICON']
}
| Параметр | Что передавать | Типичная ошибка |
|---|---|---|
| arOrder | Сортировка: LEFT_MARGIN ASC для дерева, NAME для алфавита | Сортировка без LEFT_MARGIN - вложенность "прыгает" |
| arFilter | IBLOCK_ID, ACTIVE, GLOBAL_ACTIVE, DEPTH_LEVEL, SECTION_ID, LEFT_BORDER/RIGHT_BORDER | DEPTH_LEVEL=0 из старых сниппетов - корень начинается с 1 |
| bIncCnt | true - счетчик элементов ELEMENT_CNT в каждой секции | false, когда на витрине нужен бейдж "N товаров" |
| arSelect | ID, NAME, CODE, SECTION_PAGE_URL, UF_* | UF_* без IBLOCK_ID в arFilter - поля пустые (форум topic28425) |
| arNavStartParams | nPageSize, iNumPage - постраничная выборка | Пагинация без сортировки LEFT_MARGIN - дерево ломается визуально |
Делайте: держите IBLOCK_ID в фильтре всегда, даже для "простой" выборки. Не делайте: не копируйте сниппеты без проверки DEPTH_LEVEL после переноса инфоблока в другой тип.
Настройте UF_* поля раздела в GetList
UF_* - пользовательские поля раздела (иконка, бейдж). В реальном проекте ядро подтягивает их только при одиночном IBLOCK_ID в arFilter и 'UF_*' в arSelect. Без IBLOCK_ID UF_ICON пустой, хотя в админке иконка задана (форум topic28425).
Делайте: IBLOCK_ID + UF_* в select. Не делайте: не ждите UF от голого SectionTable в D7 - нужен compileEntityByIblock.
Выберите GetList, GetTreeList или фильтр LEFT_MARGIN
| Метод / фильтр | Когда использовать | Нюанс |
|---|---|---|
| CIBlockSection::GetList | Гибкая сортировка, фильтр по DEPTH_LEVEL, bIncCnt, UF_* | Базовый метод; все остальные - вариации |
| CIBlockSection::GetTreeList | Нужно дерево с сортировкой left_margin ASC "из коробки" | Официально - обертка GetList; в Fetch URL разделов могут "ломаться" - берите GetNext |
| SECTION_ID в arFilter | Только прямые дети одного родителя (один уровень) | Не включает внуков - для всей ветки нужен nested set |
| LEFT_BORDER + RIGHT_BORDER | Все потомки якорной секции (поддерево) | Не путайте с LEFT_MARGIN: для поддерева - диапазон, не равенство |
Пример поддерева через nested set (все потомки якорной секции):
$anchor = CIBlockSection::GetByID($sectionId)->Fetch();
$res = CIBlockSection::GetList(
['LEFT_MARGIN' => 'ASC'],
[
'IBLOCK_ID' => $iblockId,
'>LEFT_BORDER' => $anchor['LEFT_MARGIN'],
'<RIGHT_BORDER' => $anchor['RIGHT_MARGIN'],
],
false,
['ID', 'NAME', 'DEPTH_LEVEL']
);
Делайте: GetTreeList + GetNext для меню. Не делайте: SECTION_ID только для прямых детей - для всей ветки нужен LEFT_BORDER/RIGHT_BORDER.
Проверьте, почему GetList пустой при живом дереве в админке
Если catalog.section.list показывает разделы, а GetList - нет, проблема в arFilter или nested set после миграции. Разберем ситуацию из практики: форум topic100223 - после переноса каталога ReSort часто единственный фикс.
- IBLOCK_ID - после переноса инфоблока ID меняется.
- GLOBAL_ACTIVE - уберите на отладку; если родитель выключен, дети "неактивны" при ACTIVE=Y.
- DEPTH_LEVEL - 1 у корня; уберите ключ для всех уровней.
- LEFT_BORDER вместо LEFT_MARGIN для поддерева.
- ReSort после импорта:
CIBlockSection::ReSort($iblockId)(topic100223).
Делайте: bIncCnt=true для счетчика товаров. Не делайте: не правьте LEFT_MARGIN в базе вручную.
Создайте разделы и постройте крошки GetNavChain
Add с IBLOCK_SECTION_ID родителя, CODE для ЧПУ, UF_* в полях. При массовом импорте - bResort=false, затем ReSort. Элементы ветки - через CIBlockElement::GetList (B60), Update элемента - B40.
$chain = CIBlockSection::GetNavChain($iblockId, $sectionId, ['ID','NAME','SECTION_PAGE_URL'], true);
while ($crumb = $chain->GetNext()) { /* крошки */ }
Делайте: LAST_ERROR после Add, SECTION_PAGE_URL из GetList. Не делайте: Delete в cron без проверки SECTION_ID.
Workflow: GetList → GetNavChain → CIBlockElement::GetList → Add/Update → ReSort
Сравните D7: SectionTable и Section::compileEntityByIblock
| Подход D7 | UF_* поля | Когда достаточно |
|---|---|---|
| Bitrix\Iblock\SectionTable | Нет - только стандартные поля таблицы b_iblock_section | Список ID/NAME/CODE без кастомных полей раздела |
| Section::compileEntityByIblock($iblockId) | Да - UF_HEAD, UF_ICON и другие UF_* в select | Меню с иконками, бейджи разделов, любой UF в ORM |
use Bitrix\Main\Loader;
use Bitrix\Iblock\Model\Section;
Loader::includeModule('iblock');
$entity = Section::compileEntityByIblock($iblockId);
$rows = $entity::getList([
'select' => ['ID', 'NAME', 'CODE', 'DEPTH_LEVEL', 'UF_*'],
'filter' => ['=IBLOCK_ID' => $iblockId, '=ACTIVE' => 'Y'],
'order' => ['LEFT_MARGIN' => 'ASC'],
])->fetchAll();
Делайте: compileEntityByIblock для UF_*. Не делайте: SectionTable, если нужны иконки или бейджи раздела в ORM - официальная документация прямо указывает на compileEntityByIblock для пользовательских полей разделов инфоблока.
Проверьте staging и окружение PHP 8.2+
С 01.02.2026 PHP ниже 8.2 в обновлениях 1С-Битрикс - зона ограниченной поддержки. Прогоните GetList на staging с версией PHP как на проде.
- GetList возвращает разделы на каждом DEPTH_LEVEL.
- UF_* приходят с IBLOCK_ID в фильтре.
- GetNavChain и ReSort после импорта без ошибок.
Нужна помощь с каталогом - обсудим задачу и прогоним чек-лист на staging.
Автор: Максим Мольков, разработчик 1С-Битрикс.
Источники: CIBlockSection::GetList, GetTreeList, D7 API инфоблоков.
Частые вопросы
Почему CIBlockSection::GetList пустой, а в админке разделы есть?
Проверьте IBLOCK_ID в arFilter, уберите GLOBAL_ACTIVE на время отладки, убедитесь что DEPTH_LEVEL не отсекает уровень. После миграции или массового импорта вызовите CIBlockSection::ReSort($iblockId) - часто это единственный шаг.
ciblocksection getlist пример - минимальный код?
IncludeModule('iblock'), arFilter с IBLOCK_ID и ACTIVE=Y, arSelect с UF_*, цикл GetNext. Сигнатура: CIBlockSection::GetList(arOrder, arFilter, bIncCnt, arSelect). Полный сниппет - в секции параметров выше.
GetList или GetTreeList - что выбрать?
GetTreeList - обертка GetList с сортировкой left_margin ASC. Для гибкого фильтра берите GetList. В GetTreeList для корректных SECTION_PAGE_URL используйте GetNext, не Fetch.
Как получить UF_* поля раздела в выборке?
В legacy: IBLOCK_ID (одиночное значение) в arFilter и UF_* в arSelect. В D7: Section::compileEntityByIblock($iblockId)::getList с UF_* в select. SectionTable UF не отдает.
Разделы инфоблока d7 битрикс - какой класс?
Для стандартных полей - Bitrix\Iblock\SectionTable::getList. Для UF_HEAD и других UF_* - Section::compileEntityByIblock($iblockId). Это официальный путь из docs.1c-bitrix.ru, не голый SectionTable.
Как вывести элементы конкретного раздела?
В CIBlockElement::GetList укажите SECTION_ID или INCLUDE_SUBSECTIONS=Y для всей ветки. Для готовой витрины - bitrix:catalog.section. Для своего PHP - гайд по GetList элементов на сайте.
Зачем LEFT_MARGIN и DEPTH_LEVEL?
LEFT_MARGIN и RIGHT_MARGIN - nested set: по паре чисел быстро выбирают всех потомков ветки. DEPTH_LEVEL - глубина (1 у корня). Поля пересчитывает ядро при Add и ReSort, вручную не трогайте.