CIBlockElement::GetList в Битрикс: пример, фильтр и сортировка

Обновлено:

CIBlockElement::GetList — один из старых, но до сих пор рабочих способов получить элементы инфоблока в Битрикс. Например, вывести последние новости, список производителей или несколько товаров.

Для новичка важно не пытаться сразу достать «всё». Сначала выберем только нужные поля и активные элементы. Так код будет понятнее, а запрос — легче.

Что нужно знать до начала

Нужен ID инфоблока. Его можно посмотреть в административной части в списке инфоблоков. В примере ниже ID новостей равен 1. В своём проекте подставьте свой ID.

Пример ID инфоблока в адресной строке административной части Битрикс
В старой административной части ID часто виден в адресе после IBLOCK_ID=.

Самый простой базовый пример

Код можно поставить в шаблон компонента или в свой PHP-файл, который уже подключён через Битрикс. Сначала подключаем модуль iblock. Потом описываем сортировку, фильтр и поля, которые хотим получить.

<?php
if (CModule::IncludeModule('iblock')) {
    $arOrder = array('SORT' => 'ASC', 'ID' => 'DESC');
    $arFilter = array(
        'IBLOCK_ID' => 1,
        'ACTIVE' => 'Y',
        'ACTIVE_DATE' => 'Y',
        'CHECK_PERMISSIONS' => 'Y',
        'MIN_PERMISSION' => 'R',
    );
    $arSelect = array('ID', 'IBLOCK_ID', 'NAME', 'DETAIL_PAGE_URL');

    $result = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);

    while ($item = $result->GetNext(false)) {
        ?>
        <a href="<?=htmlspecialcharsbx($item['DETAIL_PAGE_URL'])?>">
            <?=htmlspecialcharsbx($item['NAME'])?>
        </a><br>
        <?php
    }
}
?>

В $arFilter мы оставили только элементы нужного инфоблока, которые активны и попадают в период публикации. В $arSelect указали только поля, которые выводим. По документации для корректной выборки стоит включать ID и IBLOCK_ID.

CHECK_PERMISSIONS => 'Y' включает проверку доступа, а MIN_PERMISSION => 'R' требует право чтения. Активность элемента сама по себе не означает, что его можно показывать каждому посетителю.

Почему нужен htmlspecialcharsbx

Обычный GetNext() уже экранирует значения. Здесь мы специально передали false, чтобы получить исходный текст, и экранируем его при выводе. Не применяйте оба способа одновременно: иначе амперсанд и кавычки могут отображаться неправильно. Подстановка шаблонов в DETAIL_PAGE_URL сохраняется.

Название новости заполняет редактор сайта. В нём могут случайно оказаться кавычки или HTML. Перед выводом в страницу используйте htmlspecialcharsbx(): функция превращает специальные символы в безопасный текст. Это полезная привычка, особенно если данные не пишете лично вы.

Не убирайте эту функцию только потому, что «у нас редакторы аккуратные». Ошибка обычно появляется позже, когда контент меняет другой человек.

Как вывести только пять последних новостей

Меняем сортировку и добавляем ограничение в четвёртый параметр:

<?php
$arOrder = array('ACTIVE_FROM' => 'DESC', 'ID' => 'DESC');
$arNav = array('nTopCount' => 5);

$result = CIBlockElement::GetList(
    $arOrder,
    $arFilter,
    false,
    $arNav,
    $arSelect
);
?>

Не передавайте пустой массив вместо четвёртого параметра «на всякий случай». В этом методе пустой массив означает ограничение на десять элементов. Если ограничение не нужно, передавайте false.

Как получить свойство элемента инфоблока

Поля и свойства — разные вещи. NAME есть у каждого элемента, а свойство «Артикул», «Цвет» или «Метки» вы создаёте в настройках инфоблока. Ниже получим значения свойства с символьным кодом TAGS. Это обычное строковое свойство, у которого включена галочка «Множественное».

Для начала возьмём один элемент. В примере инфоблок имеет ID 1, а элемент — 123. Замените оба числа своими. Модуль iblock должен быть подключён, как в первом примере статьи.

<?php
$result = CIBlockElement::GetList(
    array(),
    array(
        'IBLOCK_ID' => 1,
        'ID' => 123,
        'ACTIVE' => 'Y',
        'ACTIVE_DATE' => 'Y',
        'CHECK_PERMISSIONS' => 'Y',
        'MIN_PERMISSION' => 'R',
    ),
    false,
    array('nTopCount' => 1),
    array('ID', 'IBLOCK_ID')
);

if ($item = $result->Fetch()) {
    $properties = CIBlockElement::GetProperty(
        (int)$item['IBLOCK_ID'],
        (int)$item['ID'],
        array('sort' => 'asc', 'value_id' => 'asc'),
        array('CODE' => 'TAGS', 'ACTIVE' => 'Y')
    );

    while ($property = $properties->Fetch()) {
        if ($property['VALUE'] !== false && $property['VALUE'] !== null
            && $property['VALUE'] !== '') {
            echo htmlspecialcharsbx((string)$property['VALUE']) . '<br>';
        }
    }
}
?>

Здесь GetList сначала проверяет, можно ли показывать сам элемент. Только потом GetProperty читает его свойство. Отдельный вызов GetProperty не заменяет проверку доступа к элементу.

Цикл while нужен, чтобы не потерять второе и следующие значения. У одиночного строкового свойства будет одно значение. Проверка не отбрасывает строку "0": она тоже может быть полезным значением. Для списка, файла и HTML-свойства формат данных другой — этот пример рассчитан именно на обычную строку.

Если выводите сразу много элементов, не вызывайте GetProperty для каждого в цикле: получится отдельный запрос на каждый элемент. Для списка посмотрите GetPropertyValuesArray или штатный компонент. А выбор нескольких множественных свойств прямо через GetList может размножить строки результата.

Как получить название связанного элемента

Допустим, у товара есть свойство BRAND типа «Привязка к элементам». Оно одиночное и связано с инфоблоком производителей. В нём хранится ID производителя, а не его название. Поэтому сначала получим этот ID, а затем отдельно выберем производителя.

В примере товар находится в инфоблоке 1 и имеет ID 123. Инфоблок производителей — 2. Эти числа и код BRAND замените своими. Подключение модуля остаётся таким же.

<?php
$filter = array(
    'IBLOCK_ID' => 1,
    'ID' => 123,
    'ACTIVE' => 'Y',
    'ACTIVE_DATE' => 'Y',
    'CHECK_PERMISSIONS' => 'Y',
    'MIN_PERMISSION' => 'R',
);
$result = CIBlockElement::GetList(
    array(), $filter, false, array('nTopCount' => 1),
    array('ID', 'IBLOCK_ID', 'PROPERTY_BRAND')
);

if ($item = $result->Fetch()) {
    $brandId = (int)$item['PROPERTY_BRAND_VALUE'];
    if ($brandId > 0) {
        $filter['IBLOCK_ID'] = 2;
        $filter['ID'] = $brandId;
        $brands = CIBlockElement::GetList(
            array(), $filter, false, array('nTopCount' => 1),
            array('ID', 'IBLOCK_ID', 'NAME')
        );
        if ($brand = $brands->Fetch()) {
            echo htmlspecialcharsbx($brand['NAME']);
        }
    }
}
?>

Фильтр активности и прав нужен и для производителя. Если товар доступен посетителю, связанный с ним элемент от этого автоматически доступным не становится. Пустая привязка, удалённый, неактивный или недоступный производитель просто не будут выведены.

Этот вариант удобен для одного товара. Для списка соберите все ID производителей и получите их одним GetList с массивом ID в фильтре, затем разложите результат по ID. Так не придётся выполнять запрос на каждой строке. Для множественной привязки тоже нужен сбор всех ID: nTopCount => 1 здесь специально рассчитан на одиночное свойство.

Дополнено 20 октября 2026 года. Оба новых примера проверены на временной демоверсии Битрикс (main 26.150.0, iblock 25.300.0), в том числе для посетителя без авторизации. Параметры сверены с документацией GetProperty и GetList. На своём сайте сначала повторите проверку на тестовой копии.

Что часто ломается

  • Забыли подключить модуль iblock — метод не найден.
  • Указали чужой ID инфоблока — цикл отработает, но данных не будет.
  • Не добавили ACTIVE => 'Y' — можно случайно показать скрытый материал.
  • Выбрали все поля и свойства без причины — страница может работать медленнее.
  • Вывели NAME без экранирования — получили риск сломать HTML страницы.

Когда лучше взять компонент

Если нужна пагинация, кеширование, фильтр из формы, комплексные права или красивый вывод, сначала посмотрите штатный компонент. Самописный GetList хорош для маленького понятного блока. Не надо писать двадцать строк кода ради ссылки на одну новость, но и не стоит превращать простой блок в огромный компонент без причины.

Перед использованием проверьте пример на тестовой копии своего проекта: права, шаблоны адресов и состав полей зависят от его настроек.

Базовая часть статьи обновлена 3 октября 2026 года. Параметры метода и поведение четвёртого параметра сверены с официальной документацией CIBlockElement::GetList.

Полезно по теме

Если нужен целый раздел с новостями, начните с инструкции как создать раздел новостей в Битрикс. А при работе с загрузкой файлов пригодится разбор сохранения исходного имени файла.

CIBlockElement::GetList в Битрикс: пример, фильтр и сортировка: 6 комментариев

  1. У стандартных компонентов реализовано кэширование, а потому несмотря на то, что в компоненте действительно часто тянутся лишние данные, нагрузки на сервер компоненты будут создавать меньше, чем Ваш пример без кэширования.

    1. модифицировать шаблон компонента.
      Чтобы ответить конкретнее нужны доступы к проекту.

    1. if (CModule::IncludeModule("iblock")){
      $res = CIBlockElement::GetList(Array(), Array("IBLOCK_ID"=>1), Array("PROPERTY_1"));
      while($ob = $res->GetNext()){
      ?>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пожалуйста, докажите, что вы не робот * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Хостинг Timeweb
Как используется Google Analytics

Владелец bxguru.ru использует Google Analytics, чтобы понимать посещаемость блога и улучшать статьи. После вашего разрешения Google получает сведения о просмотренных страницах, источнике перехода, устройстве и взаимодействиях со страницей. Cookies помогают различать посещения. Имя, email и текст комментариев в код аналитики сайта не передаются; параметры и фрагменты адреса страницы исключены.

Выбор сохраняется в этом браузере на 180 дней. Срок аналитических cookies — до 180 дней после последнего посещения. Изменить выбор можно кнопкой «Настройки Google Analytics». При отказе Google Analytics не загружается. Эта настройка относится к Google Analytics; на сайте также используется Яндекс Метрика.

Как Google обрабатывает данные сайтов-партнёров.