В данной статье мы рассмотрим различные способы вывода разделов из новостей в 1С-Битрикс. Вы узнаете, как использовать штатные компоненты, API-методы и комбинировать их для достижения наилучших результатов. Мы также поделимся примерами кода и полезными советами по SEO и UX, которые помогут сделать ваш сайт более удобным для посетителей и дружелюбным для поисковых систем.

Зачем выводить разделы отдельно?
- Удобство посетителей. Короткий список рубрик помогает быстрее ориентироваться в контенте.
- SEO-иерархия. Для каждой рубрики можно задать собственные мета-теги и ЧПУ-адреса, повышая релевантность.
- Снижение нагрузки. Запрашивать только разделы дешевле, чем получать все элементы инфоблока.
1. Штатные компоненты
1.1 bitrix:catalog.section.list
— «чистый» список разделов
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list",
"sections_tiles", // ваш шаблон
[
"IBLOCK_TYPE" => "news",
"IBLOCK_ID" => 12,
"SECTION_URL" => "/news/#SECTION_CODE_PATH#/",
"COUNT_ELEMENTS" => "Y", // выводим количество новостей
"TOP_DEPTH" => 2,
"CACHE_TYPE" => "A",
"CACHE_TIME" => 3600000
]
);?>
Компонент отдаёт массив $arResult['SECTIONS']
; счётчик ELEMENT_CNT
появится, если включён COUNT_ELEMENTS
.
1.2 Комплексный bitrix:news
с ЧПУ
"SEF_MODE" => "Y",
"SEF_FOLDER" => "/news/",
"SEF_URL_TEMPLATES" => [
"news" => "", // /news/
"section" => "#SECTION_CODE#/", // /news/sport/
"detail" => "#SECTION_CODE#/#ELEMENT_CODE#/"
],
В шаблоне news.php
выводите catalog.section.list
. В section.php
подключайте news.list
, передавая ему параметр PARENT_SECTION
из переменных ЧПУ.
2. Получение разделов через API
2.1 Классическое API: CIBlockSection::GetList
$arSections = [];
$rs = CIBlockSection::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => 12, 'ACTIVE' => 'Y'],
true, // bIncCnt = true — ELEMENT_CNT
['ID', 'NAME', 'SECTION_PAGE_URL', 'PICTURE', 'ELEMENT_CNT']
);
while ($sec = $rs->GetNext())
$arSections[] = $sec;
Поле SECTION_PAGE_URL
формируется автоматически, URL полностью корректен.
2.2 D7-ORM: Bitrix\Iblock\SectionTable
В ORM-сущности готового поля SECTION_PAGE_URL
нет, поэтому URL собирается вручную:
use Bitrix\Iblock\SectionTable;
// 1. Получаем разделы
$sections = SectionTable::getList([
'select' => ['ID', 'NAME', 'IBLOCK_ID', 'CODE', 'PICTURE'],
'filter' => ['=ID' => $sectionIDs, '=ACTIVE' => 'Y'],
'order' => ['SORT' => 'ASC']
])->fetchAll();
// 2. Преобразуем шаблон URL из настроек инфоблока
foreach ($sections as &$sec) {
$iblock = \CIBlock::GetArrayByID($sec['IBLOCK_ID']); // данные инфоблока
$sec['SECTION_PAGE_URL'] = \CIBlock::ReplaceDetailUrl(
$iblock['SECTION_PAGE_URL'], // шаблон из настроек
$sec, // текущий раздел
true,
'S' // тип ссылки: S — раздел
);
}
unset($sec);
Так вы остаётесь на D7, а ссылка генерируется корректно.
3. Совместный вывод разделов и элементов на одной странице — расширенный пример
Задача: на странице «Новости» показать карточку каждой рубрики (заголовок + картинка) и внутри — несколько свежих публикаций.
3.1 Концепция
- Получаем все новости одной выборкой
news.list
. - В
result_modifier.php
вычисляем, какие разделы участвуют и вытягиваем их отдельным запросом. - Группируем элементы по
IBLOCK_SECTION_ID
, формируем$arResult['SECTIONS']
. - Выводим каждый раздел картинкой-карточкой, внутри — последние N новостей.
3.2 Настройка компонента news.list
<?$APPLICATION->IncludeComponent(
"bitrix:news.list",
"sections_with_items",
[
"IBLOCK_TYPE" => "news",
"IBLOCK_ID" => 12,
"NEWS_COUNT" => "1000", // берём все за один запрос
"SORT_BY1" => "ACTIVE_FROM",
"SORT_ORDER1" => "DESC",
"CACHE_TYPE" => "A",
"CACHE_TIME" => 3600000,
"SET_TITLE" => "N"
]
);?>
3.3 result_modifier.php
(D7-вариант)
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
use Bitrix\Iblock\SectionTable;
// 1. Собираем уникальные ID разделов, встретившихся в новостях
$sectionIDs = array_unique(array_column($arResult['ITEMS'], 'IBLOCK_SECTION_ID'));
// 2. Получаем активные разделы через ORM (без SECTION_PAGE_URL)
$sections = SectionTable::getList([
'select' => ['ID', 'NAME', 'PICTURE', 'IBLOCK_ID', 'CODE'],
'filter' => ['=ID' => $sectionIDs, '=ACTIVE' => 'Y'],
'order' => ['SORT' => 'ASC']
])->fetchAll();
// 3. Генерируем корректные URL
foreach ($sections as &$sec) {
$iblock = \CIBlock::GetArrayByID($sec['IBLOCK_ID']);
$sec['SECTION_PAGE_URL'] = \CIBlock::ReplaceDetailUrl($iblock['SECTION_PAGE_URL'], $sec, true, 'S');
$sec['ITEMS'] = [];
}
unset($sec);
// 4. Раскладываем новости по разделам, ограничивая первыми 3 публикациями
foreach ($arResult['ITEMS'] as $item) {
$sid = $item['IBLOCK_SECTION_ID'];
if (isset($sections[$sid]) && count($sections[$sid]['ITEMS']) < 3) {
$sections[$sid]['ITEMS'][] = $item;
}
}
// 5. Итоговый массив для шаблона
$arResult['SECTIONS'] = array_values($sections);?>
3.4 Шаблон template.php
<?if (!empty($arResult['SECTIONS'])):?>
<div class="news-sections grid lg:grid-cols-3 gap-6">
<?foreach ($arResult['SECTIONS'] as $section):?>
<article class="rounded-xl shadow-md overflow-hidden">
<?if ($section['PICTURE']):?>
<a href="<?=$section['SECTION_PAGE_URL'];?>">
<img src="<?=CFile::GetPath($section['PICTURE']);?>" alt="<?=$section['NAME'];?>" loading="lazy">
</a>
<?endif;?>
<div class="p-4">
<h2 class="text-xl font-semibold mb-2">
<a href="<?=$section['SECTION_PAGE_URL'];?>"><?=$section['NAME'];?></a>
</h2>
<ul class="space-y-1">
<?foreach ($section['ITEMS'] as $item):?>
<li>
<a href="<?=$item['DETAIL_PAGE_URL'];?>" class="hover:underline"><?=$item['NAME'];?></a>
</li>
<?endforeach;?>
</ul>
</div>
</article>
<?endforeach;?>
</div>
<?endif;?>
3.5 Полезные улучшения
Приём | Кратко |
---|---|
Lazy-load новостей | Подгружайте следующие партии Ajax-запросом к news.list с PARENT_SECTION . |
Свой стиль рубрики | Храните UF_COLOR , UF_ICON в пользовательских полях раздела и выводите вместе с карточкой. |
Отдельный кэш | Кэшируйте собранный массив $arResult['SECTIONS'] вручную, чтобы не пересчитывать при каждом сбросе компонента. |
Скелетоны | Пока Ajax-ответ не пришёл, показывайте CSS-скилетоны с фиксированной высотой. |
4. Типичные ошибки
Ошибка | Проявление | Решение |
---|---|---|
Счётчик ELEMENT_CNT не обновляется |
После публикации новости число не меняется | Сбрасывайте кэш инфоблока или вызывайте CIBlock::ClearCache() кроном при добавлении элемента. |
404 в разделах | Ошибка при переходе в рубрику | Проверьте символьные коды (CODE ), включите проверку уникальности и пересоздайте правила в .htaccess . |
Все новости на /news/ |
Вместо рубрик выводятся элементы | В news.php используйте только catalog.section.list либо фильтруйте news.list по PARENT_SECTION=0 . |
Дубль /news/ и /news/index.php |
Обе страницы индексируются | Добавьте <link rel="canonical" href="/news/"> или настройте 301-редирект. |
5. SEO & UX-советы
- Breadcrumbs. Добавляйте элементы цепочки через
$APPLICATION->AddChainItem()
сразу после определения активного раздела. - Микроразметка. Раздел —
itemscope itemtype="https://schema.org/CollectionPage"
, а каждая новость —Article
. - Карта сайта. В генераторе sitemap подключите разделы инфоблока; для крупных проектов формируйте отдельный XML кроном.
- Ленивая загрузка изображений. Используйте
loading="lazy"
иsrcset
для ретины. - А/Б-тесты. Проверьте, повышается ли CTR при отображении превью новостей в карточке рубрики.
6. Итоговый подбор подходов
Ситуация | Оптимальное решение |
---|---|
Нужен статичный список разделов | bitrix:catalog.section.list |
Полноценные страницы рубрик и новостей | bitrix:news с ЧПУ |
SPA / React-фронт | SectionTable + REST или GraphQL |
Карточки рубрик + первые новости | news.list + расширенный result_modifier.php |
Комбинируйте штатные компоненты с API-методами, кэшируйте то, что можно кэшировать, и формируйте корректные ЧПУ-адреса — тогда вывод разделов будет быстрым для пользователей и «понятным» для поисковых систем.