Перейти к содержанию
Инструкция

Вывести количество элементов в разделе (Список новостей)

Как в компоненте «Список новостей» 1С-Битрикс посчитать и вывести количество активных элементов внутри раздела инфоблока. Разбираем CIBlockSection::GetSectionElementsCount и учёт вложенных разделов.

Обновлено 22 июля 7 минут чтения

Когда список новостей сгруппирован по разделам, часто нужно показать рядом с названием раздела счётчик – сколько в нём активных материалов. В 1С-Битрикс для этого есть готовый метод CIBlockSection::GetSectionElementsCount(), который считает элементы на стороне БД, без выборки самих новостей. Приём рабочий и в 2026 году.

Рабочий код в шаблоне news.list

Скопируйте шаблон компонента в свою тему (/local/templates/ВАШ_ШАБЛОН/components/bitrix/news.list/ИМЯ_ШАБЛОНА/template.php) и в цикле по элементам используйте ID раздела, в котором лежит элемент:

$sectionId = (int) $arItem["IBLOCK_SECTION_ID"];

if ($sectionId > 0) {
    $activeElements = CIBlockSection::GetSectionElementsCount(
        $sectionId,
        ["CNT_ACTIVE" => "Y"] // считаем только активные элементы
    );
    echo intval($activeElements);
}

Обратите внимание: лишний вызов CIBlockSection::GetByID() из старой версии заметки здесь не нужен – для подсчёта достаточно ID раздела, который уже есть в $arItem["IBLOCK_SECTION_ID"]. Запрос ради проверки существования раздела только замедляет шаблон.

Параметры GetSectionElementsCount

  • CNT_ACTIVE => "Y" – считать только активные элементы (по умолчанию считаются все).
  • CNT_ALL => "Y" – учитывать элементы во всех вложенных подразделах, а не только в текущем.
  • Если нужны «активные прямо сейчас» с учётом дат – метод считает по флагу активности; для строгого учёта дат активности используйте CIBlockElement::GetCount с ACTIVE_DATE (см. ниже).

Альтернатива: CIBlockElement::GetCount по разделу

Если нужен более гибкий фильтр (учёт дат активности, свойств, только прямые дети раздела), удобнее считать через фильтр элементов:

$count = CIBlockElement::GetCount([
    "IBLOCK_ID"        => $arItem["IBLOCK_ID"],
    "SECTION_ID"       => $sectionId,
    "INCLUDE_SUBSECTIONS" => "N", // только текущий раздел; "Y" – с подразделами
    "ACTIVE"           => "Y",
    "ACTIVE_DATE"      => "Y",
]);
echo intval($count);

Здесь вы явно управляете тем, что считать: с подразделами или без (INCLUDE_SUBSECTIONS), с учётом дат активности (ACTIVE_DATE) и любыми дополнительными условиями фильтра.

Современный вариант на D7

На ядре D7 подсчёт элементов раздела делается через ORM-таблицу инфоблоков с фильтром по IBLOCK_SECTION_ID:

use Bitrix\Iblock\ElementTable;

$count = ElementTable::getCount([
    '=IBLOCK_ID'          => $arItem["IBLOCK_ID"],
    '=IBLOCK_SECTION_ID'  => $sectionId,
    '=ACTIVE'             => 'Y',
]);

Учтите: прямой фильтр по IBLOCK_SECTION_ID в ORM считает только элементы, привязанные к разделу основной привязкой, без учёта дополнительных привязок и вложенных подразделов. Для «раздел + все подразделы» проще остаться на GetSectionElementsCount с CNT_ALL => "Y" или GetCount с INCLUDE_SUBSECTIONS.

Производительность и кэш

  • Не считайте в цикле без нужды. Если разделов много и они повторяются, кэшируйте счётчики в массив [section_id => count] и берите готовое значение.
  • Оборачивайте в кэш компонента. Логику подсчёта лучше держать в result_modifier.php, чтобы результат попадал в кэш news.list.
  • Активность и даты. CNT_ACTIVE учитывает флаг активности; для строгого учёта дат берите GetCount с ACTIVE_DATE.

Смежные задачи: как посчитать все элементы инфоблока, как вывести детальное описание в анонсе и как задать число результатов поиска по новостям.

Частые вопросы

Каким методом посчитать элементы в разделе инфоблока?

CIBlockSection::GetSectionElementsCount($sectionId, ["CNT_ACTIVE" => "Y"]) – считает элементы раздела на стороне БД. Параметр CNT_ACTIVE ограничивает подсчёт активными элементами, CNT_ALL => Y добавляет элементы из вложенных подразделов.

Нужно ли вызывать GetByID перед подсчётом?

Нет. ID раздела уже есть в $arItem["IBLOCK_SECTION_ID"], а GetSectionElementsCount принимает именно ID. Дополнительный запрос GetByID из старых примеров только замедляет шаблон и не нужен.

Как учесть даты активности элементов при подсчёте?

CNT_ACTIVE учитывает только флаг активности. Для строгого учёта дат используйте CIBlockElement::GetCount с фильтром SECTION_ID, ACTIVE => Y и ACTIVE_DATE => Y, а вложенность задайте параметром INCLUDE_SUBSECTIONS.

Как посчитать элементы с учётом всех подразделов?

Добавьте CNT_ALL => "Y" в параметры GetSectionElementsCount либо используйте GetCount с INCLUDE_SUBSECTIONS => "Y". Прямой ORM-фильтр по IBLOCK_SECTION_ID считает только текущий раздел.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.