Блог Горошко Андрея 1C-Битрикс Свойство «Справочник» (Highload-блок): Как получить данные по UF_XML_ID

Свойство «Справочник» (Highload-блок): Как получить данные по UF_XML_ID

Средний рейтинг
Еще нет оценок

Свойство типа «Справочник» (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).

Правильный подход:

  1. Соберите все уникальные UF_XML_ID со всех товаров в массив $allXmlIds.
  2. Сделайте один запрос к HL-блоку с фильтром [‘=UF_XML_ID’ => $allXmlIds].
  3. Сохраните результат в массив с ключами по UF_XML_ID.
  4. При выводе товаров берите данные из этого массива.

Вывод:
Свойство «Справочник» связывает инфоблок и HL-блок через поле UF_XML_ID.

Для отображения данных (названия, иконки) необходимо выполнить дополнительный запрос к соответствующему Highload-блоку через D7 ORM.


 Свойство справочник, Directory, Highload-блок, UF_XML_ID, привязка к справочнику, Битрикс, получить изображение справочника.

Мой рейтинг:

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

Related Post

Продажа маркированных товаров онлайн битриксПродажа маркированных товаров онлайн битрикс

Средний рейтинг Еще нет оценок Если вы используете эквайринг Сбербанка для оплаты онлайн на сайте 1С-Битрикс Управление сайтом и желаете продавать маркированные товары, то: У меня есть опыт реализации подобных

Кросс-платформенные SQL-запросы Возможности Bitrix\Main\DB\SqlHelperКросс-платформенные SQL-запросы Возможности Bitrix\Main\DB\SqlHelper

Средний рейтинг Еще нет оценок Если вы пишете «сырые» SQL-запросы (через $connection->query), вы рискуете привязаться к конкретной базе данных (обычно MySQL). SqlHelper — это абстракция, которая генерирует правильный SQL-синтаксис для текущей активной БД.

Обновление свойств элемента инфоблока 1с BitrixОбновление свойств элемента инфоблока 1с Bitrix

Средний рейтинг Еще нет оценок SetPropertyValuesEx() — это метод для сохранения значений свойств элемента информационного блока в БД. Этот метод более экономен в количестве запросов к БД, чем SetPropertyValues(), потому