Веб

Проверка пустого CIBlockElement::GetList в Bitrix

Как проверить, пуст ли результат CIBlockElement::GetList в Bitrix и вывести 'Элементы не найдены'. Используйте SelectedRowsCount(), Fetch() или D7 getCount(). Примеры кода, оптимизация и ошибки фильтров для инфоблоков.

1 ответ 1 просмотр

Как в Bitrix проверить, пуст ли результат CIBlockElement::GetList и вывести сообщение, если элементов нет? Пример текущего кода:

php
<?$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 и почему нужно проверять результат

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
<?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() (иногда чуть быстрее для одноразовой проверки), то вариант:

php
$mySales = CIBlockElement::GetList(...);
if ($first = $mySales->Fetch()) {
 do {
 echo $first['PROPERTY_PRICE_VALUE'] . " руб.";
 } while ($first = $mySales->Fetch());
} else {
 echo "Элементы не найдены";
}

Альтернативы: Fetch(), GetNextElement() и D7 getCount

  1. Fetch() vs SelectedRowsCount():
  • Fetch() возвращает первую строку или false — удобно, если вы хотите проверить наличие и сразу начать вывод без дополнительного прохода по результату. Блог‑заметки с практическими примерами: https://sendev.ru/blog/1c-bitrix/ciblockelement-getlist-ispolzovanie-i-primery/.
  1. GetNextElement() + GetProperties():

Пример:

php
$res = CIBlockElement::GetList(...);
if ($res->SelectedRowsCount() > 0) {
 while ($ob = $res->GetNextElement()) {
 $fields = $ob->GetFields();
 $props = $ob->GetProperties();
 echo $props['PRICE']['VALUE'] . " руб.";
 }
} else {
 echo "Элементы не найдены";
}
  1. D7 / ORM: 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() всегда?
    О: Нет. Только когда нужны все данные свойств в виде массива или когда много свойств, и вы не хотите лишней обработки строк.


Источники

  1. CIBlockElement::GetList — официальная документация
  2. CDBResult::SelectedRowsCount — официальная документация
  3. DataManager::getCount (D7) — официальная документация
  4. CIBlockElement::GetList: руководство и примеры (sendev)
  5. Добавление и обновление элементов в Битрикс (goroshcko)
  6. Кол-во элементов инфоблока — примеры (webdevhelp)
  7. Количество выбранных элементов в Битриксе (developtolive)
  8. Практические обсуждения — Habr Q&A
  9. StackOverflow на русском — примеры работы со свойствами
  10. Пособие по выборке элементов и разделов (pushorigin)

Заключение

Итог: самый прямой способ проверить, пуст ли результат CIBlockElement::GetList (bitrix getlist) — вызвать SelectedRowsCount() и при нуле вывести «Элементы не найдены». Если нужна дополнительная оптимизация — используйте Fetch() с ограничением выборки или D7 getCount() там, где это уместно. В первую очередь, проверьте правильность фильтра (IBLOCK_ID и код свойства) — чаще всего именно он виноват в “пустом” результате.

Авторы
Проверено модерацией
Модерация
Проверка пустого CIBlockElement::GetList в Bitrix