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

Вывод разделов и элементов без учета вложенности
Пример кода для файла .left.menu_ext.php
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
// ID инфоблока
$iblockId = 1;
$menuLinks = [];
// Подключаем модуль инфоблоков
if (CModule::IncludeModule('iblock')) {
// 1. Получаем список разделов инфоблока
$sections = CIBlockSection::GetList(
['LEFT_MARGIN' => 'ASC'], // Сортировка
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'], // Условия фильтрации
false, // Не группируем
['ID', 'NAME', 'SECTION_PAGE_URL'] // Какие поля загружаем
);
while ($section = $sections->GetNext()) {
$menuLinks[] = [
$section['NAME'], // Название раздела
$section['SECTION_PAGE_URL'], // Ссылка на раздел
[], // Дополнительные параметры (например, иконки)
['FROM_IBLOCK' => true, 'IS_PARENT' => true], // Статус (раздел - родительский элемент)
'' // Условие активности
];
}
// 2. Получаем список элементов инфоблока
$elements = CIBlockElement::GetList(
['SORT' => 'ASC'], // Сортировка
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'], // Условия фильтрации
false, // Не группируем
false, // Постраничная навигация
['ID', 'NAME', 'DETAIL_PAGE_URL', 'IBLOCK_SECTION_ID'] // Какие поля загружаем
);
while ($element = $elements->GetNext()) {
$menuLinks[] = [
$element['NAME'], // Название элемента
$element['DETAIL_PAGE_URL'], // Ссылка на элемент
[], // Дополнительные параметры
['FROM_IBLOCK' => true], // Статус
'' // Условие активности
];
}
}
// Возвращаем массив $menuLinks
$aMenuLinks = $menuLinks;
Пояснения к коду
- Подключение модуля: Мы используем
CModule::IncludeModule('iblock')
для работы с инфоблоками. Убедитесь, что модуль "Инфоблоки" установлен. - Секции (разделы): Используется класс
CIBlockSection
для получения списка разделов инфоблока. ПолеSECTION_PAGE_URL
автоматически формируется на основе настроек инфоблока. - Элементы: Используется класс
CIBlockElement
для получения элементов инфоблока. ПолеDETAIL_PAGE_URL
также формируется автоматически. - Форматирование массива: Формируется массив
$menuLinks
в формате, принятом для меню в Битриксе.
Настройки инфоблока
Для корректного формирования ссылок (SECTION_PAGE_URL
и DETAIL_PAGE_URL
) убедитесь, что в настройках инфоблока у вас правильно заданы шаблоны URL:
- URL страницы раздела:
#SITE_DIR#catalog/#SECTION_CODE_PATH#/
- URL страницы элемента:
#SITE_DIR#catalog/#SECTION_CODE_PATH#/#ELEMENT_CODE#/
Что делать, если нужно учитывать вложенность?
Если требуется учитывать вложенность элементов (расположение элементов в разделах), можно добавить соответствующую логику: элементы будут добавляться только к своим родительским разделам.
Пример для вложенной структуры:
$menuLinks[$sectionId][] = [...]; // Привязка элемента к родительскому разделу
Для вывода всех разделов и элементов инфоблока с учётом их вложенности в структуру, используем API CIBlockSection
и CIBlockElement
. Основная идея заключается в том, чтобы сначала получить дерево разделов заданного инфоблока, а затем для каждого раздела получить элементы. Следующий пример кода предназначен для использования в файле .left.menu_ext.php
в Битриксе:
Решение
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
// ID нужного инфоблока
$IBLOCK_ID = 1;
// Подключаем модуль инфоблоков
CModule::IncludeModule('iblock');
// Функция для получения разделов и элементов с их вложенностью
function getSectionsWithElements($iblockId) {
$result = [];
// Получаем разделы инфоблока
$sectionFilter = [
'IBLOCK_ID' => $iblockId,
'ACTIVE' => 'Y'
];
$sectionSelect = ['ID', 'NAME', 'SECTION_PAGE_URL', 'DEPTH_LEVEL'];
$sections = CIBlockSection::GetList(
['LEFT_MARGIN' => 'ASC'], // Сортировка по иерархии разделов
$sectionFilter,
false,
$sectionSelect
);
while ($section = $sections->GetNext()) {
$result[$section['ID']] = [
'NAME' => $section['NAME'],
'URL' => $section['SECTION_PAGE_URL'],
'DEPTH_LEVEL' => $section['DEPTH_LEVEL'],
'ELEMENTS' => []
];
}
// Получаем элементы инфоблока
$elementFilter = [
'IBLOCK_ID' => $iblockId,
'ACTIVE' => 'Y'
];
$elementSelect = ['ID', 'IBLOCK_SECTION_ID', 'NAME', 'DETAIL_PAGE_URL'];
$elements = CIBlockElement::GetList(
['SORT' => 'ASC'], // Сортировка элементов
$elementFilter,
false,
false,
$elementSelect
);
while ($element = $elements->GetNext()) {
if (isset($result[$element['IBLOCK_SECTION_ID']])) {
$result[$element['IBLOCK_SECTION_ID']]['ELEMENTS'][] = [
'NAME' => $element['NAME'],
'URL' => $element['DETAIL_PAGE_URL']
];
}
}
return $result;
}
// Получаем данные о разделах и элементах
$sectionsWithElements = getSectionsWithElements($IBLOCK_ID);
// Генерация массива данных для меню
$aMenuLinksExt = [];
foreach ($sectionsWithElements as $section) {
$aMenuLinksExt[] = [
$section['NAME'],
$section['URL'],
[],
['DEPTH_LEVEL' => $section['DEPTH_LEVEL']],
""
];
foreach ($section['ELEMENTS'] as $element) {
$aMenuLinksExt[] = [
$element['NAME'],
$element['URL'],
[],
['DEPTH_LEVEL' => $section['DEPTH_LEVEL'] + 1],
""
];
}
}
// Добавляем сгенерированные ссылки в основное меню
$aMenuLinks = array_merge($aMenuLinks, $aMenuLinksExt);
?>
Пояснение коду
Получение разделов:
- Используется метод
CIBlockSection::GetList()
, чтобы собрать разделы инфоблока. - Сортировка по
LEFT_MARGIN
позволяет получить разделы в иерархическом порядке. - В результат добавляются
NAME
,URL
и уровень вложенностиDEPTH_LEVEL
.
- Используется метод
Получение элементов:
- Используется метод
CIBlockElement::GetList()
для получения активных элементов инфоблока. - Элементы группируются внутри своих разделов с помощью ID раздела (
IBLOCK_SECTION_ID
).
- Используется метод
Формирование меню:
- Все разделы добавляются в массив
$aMenuLinksExt
с учётом уровня вложенности (DEPTH_LEVEL
). - Элементы добавляются как вложенные пункты (уровень вложенности увеличен на 1).
- Все разделы добавляются в массив
Вывод в меню:
- Итоговый массив
$aMenuLinksExt
объединяется с меню$aMenuLinks
(по умолчанию подключаемое в файлах.menu_ext.php
).
- Итоговый массив
Результат
Когда вы добавите данный код в файл .left.menu_ext.php
, меню будет формироваться динамически на основе структуры разделов и элементов инфоблока. Будут учитываться как разделы, так и вложенные в них элементы.
Если у вас настраивается "Карта сайта", этот подход позволяет автоматически обновлять содержимое при изменении в админке инфоблока (добавление/удаление разделов и элементов).
Теги: Битрикс, sitemap