Перейти к содержанию
Инструкция

Получить название свойства из типа «Справочник» (Highload-блок)

Свойство типа «Справочник» хранит не название, а XML_ID записи Highload-блока. Разбираем, как по этому коду через ORM Highload-блока достать читаемое название (UF_NAME) и вывести его на детальной странице новости.

Обновлено 22 июля 7 минут чтения 2 просмотра

Свойство инфоблока типа «Справочник» (привязка к Highload-блоку) хранит в VALUE не читаемое название, а служебный код UF_XML_ID записи справочника. Поэтому «в лоб» вывести название не получится – нужно сходить в Highload-блок и найти запись по этому коду. Приём ниже работает на ORM Битрикса (ядро D7) и актуален в 2026 году.

Почему нельзя вывести значение напрямую

Когда вы создаёте свойство типа «Справочник», Битрикс связывает его с Highload-блоком (HL-блоком). В элементе новости сохраняется лишь XML_ID выбранной записи справочника – это и лежит в $arResult['PROPERTIES']['METKA_NEWS']['VALUE']. Человекочитаемое имя (поле UF_NAME справочника) хранится отдельно, в таблице HL-блока. Чтобы его показать, делаем один запрос к этой таблице по UF_XML_ID.

Рабочий код: вывод названия на детальной странице

Задача: у элемента есть не множественное свойство «Справочник» с кодом METKA_NEWS, привязанное к HL-блоку с ID 1. На детальной странице (bitrix:news.detail) выводим его название:

if (CModule::IncludeModule('highloadblock')) {
    $xmlId = $arResult['PROPERTIES']['METKA_NEWS']['VALUE']; // UF_XML_ID записи справочника

    if (!empty($xmlId)) {
        $hlBlock = Bitrix\Highloadblock\HighloadBlockTable::getById(1)->fetch(); // ID HL-блока = 1
        $entity  = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlBlock);
        $dataClass = $entity->getDataClass();

        $row = $dataClass::getRow([
            'select' => ['ID', 'UF_NAME'],
            'filter' => ['=UF_XML_ID' => $xmlId],
        ]);

        if ($row) {
            echo htmlspecialcharsbx($row['UF_NAME']);
        }
    }
}

Что делает каждая строка

  • HighloadBlockTable::getById(1) – получаем описание HL-блока по его ID (смотрите в админке: Настройки → Highload-блоки).
  • compileEntity() – компилируем ORM-сущность этого HL-блока «на лету».
  • getDataClass() – получаем класс, через который делаем выборку из таблицы справочника.
  • getRow(['filter' => ['=UF_XML_ID' => $xmlId]]) – ищем нужную запись по коду и берём её UF_NAME.

В отличие от исходного кода 2022 года здесь используется getRow() вместо getList()->Fetch(): раз запись одна, короче и понятнее. И обязательно проверяем $xmlId на пустоту – иначе фильтр вернёт случайную запись или ничего.

Если свойство множественное

У множественного «Справочника» в VALUE придёт массив кодов. Тогда фильтруем сразу по массиву и собираем все названия:

$xmlIds = $arResult['PROPERTIES']['METKA_NEWS']['VALUE']; // массив UF_XML_ID

$rows = $dataClass::getList([
    'select' => ['UF_NAME'],
    'filter' => ['=UF_XML_ID' => $xmlIds], // массив – ORM сам сделает IN()
])->fetchAll();

$names = array_column($rows, 'UF_NAME');
echo htmlspecialcharsbx(implode(', ', $names));

Оптимизация: не дёргайте справочник в цикле

  • Кэшируйте маппинг. Если выводите метки для списка новостей, не запрашивайте HL-блок на каждый элемент. Выберите весь справочник один раз в массив [UF_XML_ID => UF_NAME] и берите название из него – это один запрос вместо N.
  • Заворачивайте в кэш компонента. Обращение к HL-блоку в шаблоне лучше вынести в result_modifier.php, чтобы результат попадал в кэш компонента, а не выполнялся на каждый показ.
  • Проверяйте наличие модуля. CModule::IncludeModule('highloadblock') обязателен – без него классы HighloadBlockTable недоступны.
  • Экранируйте вывод через htmlspecialcharsbx().

Смежные темы: как вывести определённое поле элемента, как выбрать элемент и его свойства по ID из GET и как вывести детальное описание в анонсе.

Частые вопросы

Почему свойство «Справочник» выводит код, а не название?

В элементе инфоблока свойство типа «Справочник» хранит только UF_XML_ID выбранной записи Highload-блока. Человекочитаемое название лежит в поле UF_NAME таблицы HL-блока, поэтому его нужно достать отдельным запросом по этому коду.

Как получить название по UF_XML_ID?

Подключите модуль highloadblock, через HighloadBlockTable::getById(ID)->fetch() получите HL-блок, скомпилируйте сущность compileEntity(), возьмите getDataClass() и вызовите getRow() с фильтром =UF_XML_ID => код, читая поле UF_NAME.

Как быть, если свойство множественное?

Тогда в VALUE придёт массив кодов. Передайте его в фильтр =UF_XML_ID => $массив – ORM сформирует условие IN(), а fetchAll() вернёт все записи. Названия соберите через array_column и implode.

Как не грузить справочник на каждый элемент списка?

Выберите весь HL-блок один раз в массив вида [UF_XML_ID => UF_NAME] и берите название из него – это один запрос вместо N. Логику лучше вынести в result_modifier.php, чтобы она попадала в кэш компонента.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.