Перейти к содержимому

Справочник не отдаёт значения - разбор причин

Свойство-справочник заполнено, а на витрине вместо названия пусто или виден непонятный код. Разбираем причины по убыванию частоты.

С чего начать

Смотрим, что на самом деле лежит в свойстве:

$rs = \CIBlockElement::GetProperty($iblockId, $elementId, [], ['CODE' => 'BRAND']);
while ($row = $rs->Fetch()) { printf("%s | %s\n", $row['VALUE'], $row['USER_TYPE']); }
// свойство-справочник хранит внешний код записи, а не её название

Значение свойства - это внешний код записи справочника. Название хранится в самом справочнике, и его достают отдельной выборкой при выводе на витрину.

Ищем запись справочника по этому коду:

$hl = \Bitrix\Highloadblock\HighloadBlockTable::getById($hlId)->fetch();
$class = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hl)->getDataClass();
print_r($class::getRow(['filter' => ['=UF_XML_ID' => $value]]));
// пустой ответ означает, что кода из свойства в справочнике нет

Проверяем настройки самого свойства:

$prop = \CIBlockProperty::GetList([], ['IBLOCK_ID' => $iblockId, 'CODE' => 'BRAND'])->Fetch();
printf("тип=%s настройки=%s\n", $prop['USER_TYPE'], print_r($prop['USER_TYPE_SETTINGS'], true));
// в настройках указано имя таблицы справочника: оно и связывает их

Имя таблицы в настройках свойства связывает его со справочником. Другое имя означает, что свойство ходит в чужой блок, где нужных кодов просто нет.

Смотрим, что печатает шаблон:

Окно терминала
grep -rn "PROPERTIES\['BRAND'\]" /home/bitrix/www/local/templates/ | head
grep -rn 'DISPLAY_VALUE\|getDataClass' /home/bitrix/www/local/templates/ | head
# печать значения напрямую даёт код, а не название записи справочника

Причины

  1. В свойстве код, которого нет в справочнике примерно 30% случаев

    ПризнакЗначение у элемента заполнено, а выборка по этому коду возвращает пустой ответ.

    ПроверкаИщем запись справочника по внешнему коду из свойства прямо в консоли.

    Что делатьЗаводим недостающие записи справочника или чиним обмен, который пишет чужие коды.

  2. Шаблон печатает код вместо названия примерно 25% случаев

    ПризнакНа витрине виден внешний код записи: латиница, цифры или строка из учётной системы.

    ПроверкаСмотрим шаблон компонента: печатается ли значение свойства напрямую.

    Что делатьВыводим готовое отображаемое значение либо забираем название из справочника выборкой.

  3. Свойство привязано к другому справочнику примерно 20% случаев

    ПризнакПустыми оказываются все значения свойства сразу, у всех элементов инфоблока.

    ПроверкаЧитаем настройки свойства и сверяем имя таблицы справочника с нужным блоком.

    Что делатьУказываем в настройках свойства правильный справочник и переиндексируем фильтр.

  4. Витрина отдаёт страницу из кэша примерно 15% случаев

    ПризнакВ административной части значение видно, а на витрине его нет уже давно.

    ПроверкаОткрываем страницу с выключенным кэшем компонента или сбрасываем кэш каталога.

    Что делатьСбрасываем кэш компонента и включаем сброс по изменению данных справочника.

  5. Справочник переименован, класс не собирается примерно 10% случаев

    ПризнакОшибка о неизвестном классе в журнале либо пустые значения сразу после правки блока.

    ПроверкаСверяем имя сущности справочника с тем, что записано в коде и в настройках свойства.

    Что делатьВозвращаем прежнее имя сущности либо правим все места, где оно используется.

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

Что хранится в свойстве-справочнике?

Внешний код записи справочника, а не её название и не числовой идентификатор. Название достают из справочника при выводе на витрину.

Почему значение видно в админке, а на витрине нет?

Административная часть сама подставляет название по коду, а шаблон витрины - нет. Либо значение печатается напрямую, либо страница пришла из кэша.

Как вывести название одним запросом на список?

Собрать коды всех элементов списка и забрать названия одной выборкой из справочника. Запрос на каждый товар в цикле заметно замедляет страницу.

Можно ли переименовать справочник?

Имя таблицы и имя сущности после создания менять не стоит. По имени сущности собирается класс, и переименование ломает весь код вокруг справочника.

Что делать, если обмен пишет чужие коды?

Сверять коды справочника с кодами учётной системы и заводить недостающие записи. Автоматическое создание записей при обмене тоже возможно, но требует аккуратности.

Смежное

Первоисточник