Перейти к содержанию

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

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

7 мин 66 Обновлено 22 июля Сложность: Средняя

TL;DR

  • Считает элементы раздела метод CIBlockSection::GetSectionElementsCount().
  • CNT_ACTIVE => Y – только активные, CNT_ALL => Y – с подразделами.
  • ID раздела берётся из $arItem["IBLOCK_SECTION_ID"] – лишний GetByID не нужен.
  • Для учёта дат активности используйте CIBlockElement::GetCount с ACTIVE_DATE.
  • D7-вариант – ElementTable::getCount с фильтром по IBLOCK_SECTION_ID.

Когда список новостей сгруппирован по разделам, часто нужно показать рядом с названием раздела счётчик – сколько в нём активных материалов. В 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 считает только текущий раздел.

Материалы по теме

Что почитать дальше по этой теме

Инструкция Подсчёт общего количества элементов в инфоблоке (Битрикс) Как посчитать количество активных элементов инфоблока 1С-Битрикс. Три рабочих способа: CIBlockElement::GetCount, GetList с пустым arGroupBy и D7-метод ElementTable::getCount – с разбором, чем они отличаются. 6 мин 53 18 февраля 2017 Инструкция Количество результатов в поиске по новостям (Битрикс) Как изменить количество результатов на странице поиска по новостям в 1С-Битрикс. Меняем параметр PAGE_RESULT_COUNT во вложенном компоненте поиска в шаблоне search.php комплексного компонента «Новости». 5 мин 39 20 февраля 2017 Инструкция В анонсе новостей вывести детальное описание и обрезать текст Как в анонсе компонента «Список новостей» 1С-Битрикс выводить текст из детального описания вместо превью и аккуратно обрезать его до нужной длины через CTextParser::html_cut, не ломая HTML-теги. 6 мин 55 18 февраля 2017 Инструкция Как вывести определённое поле элемента инфоблока в Битриксе Как в шаблоне компонента 1С-Битрикс вывести одно конкретное поле элемента инфоблока – например счётчик показов SHOW_COUNTER. Разбираем массив FIELDS, служебные поля элемента и безопасный вывод значения. 6 мин 50 18 февраля 2017