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