Справочник не отдаёт значения - разбор причин
Свойство-справочник заполнено, а на витрине вместо названия пусто или виден непонятный код. Разбираем причины по убыванию частоты.
С чего начать
Смотрим, что на самом деле лежит в свойстве:
$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/ | headgrep -rn 'DISPLAY_VALUE\|getDataClass' /home/bitrix/www/local/templates/ | head# печать значения напрямую даёт код, а не название записи справочникаПричины
-
В свойстве код, которого нет в справочнике примерно 30% случаев
ПризнакЗначение у элемента заполнено, а выборка по этому коду возвращает пустой ответ.
ПроверкаИщем запись справочника по внешнему коду из свойства прямо в консоли.
Что делатьЗаводим недостающие записи справочника или чиним обмен, который пишет чужие коды.
-
Шаблон печатает код вместо названия примерно 25% случаев
ПризнакНа витрине виден внешний код записи: латиница, цифры или строка из учётной системы.
ПроверкаСмотрим шаблон компонента: печатается ли значение свойства напрямую.
Что делатьВыводим готовое отображаемое значение либо забираем название из справочника выборкой.
-
Свойство привязано к другому справочнику примерно 20% случаев
ПризнакПустыми оказываются все значения свойства сразу, у всех элементов инфоблока.
ПроверкаЧитаем настройки свойства и сверяем имя таблицы справочника с нужным блоком.
Что делатьУказываем в настройках свойства правильный справочник и переиндексируем фильтр.
-
Витрина отдаёт страницу из кэша примерно 15% случаев
ПризнакВ административной части значение видно, а на витрине его нет уже давно.
ПроверкаОткрываем страницу с выключенным кэшем компонента или сбрасываем кэш каталога.
Что делатьСбрасываем кэш компонента и включаем сброс по изменению данных справочника.
-
Справочник переименован, класс не собирается примерно 10% случаев
ПризнакОшибка о неизвестном классе в журнале либо пустые значения сразу после правки блока.
ПроверкаСверяем имя сущности справочника с тем, что записано в коде и в настройках свойства.
Что делатьВозвращаем прежнее имя сущности либо правим все места, где оно используется.
Частые вопросы
Что хранится в свойстве-справочнике?
Внешний код записи справочника, а не её название и не числовой идентификатор. Название достают из справочника при выводе на витрину.
Почему значение видно в админке, а на витрине нет?
Административная часть сама подставляет название по коду, а шаблон витрины - нет. Либо значение печатается напрямую, либо страница пришла из кэша.
Как вывести название одним запросом на список?
Собрать коды всех элементов списка и забрать названия одной выборкой из справочника. Запрос на каждый товар в цикле заметно замедляет страницу.
Можно ли переименовать справочник?
Имя таблицы и имя сущности после создания менять не стоит. По имени сущности собирается класс, и переименование ломает весь код вокруг справочника.
Что делать, если обмен пишет чужие коды?
Сверять коды справочника с кодами учётной системы и заводить недостающие записи. Автоматическое создание записей при обмене тоже возможно, но требует аккуратности.
Смежное
- Highload-блоки на практике - оглавление подтемы
- Справочник в выборках: вывод значений, фильтр, кэш - как выводят названия правильно
- Highload-блок на практике: создание, поля, привязка к свойству - как свойство связывают со справочником
- Highload-блок на объёме: индексы, заливка, выкладка структуры - когда записей десятки тысяч
- Значение свойства не сохраняется: разбор причин - соседний разбор по свойствам
- Свойства-списки: значения, сортировка, значение по умолчанию - когда справочник избыточен
- Кэш не срабатывает: страница собирается заново каждый раз - разбор кэша витрины
- Инфоблоки - устройство хранилищ целиком