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

Подсчёт общего количества элементов в инфоблоке (Битрикс)

Инструкция
Как посчитать количество активных элементов инфоблока 1С-Битрикс. Три рабочих способа: CIBlockElement::GetCount, GetList с пустым arGroupBy и D7-метод ElementTable::getCount – с разбором, чем они отличаются.

6 мин 53 Обновлено 22 июля Сложность: Базовая

TL;DR

  • Считайте на стороне БД, а не выбирая все элементы и count() в PHP.
  • Самый чистый способ – CIBlockElement::GetCount($arFilter).
  • GetList вернёт число, только если 3-м аргументом передать пустой массив arGroupBy.
  • У готовой выборки количество даёт SelectedRowsCount().
  • D7-вариант – ElementTable::getCount($filter).

Посчитать, сколько элементов лежит в инфоблоке (или удовлетворяет фильтру), в 1С-Битрикс можно несколькими способами. Главное – не выбирать все элементы и не считать их через count() в PHP: это лишняя нагрузка. Считать нужно на стороне БД. Ниже – три рабочих приёма, от самого чистого к легаси-варианту из исходной заметки.

Способ 1 (рекомендуемый): CIBlockElement::GetCount

Отдельный метод, который сразу возвращает число – читается однозначно и не путается с выборкой:

CModule::IncludeModule("iblock");

$count = CIBlockElement::GetCount([
    "IBLOCK_ID" => 19,   // ID инфоблока
    "ACTIVE"    => "Y",   // только активные
    "ACTIVE_DATE" => "Y", // с учётом дат активности
]);

echo intval($count);

Это самый явный вариант: GetCount() принимает только фильтр и возвращает целое число. Рекомендую использовать именно его для новых доработок.

Способ 2: GetList с пустым arGroupBy

Именно этот приём был в исходной заметке. Он работает благодаря особенности GetList: если третьим аргументом ($arGroupBy) передать пустой массив, метод вернёт не объект выборки, а целое число – количество найденных записей:

CModule::IncludeModule("iblock");

$arFilter = ["IBLOCK_ID" => 19, "ACTIVE" => "Y"];
$count = CIBlockElement::GetList([], $arFilter, []); // 3-й аргумент – пустой массив!

echo intval($count);

Важно про исходный код. В старой версии было CIBlockElement::GetList(Array(), $arFilter, Array(), false, Array()) и echo $res_count. Это действительно работает – но только потому, что третий аргумент Array() переключает метод в режим подсчёта. Если случайно убрать этот пустой массив (или передать вместо него false), GetList вернёт объект результата, и echo выведет что-то вроде Object вместо числа. Поэтому способ 1 надёжнее: там перепутать нечего.

Если у вас уже есть объект выборки

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

$res = CIBlockElement::GetList([], $arFilter, false, false, ["ID"]);
echo $res->SelectedRowsCount();

Способ 3 (D7): ElementTable::getCount

В актуальных версиях Битрикса тот же подсчёт делается через ORM – коротко и типизированно:

use Bitrix\Iblock\ElementTable;

$count = ElementTable::getCount([
    '=IBLOCK_ID' => 19,
    '=ACTIVE'    => 'Y',
]);

echo $count;

Метод getCount() есть у любой ORM-сущности Битрикса (наследник DataManager) и возвращает целое число. Классические GetCount/GetList при этом остаются полностью рабочими – выбор за стилем проекта.

Замечания по производительности и точности

  • Считайте в БД, а не в PHP. Никогда не делайте выборку всех элементов только ради count() – используйте GetCount/getCount.
  • Учитывайте даты активности. Фильтр ACTIVE => "Y" не отсекает элементы с ещё не наступившей или истёкшей датой активности. Чтобы «активные прямо сейчас» – добавьте ACTIVE_DATE => "Y".
  • Права доступа. Классические методы по умолчанию учитывают права; для подсчёта без учёта прав в фильтр можно добавить "CHECK_PERMISSIONS" => "N".
  • Кэш. Если число выводится часто и меняется редко, оберните подсчёт в управляемый кэш (\Bitrix\Main\Data\Cache), чтобы не бить в БД на каждый показ.

Похожие задачи: как посчитать элементы внутри раздела, как задать число результатов поиска по новостям и как выбрать элемент и его свойства по ID из GET.

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

Почему echo GetList выводит Object, а не число?

GetList возвращает число только если третьим аргументом ($arGroupBy) передан пустой массив – тогда включается режим подсчёта. Если там false или аргумент опущен, метод вернёт объект выборки, и echo покажет Object. Чтобы избежать путаницы, используйте CIBlockElement::GetCount().

Чем GetCount отличается от GetList с пустым arGroupBy?

Результат одинаковый – целое число, но GetCount принимает только фильтр и предназначен именно для подсчёта, поэтому читается однозначно и его сложнее сломать случайной правкой аргументов.

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

Фильтр ACTIVE => "Y" не учитывает даты активности. Добавьте ACTIVE_DATE => "Y", чтобы исключить элементы с ещё не наступившей или уже истёкшей датой начала/окончания активности.

Есть ли способ подсчёта на ядре D7?

Да – Bitrix\Iblock\ElementTable::getCount($filter). Метод getCount() есть у любой ORM-сущности и возвращает целое число. Классические GetCount и GetList в 2026 году тоже валидны.

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

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

Инструкция Вывести количество элементов в разделе (Список новостей) Как в компоненте «Список новостей» 1С-Битрикс посчитать и вывести количество активных элементов внутри раздела инфоблока. Разбираем CIBlockSection::GetSectionElementsCount и учёт вложенных разделов. 7 мин 67 17 января 2017 Инструкция Количество результатов в поиске по новостям (Битрикс) Как изменить количество результатов на странице поиска по новостям в 1С-Битрикс. Меняем параметр PAGE_RESULT_COUNT во вложенном компоненте поиска в шаблоне search.php комплексного компонента «Новости». 5 мин 39 20 февраля 2017 Инструкция Получить ID из GET и вывести элементы и свойства инфоблока Как в 1С-Битрикс взять ID элемента из GET-параметра, безопасно его отфильтровать и выбрать поля и свойства элемента инфоблока. Разбираем GetNextElement, защиту от дублей при множественных свойствах и D7-альтернативу. 8 мин 55 19 июля 2019 Инструкция Как вывести определённое поле элемента инфоблока в Битриксе Как в шаблоне компонента 1С-Битрикс вывести одно конкретное поле элемента инфоблока – например счётчик показов SHOW_COUNTER. Разбираем массив FIELDS, служебные поля элемента и безопасный вывод значения. 6 мин 50 18 февраля 2017