Проверка пустого CIBlockElement::GetList в Bitrix
Как проверить, пуст ли результат CIBlockElement::GetList в Bitrix и вывести 'Элементы не найдены'. Используйте SelectedRowsCount(), Fetch() или D7 getCount(). Примеры кода, оптимизация и ошибки фильтров для инфоблоков.
Как в Bitrix проверить, пуст ли результат CIBlockElement::GetList и вывести сообщение, если элементов нет? Пример текущего кода:
<?$mySales = CIBlockElement::GetList (
// Сортировка элементов
Array(
"ID" => "ASC"
),
Array(
'IBLOCK_ID' => 37,
'PROPERTY_ARTICLE' =>$arItem["PROPERTIES"]["ARTICLE"]["VALUE"]
),
false,
false,
// Перечисляесм все свойства элементов, которые планируем выводить
Array(
'ID',
'NAME',
'PREVIEW_PICTURE',
'PROPERTY_PRICE'
)
);
while($mySalesItem = $mySales->GetNext())
{?>
<?=$mySalesItem['PROPERTY_PRICE_VALUE']." руб."?>
<?}?>
Как правильно определить, что GetList не вернул элементов и вывести вместо цикла сообщение (например, «Элементы не найдены»)?
Самый простой и надёжный способ — после вызова CIBlockElement::GetList проверить результат через метод SelectedRowsCount(): если он вернёт 0 — вывести «Элементы не найдены». Альтернативы — выполнить быстрый Fetch() или использовать D7‑ORM getCount() для подсчёта; в случае большого набора данных лучше ограничить выборку или сразу запросить только количество.
Содержание
- Как работает CIBlockElement::GetList и почему нужно проверять результат
- Исправленный код: проверка пустого результата через SelectedRowsCount
- Альтернативы: Fetch(), GetNextElement() и D7 getCount
- Оптимизация и частые ошибки при проверке GetList
- FAQ — быстрые ответы и отладка
- Источники
- Заключение
Как работает CIBlockElement::GetList и почему нужно проверять результат
CIBlockElement::GetList возвращает объект результата (CIBlockResult / CDBResult), который вы обычно итерируете через GetNext() или Fetch(). Это значит, что сам вызов GetList не печатает ничего — он только подготавливает выборку. Подробности в документации CIBlockElement::GetList: https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php.
Чтобы понять, пуст ли результат, есть несколько безопасных приёмов. Самый очевидный — спросить у объекта результата, сколько строк в выборке, вызвав SelectedRowsCount(). Официальная справка для SelectedRowsCount: https://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/selectedrowscount.php.
Коротко: если вы не проверяете результат перед while‑циклом, цикл просто ничего не выполнит и пользователь увидит пустую страницу или блок без подписи. Лучше показать fallback — «Элементы не найдены».
Исправленный код: проверка пустого результата через SelectedRowsCount
Ниже — минимально правленный вариант вашего кода с проверкой SelectedRowsCount(). Вставьте вместо существующего while:
<?php
$arFilter = array(
'IBLOCK_ID' => 37,
'PROPERTY_ARTICLE' => $arItem['PROPERTIES']['ARTICLE']['VALUE']
);
$mySales = CIBlockElement::GetList(
array('ID' => 'ASC'),
$arFilter,
false,
false,
array('ID','NAME','PREVIEW_PICTURE','PROPERTY_PRICE')
);
// Проверяем, есть ли строки в результате
if ($mySales->SelectedRowsCount() > 0) {
while ($mySalesItem = $mySales->GetNext()) {
echo $mySalesItem['PROPERTY_PRICE_VALUE'] . " руб.";
}
} else {
echo "Элементы не найдены";
}
?>
Пояснения:
- SelectedRowsCount() возвращает целое число — количество строк в результате выборки. Если 0, можно сразу вывести сообщение.
- GetNext() возвращает “удобно оформленный” массив, где значения свойств доступны как PROPERTY_КОД_VALUE (как в вашем примере).
Если вы хотите использовать Fetch() (иногда чуть быстрее для одноразовой проверки), то вариант:
$mySales = CIBlockElement::GetList(...);
if ($first = $mySales->Fetch()) {
do {
echo $first['PROPERTY_PRICE_VALUE'] . " руб.";
} while ($first = $mySales->Fetch());
} else {
echo "Элементы не найдены";
}
Альтернативы: Fetch(), GetNextElement() и D7 getCount
- Fetch() vs SelectedRowsCount():
- Fetch() возвращает первую строку или false — удобно, если вы хотите проверить наличие и сразу начать вывод без дополнительного прохода по результату. Блог‑заметки с практическими примерами: https://sendev.ru/blog/1c-bitrix/ciblockelement-getlist-ispolzovanie-i-primery/.
- GetNextElement() + GetProperties():
- Если у вас много свойств или нужно получить массив свойств (с метаданными), используйте GetNextElement() и затем GetFields()/GetProperties(). Это чаще экономит операции по обработке свойств. Пример и пояснения: https://goroshcko.ru/razrabotka/1c-bitrix/dobavlenie-i-obnovlenie-jelementov-v-bitriks-ciblockelement-add-i-update/.
Пример:
$res = CIBlockElement::GetList(...);
if ($res->SelectedRowsCount() > 0) {
while ($ob = $res->GetNextElement()) {
$fields = $ob->GetFields();
$props = $ob->GetProperties();
echo $props['PRICE']['VALUE'] . " руб.";
}
} else {
echo "Элементы не найдены";
}
- D7 / ORM: getCount()
- Если вы используете D7 и хотите отдельно посчитать количество записей, можно вызвать DataManager::getCount(). Документация: https://dev.1c-bitrix.ru/api_d7/bitrix/main/entity/datamanager/getcount.php. Пример (общая идея):
use \Bitrix\Iblock\ElementTable;
$count = ElementTable::getCount([
'IBLOCK_ID' => 37,
// фильтры D7 — учтите, что фильтрация по свойствам может требовать join'ов
]);
if ($count == 0) {
echo "Элементы не найдены";
} else {
// выборка через CIBlockElement::GetList или ORM getList
}
Обратите внимание: фильтрация по свойствам в ORM сложнее, т.к. свойства хранятся в отдельной таблице. Для простоты фильтрации по свойствам удобно оставаться с CIBlockElement::GetList.
Оптимизация и частые ошибки при проверке GetList
- Неправильный фильтр — самая частая причина “пустого” результата. Проверьте IBLOCK_ID, код свойства и само значение (введите var_dump($arFilter) для отладки).
- SelectedRowsCount() удобен, но при очень больших выборках лучше ограничивать запрос — используйте навигационные параметры (nTopCount) или сначала посчитайте количество. Это экономит память и время.
- Если у вас много свойств, используйте GetNextElement() + GetProperties() — так вы получаете массив свойств, а не “сформатированные” строки. Это экономит парсинг.
- Права доступа: убедитесь, что текущий пользователь видит элементы (CHECK_PERMISSIONS).
- Кеширование: при использовании кеша компонента учтите, что результат может возвращаться из кеша и SelectedRowsCount() будет работать уже на закешированном наборе.
- Полезно показать пользователю не только сообщение «Элементы не найдены», но и краткий совет: «Проверьте фильтр» — особенно на этапе разработки.
Больше практических примеров и обсуждений по теме можно найти на сайтах с сообщества и примерами: https://webdevhelp.ru/solutions/kolichestvo-elementov-infobloka-api/ и обсуждения на StackOverflow/хаbр: https://ru.stackoverflow.com/questions/977434/Получить-значения-множественного-свойства.
FAQ — быстрые ответы и отладка
-
В: SelectedRowsCount() возвращает 0, хотя элементы есть.
О: Скорее всего, фильтр неправильный (не тот IBLOCK_ID или неверный код/значение свойства). Проверьте $arFilter, попробуйте упростить фильтр и выполнить выборку вручную. -
В: Что быстрее — SelectedRowsCount() или Fetch()?
О: Для простой проверки наличия записи Fetch() с лимитом (nTopCount => 1) может быть быстрее; SelectedRowsCount() удобен и читабелен, но при больших выборках лучше ограничить выборку. -
В: Как вывести понятное сообщение в шаблоне компонента?
О: Поместите проверку перед циклом и выводите либо контент, либо сообщение в разметке — это улучшит UX. -
В: Нужно ли использовать GetNextElement() всегда?
О: Нет. Только когда нужны все данные свойств в виде массива или когда много свойств, и вы не хотите лишней обработки строк.
Источники
- CIBlockElement::GetList — официальная документация
- CDBResult::SelectedRowsCount — официальная документация
- DataManager::getCount (D7) — официальная документация
- CIBlockElement::GetList: руководство и примеры (sendev)
- Добавление и обновление элементов в Битрикс (goroshcko)
- Кол-во элементов инфоблока — примеры (webdevhelp)
- Количество выбранных элементов в Битриксе (developtolive)
- Практические обсуждения — Habr Q&A
- StackOverflow на русском — примеры работы со свойствами
- Пособие по выборке элементов и разделов (pushorigin)
Заключение
Итог: самый прямой способ проверить, пуст ли результат CIBlockElement::GetList (bitrix getlist) — вызвать SelectedRowsCount() и при нуле вывести «Элементы не найдены». Если нужна дополнительная оптимизация — используйте Fetch() с ограничением выборки или D7 getCount() там, где это уместно. В первую очередь, проверьте правильность фильтра (IBLOCK_ID и код свойства) — чаще всего именно он виноват в “пустом” результате.