Свойство типа «Справочник» (directory) — это современный аналог списков.
Оно хранит данные в Highload-блоке, что позволяет добавлять к значениям картинки и дополнительные поля.
Проблема: При выборке элемента (CIBlockElement::GetList) в значении такого свойства приходит не ID записи и не Название, а строка UF_XML_ID (внешний код).
Как получить данные записи справочника?
Предположим, у нас есть свойство «Бренд» (код BRAND) типа «Справочник».
1. Получаем настройки свойства (чтобы узнать ID HL-блока)
// Получаем XML_ID из элемента
$xmlId = $arElement['PROPERTY_BRAND_VALUE']; // Например, "nike"
// Узнаем, в каком HL-блоке хранятся бренды
// Это можно посмотреть в админке или получить программно, если свойство универсальное
$hlblockId = 5; // ID Highload-блока "Brands"2. Выбираем данные из HL-блока
Используем D7 ORM для выборки по UF_XML_ID.
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Loader;
Loader::includeModule("highloadblock");
// Компилируем сущность
$hlblock = HighloadBlockTable::getById($hlblockId)->fetch();
$entity = HighloadBlockTable::compileEntity($hlblock);
$entityDataClass = $entity->getDataClass();
// Делаем выборку
$result = $entityDataClass::getList([
'select' => ['ID', 'UF_NAME', 'UF_FILE', 'UF_XML_ID'],
'filter' => ['=UF_XML_ID' => $xmlId]
]);
if ($brand = $result->fetch()) {
echo "Бренд: " . $brand['UF_NAME'];
// Если есть картинка
if ($brand['UF_FILE']) {
echo '<img src="' . \CFile::GetPath($brand['UF_FILE']) . '">';
}
}Оптимизация для списка товаров
Если вы выводите список товаров, делать запрос в цикле для каждого товара — плохо (проблема N+1).
Правильный подход:
- Соберите все уникальные UF_XML_ID со всех товаров в массив $allXmlIds.
- Сделайте один запрос к HL-блоку с фильтром [‘=UF_XML_ID’ => $allXmlIds].
- Сохраните результат в массив с ключами по UF_XML_ID.
- При выводе товаров берите данные из этого массива.
Вывод:
Свойство «Справочник» связывает инфоблок и HL-блок через поле UF_XML_ID.
Для отображения данных (названия, иконки) необходимо выполнить дополнительный запрос к соответствующему Highload-блоку через D7 ORM.
Свойство справочник, Directory, Highload-блок, UF_XML_ID, привязка к справочнику, Битрикс, получить изображение справочника.