Заметки
Почему 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.