Главная » API Битрикс » CIBlockElement » GetElementGroups — разделы элемента в Битрикс

GetElementGroups — разделы элемента в Битрикс

Схема множественной привязки элемента к разделам в Битрикс: основной раздел и дополнительные категории

GetElementGroups возвращает список всех разделов, к которым привязан элемент инфоблока, включая случаи множественной привязки — когда один товар относится сразу к нескольким категориям. Разберём метод и типичный сценарий его использования.

Базовый вызов

<?php

$sections = CIBlockElement::GetElementGroups($elementId, true);

foreach ($sections as $section) {
    echo $section['ID'] . ' — ' . $section['NAME'] . PHP_EOL;
}

Второй параметр, true, указывает получать только активные разделы. При false в результат попадут и деактивированные — это редко нужно на публичной части, но может пригодиться при административных задачах вроде аудита структуры.

Основной раздел среди нескольких

Если элемент привязан к нескольким разделам, один из них считается основным — именно он обычно используется для построения хлебных крошек и канонического адреса страницы. Определить его можно по полю IBLOCK_SECTION_ID самого элемента:

<?php

$element = CIBlockElement::GetByID($elementId)->GetNext();
$mainSectionId = $element['IBLOCK_SECTION_ID'];

$allSections = CIBlockElement::GetElementGroups($elementId, true);

Разница между IBLOCK_SECTION_ID и полным списком из GetElementGroups — источник частой путаницы: первое поле хранит один основной раздел, второе — все разделы, включая дополнительные привязки.

Нужна помощь с Битрикс?





    Практическое применение: перекрёстные категории

    Типичный сценарий — товар относится и к основной категории, и к разделу «Акции» или «Новинки». Вывод в этих разделах формируется через дополнительную привязку, а не дублированием элемента:

    <?php
    
    $sections = CIBlockElement::GetElementGroups($elementId, true);
    
    $isInPromo = false;
    
    foreach ($sections as $section) {
        if ($section['CODE'] === 'akcii') {
            $isInPromo = true;
            break;
        }
    }

    Ограничение: работает только при включённой множественной привязке

    Множественная привязка элементов к разделам должна быть явно включена в настройках инфоблока. Без этого у элемента всегда есть только один раздел — основной, и метод GetElementGroups вернёт массив из единственного значения, совпадающего с IBLOCK_SECTION_ID.

    Производительность

    Вызов метода для каждого элемента в списке — отдельный запрос к базе. На странице со списком из десятков товаров это быстро превращается в проблему N+1 запросов. Если разделы нужны сразу для всей выборки, эффективнее получить их одним запросом через CIBlockElement::GetList с указанием IBLOCK_SECTION_ID в выборке полей, либо через связь ORM, если код написан на D7.

    Фильтрация выборки по одному из перекрёстных разделов

    Отдельная от GetElementGroups задача — не получить разделы конкретного элемента, а наоборот, отобрать все элементы, привязанные к определённому разделу через множественную привязку, включая те, для кого этот раздел не основной. Для такой выборки используется фильтр GetList по служебному полю SECTION_ID вместо IBLOCK_SECTION_ID:

    <?php
    
    $result = CIBlockElement::GetList(
        [],
        [
            'IBLOCK_ID' => $iblockId,
            'SECTION_ID' => $promoSectionId,
            'INCLUDE_SUBSECTIONS' => 'Y',
        ],
        false, false, ['ID', 'NAME']
    );

    SECTION_ID в фильтре учитывает все привязки элемента, включая дополнительные, тогда как обычный фильтр по IBLOCK_SECTION_ID отбирает только по основному разделу — разница между этими двумя полями в фильтре повторяет ту же логику, что и разница между самим значением поля элемента и результатом GetElementGroups.

    Хранение привязки в базе данных

    Технически множественная привязка элемента к разделам хранится в отдельной служебной таблице b_iblock_section_element — именно её и опрашивает GetElementGroups под капотом. Основной раздел, хранящийся в поле IBLOCK_SECTION_ID самого элемента, для консистентности данных также должен иметь соответствующую запись в этой таблице — расхождение между ними обычно говорит о повреждении данных, возникшем при прямом изменении структуры в обход API.

    Частые ошибки

    • Вызов метода РІ цикле РїРѕ элементам СЃРїРёСЃРєР°. Создаёт лишний запрос РЅР° каждый элемент вместо РѕРґРЅРѕР№ общей выборки.
    • Путаница между основным разделом Рё полным СЃРїРёСЃРєРѕРј. IBLOCK_SECTION_ID — РѕРґРЅРѕ значение, GetElementGroups — массив всех РїСЂРёРІСЏР·РѕРє.
    • Ожидание нескольких разделов РїСЂРё выключенной множественной РїСЂРёРІСЏР·РєРµ. Настройка должна быть включена РІ свойствах инфоблока заранее.

    Итог

    GetElementGroups возвращает полный список разделов элемента при включённой множественной привязке — полезно для перекрёстных категорий вроде акций и новинок. Для отдельного элемента на детальной странице метод удобен, но для списков стоит избегать вызова в цикле и получать данные о разделах одним общим запросом.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний