Вывод разделов из новостей в 1С-Битрикс с примерами кода

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

Вывод разделов из новостей в 1С-Битрикс

Зачем выводить разделы отдельно?

  • Удобство посетителей. Короткий список рубрик помогает быстрее ориентироваться в контенте.
  • 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 Концепция

  1. Получаем все новости одной выборкой news.list.
  2. В result_modifier.php вычисляем, какие разделы участвуют и вытягиваем их отдельным запросом.
  3. Группируем элементы по IBLOCK_SECTION_ID, формируем $arResult['SECTIONS'].
  4. Выводим каждый раздел картинкой-карточкой, внутри — последние 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-советы

  1. Breadcrumbs. Добавляйте элементы цепочки через $APPLICATION->AddChainItem() сразу после определения активного раздела.
  2. Микроразметка. Раздел — itemscope itemtype="https://schema.org/CollectionPage", а каждая новость — Article.
  3. Карта сайта. В генераторе sitemap подключите разделы инфоблока; для крупных проектов формируйте отдельный XML кроном.
  4. Ленивая загрузка изображений. Используйте loading="lazy" и srcset для ретины.
  5. А/Б-тесты. Проверьте, повышается ли CTR при отображении превью новостей в карточке рубрики.

6. Итоговый подбор подходов

Ситуация Оптимальное решение
Нужен статичный список разделов bitrix:catalog.section.list
Полноценные страницы рубрик и новостей bitrix:news с ЧПУ
SPA / React-фронт SectionTable + REST или GraphQL
Карточки рубрик + первые новости news.list + расширенный result_modifier.php

Комбинируйте штатные компоненты с API-методами, кэшируйте то, что можно кэшировать, и формируйте корректные ЧПУ-адреса — тогда вывод разделов будет быстрым для пользователей и «понятным» для поисковых систем.

Теги:  вывод разделов, новости, SEO, оптимизация, компоненты, API, PHP

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Участие в проекте

привлечение в проект на part-time основе

от 20 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.