← К заметкам

Заметки

Почему getCount ломается с пользовательскими свойствами инфоблока

Проблема с подсчётом элементов по свойству бывает двух видов. ORM не знает такого поля — тогда запрос падает. Либо JOIN с множественным свойством размножает строки — тогда запрос выполняется, но число получается завышенным.

У ElementTable нет автоматически всех свойств инфоблока в getMap(). Для свойств нужен подходящий API или сгенерированная ORM-сущность инфоблока с настроенным символьным кодом API.

Для небольшого набора можно проверить ожидаемое число через старый API и уникальные ID:

$element_ids = [];
$elements = CIBlockElement::GetList(
    [],
    ['IBLOCK_ID' => 12, 'ACTIVE' => 'Y', 'PROPERTY_CITY' => 'Москва'],
    false,
    false,
    ['ID']
);
while ($element = $elements->Fetch()) {
    $element_ids[(int)$element['ID']] = true;
}
echo count($element_ids);

Пример выполняется в коробке с подключённым модулем iblock. Он загружает все совпавшие ID и поэтому подходит для диагностики, а не для тяжёлого счётчика на каждой странице. Для большой выборки нужен подсчёт уникальных элементов на стороне БД с учётом реальной структуры JOIN.