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

Вопрос задан: 24 мая 2026 в 02:05 | Задайте свой вопрос

Использованные MCP инструменты: searchDocs, liveApiFindFunction, liveApiGetClassMethods, liveApiGetClassCode, liveApiFindByReflection, liveApiFindByNamespace
Просмотров: 1

Для получения списка элементов инфоблока с множественным свойством типа "список" (enum) через D7 ORM необходимо использовать скомпилированную сущность инфоблока. Рассмотрим подробную инструкцию.

1. Важное предостережение

Согласно официальной документации модуля Информационные блоки (источник: pages/modules/iblocks/api.md):

Не используйте \Bitrix\Iblock\ElementTable. Он работает только с базовыми полями.

Для работы со свойствами (в том числе множественными типа "список") необходимо скомпилировать ORM-класс для конкретного инфоблока через IblockTable::compileEntity().

2. Компиляция ORM-сущности инфоблока

У инфоблока в настройках должно быть заполнено поле Символьный код API (API_CODE). Компиляция выполняется один раз в начале скрипта:

// News — значение поля «Символьный код API» из настроек инфоблока
$elementClassName = \Bitrix\Iblock\IblockTable::compileEntity('News');

В результате вы получите класс вида \Bitrix\Iblock\Elements\Element{API_CODE}Table. Например, \Bitrix\Iblock\Elements\ElementNewsTable.

3. Получение списка элементов со свойствами

Используйте метод query() скомпилированного класса для запроса элементов. Для доступа к свойствам используйте код свойства в верхнем регистре.

Чтение одиночного свойства типа "Список"

Для свойства с кодом SOURCE типа "Список" (одиночное) сначала получают объект значения через getItem():

$element = \Bitrix\Iblock\Elements\ElementNewsTable::query()
    ->where('CODE', 'news-author-source')
    ->setLimit(1)
    ->fetchObject();

$source = $element->get('SOURCE');
if ($source)
{
    echo $source->getItem()->getValue();   // РИА Новости
    echo $source->getItem()->getXmlId();   // ria
}

Чтение множественного свойства (в том числе типа "Список")

Для множественного свойства используйте метод getAll(), который возвращает коллекцию значений. Метод применим для любых множественных свойств, включая тип "Список":

$elements = \Bitrix\Iblock\Elements\ElementNewsTable::query()
    ->setSelect(['ID', 'NAME', 'TAGS'])   // TAGS — код множественного свойства
    ->where('ACTIVE', 'Y')
    ->fetchCollection();

foreach ($elements as $element)
{
    echo 'Элемент: ' . $element->getName() . "\n";

    $tags = $element->get('TAGS');
    if ($tags)
    {
        foreach ($tags->getAll() as $tag)
        {
            echo '  - ' . $tag->getValue() . "\n";
        }
    }
}

4. Полный пример для множественного свойства типа "Список"

Допустим, у инфоблока есть множественное свойство с кодом COLORS типа "Список" (например, значения: Красный, Синий, Зелёный). Полный код получения списка элементов с этим свойством:

// Подключаем модуль инфоблоков
\Bitrix\Main\Loader::includeModule('iblock');

// Компилируем сущность для инфоблока с API_CODE = 'Products'
\Bitrix\Iblock\IblockTable::compileEntity('Products');

// Выбираем элементы с их множественным свойством COLORS
$elements = \Bitrix\Iblock\Elements\ElementProductsTable::query()
    ->setSelect(['ID', 'NAME', 'COLORS'])
    ->where('ACTIVE', 'Y')
    ->fetchCollection();

foreach ($elements as $element)
{
    echo 'Товар: ' . $element->getName() . ' (ID: ' . $element->getId() . ")\n";

    $colors = $element->get('COLORS');
    if ($colors)
    {
        echo "Цвета:\n";
        foreach ($colors->getAll() as $color)
        {
            // getValue() — текстовое значение варианта списка (например, "Красный")
            // getXmlId() — XML_ID варианта списка (например, "red")
            echo '  - ' . $color->getValue() . ' (XML_ID: ' . $color->getXmlId() . ")\n";
        }
    }
    echo "\n";
}

5. Работа через getList (вместо query)

При необходимости можно использовать классический getList с fetchObject() / fetchCollection():

$collection = \Bitrix\Iblock\Elements\ElementProductsTable::getList([
    'select' => ['ID', 'NAME', 'COLORS'],
    'filter' => ['ACTIVE' => 'Y'],
    'order'  => ['ID' => 'ASC'],
])->fetchCollection();

foreach ($collection as $element)
{
    // Аналогичная работа со свойствами
    $colors = $element->get('COLORS');
    if ($colors)
    {
        foreach ($colors->getAll() as $color)
        {
            echo $color->getValue() . "\n";
        }
    }
}

6. Ключевые классы и их расположение

  • Bitrix\Iblock\IblockTable — модуль iblock, путь: /bitrix/modules/iblock/lib/iblocktable.php. Содержит метод compileEntity() для компиляции ORM-сущности по API_CODE.
  • Bitrix\Iblock\Elements\Element{API_CODE}Table — скомпилированный класс для элементов конкретного инфоблока. Содержит все поля и свойства как ORM-поля.
  • Bitrix\Iblock\PropertyEnumerationTable — модуль iblock, путь: /bitrix/modules/iblock/lib/propertyenumerationtable.php. Хранит варианты значений для свойств типа "Список".

7. Резюме

  • Для работы со свойствами через D7 ORM обязательно скомпилируйте сущность через IblockTable::compileEntity().
  • Для одиночного свойства типа "Список" используйте get('CODE')->getItem()->getValue().
  • Для множественного свойства типа "Список" используйте get('CODE')->getAll() и перебирайте коллекцию, у каждого элемента вызывая getValue() (текст варианта) и getXmlId() (внешний код).
  • Метод getAll() возвращает массив объектов значений свойства — это универсальный способ для всех множественных свойств.