Свойство инфоблока типа «Справочник» (привязка к 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 и как вывести детальное описание в анонсе.