Используем связку news +catalog.section.list отсюда
Дорабатываем код для catalog.section.list т.к. он не выводит разделы на последнем уровне.
result_modifier.php
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
die();
}
/**
* @var array $arParams
* @var array $arResult
*/
use \Bitrix\Iblock\SectionTable;
if ($arResult["SECTIONS_COUNT"] === 0) {
$parent = SectionTable::getList([
'select' => ['IBLOCK_SECTION_ID'],
'filter' => ['ID' => $arParams['SECTION_ID']],
'cache' => ["ttl" => 3600],
])->fetch();
if ($parent) {
$filter = [
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'ACTIVE' => 'Y',
'SECTION_ID' => $parent['IBLOCK_SECTION_ID'],
];
$sections = CIBlockSection::GetList(['SORT' => 'ASC'], $filter, true, ['*']);
while ($section = $sections->GetNext()) {
$arResult['SECTIONS'][] = $section;
}
$arResult["SECTIONS_COUNT"] = count($arResult['SECTIONS']);
}
}
foreach ($arResult['SECTIONS'] as $k => $section) {
if ($section['ELEMENT_CNT'] === '0') {
unset($arResult['SECTIONS'][$k]);
}
}
if ($arResult['SECTIONS'][0]['IBLOCK_SECTION_ID']) {
$filter = [
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'ACTIVE' => 'Y',
'ID' => $arResult['SECTIONS'][0]['IBLOCK_SECTION_ID'],
];
$sections = CIBlockSection::GetList(['SORT' => 'ASC'], $filter, true, ['*']);
while ($section = $sections->GetNext()) {
$arResult['SECTIONS'][] = [
'NAME' => 'Назад',
'SECTION_PAGE_URL' => $section['SECTION_PAGE_URL'],
];
}
} elseif (!$arResult['SECTIONS'][0]['RELATIVE_DEPTH_LEVEL']) {
$arResult['SECTIONS'][] = [
'NAME' => 'Назад',
'SECTION_PAGE_URL' => '/documents/',
];
}
template.php
<? use Bitrix\Main\Application;
use Bitrix\Main\Web\Uri;
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
die();
}
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);
$strSectionEdit = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_EDIT");
$strSectionDelete = CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "SECTION_DELETE");
$arSectionDeleteParams = ["CONFIRM" => GetMessage('CT_BCSL_ELEMENT_DELETE_CONFIRM')];
$APPLICATION->SetTitle($arResult['SECTION']['NAME'] ?: $APPLICATION->GetTitle());
if (0 < $arResult["SECTIONS_COUNT"]) {
?>
<div class="aside_menu d-none d-xl-block">
<ul class="menu_ul _clean">
<?
foreach ($arResult['SECTIONS'] as &$arSection) {
if ($arSection['ELEMENT_CNT'] === '0') {
continue;
} ?>
<li class="menu_li">
<a class="menu_link<?=$APPLICATION->GetCurPage(false) === $arSection['SECTION_PAGE_URL'] ? ' active'
: ''?>"
href="<? echo $arSection['SECTION_PAGE_URL']; ?>"><? echo $arSection['NAME']; ?></a>
</li>
<? }
unset($arSection);
?>
</ul>
</div>
<? } ?>