Как работать с разделами инфоблока через CIBlockSection::GetList?

Как работать с разделами инфоблока через CIBlockSection::GetList?

На практике запрос 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, CIBlockElement и catalog.section: когда какой класс использовать в Битрикс

CIBlockSection - PHP-класс для "папок" каталога: иерархия, UF-поля, символьный код. Элементы (товары) - отдельный класс CIBlockElement, привязка через IBLOCK_SECTION_ID. Делайте: CIBlockSection для меню и импорта. Не делайте: не ждите CRUD разделов от bitrix:catalog.section - витрина описана в гайде по catalog.section.

Разберите параметры CIBlockSection::GetList

Инфографика параметров CIBlockSection::GetList: arOrder, arFilter, bIncCnt и arSelect

Минимальный пример 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-полей раздела в CIBlockSection::GetList с обязательным IBLOCK_ID

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 часто единственный фикс.

  1. IBLOCK_ID - после переноса инфоблока ID меняется.
  2. GLOBAL_ACTIVE - уберите на отладку; если родитель выключен, дети "неактивны" при ACTIVE=Y.
  3. DEPTH_LEVEL - 1 у корня; уберите ключ для всех уровней.
  4. LEFT_BORDER вместо LEFT_MARGIN для поддерева.
  5. 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 как на проде.

  1. GetList возвращает разделы на каждом DEPTH_LEVEL.
  2. UF_* приходят с IBLOCK_ID в фильтре.
  3. 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, вручную не трогайте.

Читайте также

Интеграции с 1С и API
1073 6 мин.

Как настроить регистрацию и личный кабинет покупателя на 1С-Битрикс?

Пошаговая настройка регистрации на сайте битрикс: Главный модуль, main.register, system.auth.form и sale.personal.section с историей заказов и 152-ФЗ.
Интеграции с 1С и API
941 6 мин.

Как настроить скидки и промокоды на 1С-Битрикс: правила корзины и купоны

Пошаговый гайд по скидкам в CMS-магазине: скидка на товар, правило корзины от суммы, купоны с лимитом, приоритеты без конфликтов и тестовый заказ. Не Bitrix24.
Интеграции с 1С и API
757 15 мин.

Что такое компонент в Битриксе и как он работает

Каждый разработчик, впервые столкнувшийся с Битриксом, проходит через своеобразный обряд посвящения. Вначале кажется, что это просто CMS, где можно поправить HTML в визуальном редакторе или дописать пару строк CSS. Но однажды наступает момент, когда нужно изменить логику вывода новостей, отфильтровать товары по хитрому свойству или добавить на страницу нечто совершенно новое. И тут он впервые слышит это слово — «компонент». Для многих этот момент становится стеной. Система, казавшаяся понятной, вдруг превращается в черный ящик, полный непонятных файлов и странных переменных. Но стоит лишь раз заглянуть под капот, как эта стена рассыпается, превращаясь в набор удивительно логичных и мощных строительных блоков. Понимание компонентов — это тот самый щелчок, после которого разработка на Битрикс из мучения превращается в творчество.

Эта статья — ваш проводник в мир компонентов «1С-Битрикс». Мы не будем сыпать сухими терминами из документации. Вместо этого мы совершим путешествие: от философии, заложенной в эту архитектуру, до мельчайших деталей её работы. Мы разберем компонент на атомы — его файлы, логику, шаблон, параметры — и соберем обратно, чтобы вы не просто знали, что это, но и глубоко понимали, почему это работает именно так. Это знание — ключ к эффективной и профессиональной разработке на Битрикс.

Интеграции с 1С и API
714 2 мин.

Установка Composer в 1С-Битрикс

Установка Composer в проекте на 1С-Битрикс требует учета особенностей платформы, чтобы обеспечить корректную работу и интеграцию с системой.