Для получения списка элементов инфоблока с множественным свойством типа "список" (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()возвращает массив объектов значений свойства — это универсальный способ для всех множественных свойств.