В 1С-Битрикс довольно часто возникает задача определения, к каким разделам принадлежит элемент инфоблока. Зная разные методы и функции, можно быстро получить нужную информацию о разделе по ID элемента, по символьному коду, а также извлечь корневой раздел или список всех разделов элемента.

В этой статье мы рассмотрим способы решения задачи как на «старом ядре» (через классы CIBlockElement
и CIBlockSection
), так и более современным методом на D7-ядре (через ORM-классы Bitrix\Iblock\ElementTable
, Bitrix\Iblock\SectionTable
и т. д.).
1. Как получить раздел инфоблока по ID элемента
Старый метод (через CIBlockElement
и CIBlockSection
)
Самый прямолинейный способ — сначала получить данные самого элемента, узнать, какой у него основной раздел (IBLOCK_SECTION_ID
), и затем по этому идентификатору запросить данные раздела.
Шаги:
- Использовать класс
CIBlockElement
и его методGetByID
, чтобы получить информацию об элементе. - Из результата взять поле
IBLOCK_SECTION_ID
— это ID привязанного раздела (если элемент принадлежит только одному основному разделу). - По
IBLOCK_SECTION_ID
вызватьCIBlockSection::GetByID
и получить подробные данные нужного раздела.
Пример кода:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$ELEMENT_ID = 123;
// 1. Получаем элемент
$elementRes = CIBlockElement::GetByID($ELEMENT_ID);
if ($elementData = $elementRes->GetNext()) {
$sectionId = $elementData["IBLOCK_SECTION_ID"];
if ($sectionId) {
// 2. Получаем раздел
$sectionRes = CIBlockSection::GetByID($sectionId);
if ($sectionData = $sectionRes->GetNext()) {
echo "ID раздела: " . $sectionData["ID"] . "<br>";
echo "Название раздела: " . $sectionData["NAME"] . "<br>";
echo "Код раздела: " . $sectionData["CODE"] . "<br>";
} else {
echo "Раздел не найден.";
}
} else {
echo "У элемента нет основного раздела.";
}
} else {
echo "Элемент с таким ID не найден.";
}
?>
Новый метод (D7, через ElementTable
и SectionTable
)
В рамках D7 (ORM) мы используем классы из пространства имён Bitrix\Iblock
.
- Подключаем модуль
iblock
с помощьюLoader::includeModule("iblock");
. - Обращаемся к
Bitrix\Iblock\ElementTable
для получения данных об элементе. - Извлекаем
IBLOCK_SECTION_ID
. - По полученному
IBLOCK_SECTION_ID
делаем запрос кBitrix\Iblock\SectionTable
.
Пример кода:
<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Iblock\SectionTable;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Loader::includeModule("iblock");
$ELEMENT_ID = 123;
// 1. Получаем элемент через ORM
$element = ElementTable::getList([
"filter" => ["=ID" => $ELEMENT_ID],
"select" => ["ID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "CODE", "NAME"]
])->fetch();
if ($element) {
$sectionId = $element['IBLOCK_SECTION_ID'];
if ($sectionId) {
// 2. Получаем раздел
$section = SectionTable::getList([
"filter" => ["=ID" => $sectionId],
"select" => ["ID", "NAME", "CODE", "IBLOCK_ID", "IBLOCK_SECTION_ID"]
])->fetch();
if ($section) {
echo "ID раздела: " . $section["ID"] . "<br>";
echo "Название раздела: " . $section["NAME"] . "<br>";
echo "Код раздела: " . $section["CODE"] . "<br>";
} else {
echo "Раздел не найден.";
}
} else {
echo "У элемента нет основного раздела.";
}
} else {
echo "Элемент с таким ID не найден.";
}
?>
2. Как получить раздел инфоблока по коду (символьному коду) элемента
Здесь принцип тот же, только на первом этапе мы используем фильтр по CODE
.
Старый метод (через CIBlockElement
и CIBlockSection
)
Шаги:
- Использовать
CIBlockElement::GetList
с фильтром поCODE
(и, при необходимости, поIBLOCK_ID
). - Получить поле
IBLOCK_SECTION_ID
. - По этому ID вызвать
CIBlockSection::GetByID
.
Пример кода:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$ELEMENT_CODE = "my-element-code";
$IBLOCK_ID = 5;
$elementRes = CIBlockElement::GetList(
[],
[
"IBLOCK_ID" => $IBLOCK_ID,
"CODE" => $ELEMENT_CODE
],
false,
false,
["ID", "NAME", "IBLOCK_SECTION_ID"]
);
if ($elementData = $elementRes->GetNext()) {
$sectionId = $elementData["IBLOCK_SECTION_ID"];
if ($sectionId) {
$sectionRes = CIBlockSection::GetByID($sectionId);
if ($sectionData = $sectionRes->GetNext()) {
echo "ID раздела: " . $sectionData["ID"] . "<br>";
echo "Название раздела: " . $sectionData["NAME"] . "<br>";
echo "Код раздела: " . $sectionData["CODE"] . "<br>";
} else {
echo "Раздел не найден.";
}
} else {
echo "У элемента нет основного раздела.";
}
} else {
echo "Элемент с таким кодом не найден.";
}
?>
Новый метод (D7, через ElementTable
и SectionTable
)
- Получаем элемент по его символьному коду.
- Извлекаем
IBLOCK_SECTION_ID
. - Запрашиваем информацию о разделе.
Пример кода:
<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Iblock\SectionTable;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Loader::includeModule("iblock");
$ELEMENT_CODE = "my-element-code";
$IBLOCK_ID = 5;
// Находим элемент по коду
$element = ElementTable::getList([
"filter" => [
"=IBLOCK_ID" => $IBLOCK_ID,
"=CODE" => $ELEMENT_CODE
],
"select" => ["ID", "IBLOCK_SECTION_ID"]
])->fetch();
if ($element) {
$sectionId = $element['IBLOCK_SECTION_ID'];
if ($sectionId) {
$section = SectionTable::getList([
"filter" => ["=ID" => $sectionId],
"select" => ["ID", "NAME", "CODE"]
])->fetch();
if ($section) {
echo "ID раздела: " . $section["ID"] . "<br>";
echo "Название раздела: " . $section["NAME"] . "<br>";
echo "Код раздела: " . $section["CODE"] . "<br>";
} else {
echo "Раздел не найден.";
}
} else {
echo "У элемента нет основного раздела.";
}
} else {
echo "Элемент с таким кодом не найден.";
}
?>
3. Как получить все разделы элемента инфоблока
В 1С-Битрикс элемент может принадлежать сразу нескольким разделам (при включённой множественной привязке). Чтобы получить все разделы, используем:
Старый метод (через CIBlockElement::GetElementGroups
)
Пример кода:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$ELEMENT_ID = 123;
// Получаем все разделы элемента
$sectionRes = CIBlockElement::GetElementGroups($ELEMENT_ID, true, ["ID", "NAME", "CODE", "IBLOCK_SECTION_ID", "DEPTH_LEVEL"]);
while ($sectionData = $sectionRes->Fetch()) {
echo "ID раздела: " . $sectionData["ID"] . "<br>";
echo "Название раздела: " . $sectionData["NAME"] . "<br>";
echo "Код раздела: " . $sectionData["CODE"] . "<br>";
echo "Родительский раздел: " . $sectionData["IBLOCK_SECTION_ID"] . "<br>";
echo "Уровень вложенности: " . $sectionData["DEPTH_LEVEL"] . "<br>";
echo "<hr>";
}
?>
Новый метод (D7, через SectionElementTable
и SectionTable
)
Чтобы «по-новому» получить все разделы, к которым привязан элемент, можно обратиться к таблице b_iblock_section_element
через ORM-класс Bitrix\Iblock\SectionElementTable
.
- Находим записи, где
IBLOCK_ELEMENT_ID
равно нужному элементу. - Извлекаем
IBLOCK_SECTION_ID
каждой записи. - Для каждого
IBLOCK_SECTION_ID
делаем запрос вSectionTable::getList()
(или используемjoin
).
Пример кода:
<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\SectionElementTable;
use Bitrix\Iblock\SectionTable;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Loader::includeModule("iblock");
$ELEMENT_ID = 123;
$sections = SectionElementTable::getList([
'filter' => [
'=IBLOCK_ELEMENT_ID' => $ELEMENT_ID
],
'select' => ['IBLOCK_SECTION_ID']
]);
while ($sectionItem = $sections->fetch()) {
$sectionId = $sectionItem['IBLOCK_SECTION_ID'];
// Теперь берём данные раздела
$sectionData = SectionTable::getList([
'filter' => ['=ID' => $sectionId],
'select' => ['ID', 'NAME', 'CODE', 'IBLOCK_SECTION_ID', 'DEPTH_LEVEL']
])->fetch();
if ($sectionData) {
echo "ID раздела: " . $sectionData["ID"] . "<br>";
echo "Название раздела: " . $sectionData["NAME"] . "<br>";
echo "Код раздела: " . $sectionData["CODE"] . "<br>";
echo "Родительский раздел: " . $sectionData["IBLOCK_SECTION_ID"] . "<br>";
echo "Уровень вложенности: " . $sectionData["DEPTH_LEVEL"] . "<br>";
echo "<hr>";
}
}
?>
4. Как получить корневой раздел элемента инфоблока
Корневым разделом обычно называют верхний «предок» в иерархии разделов (уровень DEPTH_LEVEL = 1
или раздел, у которого IBLOCK_SECTION_ID = 0
). Если элемент привязан к нескольким веткам — значит может быть несколько корневых разделов.
Старый метод (цепочечная итерация)
- Получить (все) раздел(ы), к которым привязан элемент.
- Для каждого раздела «подниматься» по цепочке родительских ID через
CIBlockSection::GetByID
. - Когда у раздела
IBLOCK_SECTION_ID = 0
, он является корневым.
Пример кода:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$ELEMENT_ID = 123;
// Шаг 1. Найдём все разделы элемента
$sectionRes = CIBlockElement::GetElementGroups($ELEMENT_ID, true, ["ID", "IBLOCK_SECTION_ID", "NAME"]);
while ($sectionData = $sectionRes->Fetch()) {
$currentSectionId = $sectionData["ID"];
$rootSectionId = $currentSectionId;
$rootSectionName = $sectionData["NAME"];
// Шаг 2. Поднимаемся по цепочке родительских разделов
while (true) {
$parentRes = CIBlockSection::GetByID($currentSectionId);
if ($parentData = $parentRes->GetNext()) {
// Проверяем, есть ли родитель
if ($parentData["IBLOCK_SECTION_ID"] > 0) {
$currentSectionId = $parentData["IBLOCK_SECTION_ID"];
} else {
// Мы дошли до корня
$rootSectionId = $parentData["ID"];
$rootSectionName = $parentData["NAME"];
break;
}
} else {
// Раздел не найден — прерываем
break;
}
}
echo "Элемент принадлежит корневому разделу ID = " . $rootSectionId
. ", название = " . $rootSectionName . "<br>";
}
?>
Новый метод (D7, через SectionTable
)
Логика аналогична: получаем ID всех разделов, дальше движемся по родителям. Только вместо CIBlockSection::GetByID
используем SectionTable::getList
.
- Сначала находите все
IBLOCK_SECTION_ID
, к которым привязан элемент (черезSectionElementTable
). - Для каждого найденного раздела делаете цикл: пока
IBLOCK_SECTION_ID != 0
, идём вверх. - Как только находим раздел, у которого
IBLOCK_SECTION_ID = 0
, — это и есть корневой.
Упрощённый пример (без учёта множественных разделов, показываем на одном основном разделе элемента):
<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Iblock\SectionTable;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Loader::includeModule("iblock");
$ELEMENT_ID = 123;
// Получим основной раздел элемента (если он один)
$element = ElementTable::getList([
'filter' => ['=ID' => $ELEMENT_ID],
'select' => ['IBLOCK_SECTION_ID']
])->fetch();
if ($element && $element['IBLOCK_SECTION_ID']) {
$currentSectionId = $element['IBLOCK_SECTION_ID'];
$rootSectionId = null;
$rootSectionName = null;
while ($currentSectionId) {
$section = SectionTable::getList([
'filter' => ['=ID' => $currentSectionId],
'select' => ['ID', 'NAME', 'IBLOCK_SECTION_ID']
])->fetch();
if ($section) {
if ($section['IBLOCK_SECTION_ID'] > 0) {
// поднимаемся выше
$currentSectionId = $section['IBLOCK_SECTION_ID'];
} else {
// корневой раздел
$rootSectionId = $section['ID'];
$rootSectionName = $section['NAME'];
break;
}
} else {
break;
}
}
if ($rootSectionId) {
echo "Корневой раздел ID: " . $rootSectionId . ", Название: " . $rootSectionName;
} else {
echo "Не удалось определить корневой раздел.";
}
} else {
echo "Элемент не найден или у него нет основного раздела.";
}
?>
Если элемент может быть в нескольких разделах, аналогично перебираем все и ищем корневые для каждого.
Заключение
Работа с разделами в 1С-Битрикс — одна из базовых задач при создании каталогов, новостных порталов, блогов, интернет-магазинов и других проектов на инфоблоках.
- Старое ядро: Используем классы
CIBlockElement
иCIBlockSection
. - D7 (ORM): Применяем
ElementTable
,SectionTable
и в случае множественной привязки —SectionElementTable
.
Основные приёмы:
- Получение основного раздела: достаточно посмотреть поле
IBLOCK_SECTION_ID
у элемента. - Получение всех разделов: использовать
CIBlockElement::GetElementGroups
(старое ядро) илиSectionElementTable
(новое ядро). - Корневой раздел: «подниматься» по цепочке через
IBLOCK_SECTION_ID
, пока не дойдёте до раздела, у которогоIBLOCK_SECTION_ID = 0
.
Правильное понимание этих механизмов позволит вам эффективно управлять контентом, навигацией и структурой вашего сайта на 1С-Битрикс. Если у вас остались вопросы, смело задавайте их в комментариях или обращайтесь к официальной документации по инфоблокам — там вы найдёте дополнительные подробности и нюансы.