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

Компонент не отдаёт нужных данных - причины по убыванию частоты

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

С чего начать

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

// в шаблоне компонента, на время разбора
echo '<pre>' . htmlspecialcharsbx(print_r(array_keys($arResult), true)) . '</pre>';
echo '<pre>' . htmlspecialcharsbx(print_r($arResult['PROPERTIES'] ?? [], true)) . '</pre>';
// если ключа нет в результате - проблема выше по цепочке, а не в разметке

Вывод состава результата отвечает на главный вопрос за минуту. Пустой ключ означает, что данные не пришли от компонента, и дальше разбирают его параметры, а не разметку.

Проверяем параметры вызова:

'PROPERTY_CODE' => ['BRAND', 'WARRANTY'], // свойства перечисляют явно
'SELECT_FIELDS' => ['ID', 'NAME', 'PREVIEW_PICTURE'],
// компонент выбирает только то, что перечислено: лишнего он не тянет

Компонент выбирает только перечисленные поля и свойства. Это сделано ради скорости, и почти всегда «пропавшее» свойство просто не названо в параметрах вызова.

Сбрасываем кэш компонента:

BXClearCache(true); // файловый кэш компонентов
$GLOBALS['CACHE_MANAGER']->CleanAll(); // управляемый кэш
// правка параметров вызова без сброса кэша ничего не меняет на странице
// на стенде кэш компонентов на время разбора выключают в настройках модуля

Кэш компонента хранит и результат, и разметку. Правка параметров вызова при живом кэше не даёт никакого эффекта, и разбор уходит в сторону на полчаса.

Причины

  1. Свойство не названо в параметрах вызова примерно 35% случаев

    ПризнакВ результате нет самого ключа свойства, а не пустое значение.

    ПроверкаСмотрим список кодов свойств прямо в параметрах вызова этого самого компонента каталога.

    Что делатьДобавляем код свойства в параметры вызова и сбрасываем после этого кэш компонента.

  2. Страница отдаётся из старого кэша примерно 25% случаев

    ПризнакПараметры правились, а на странице ничего не изменилось.

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

    Что делатьСбрасываем кэш самого компонента и все композитные копии этой конкретной страницы сайта.

  3. Код свойства написан иначе примерно 20% случаев

    ПризнакСвойство есть в карточке, но в результате его нет вовсе.

    ПроверкаСверяем код свойства в настройках инфоблока с кодом в параметрах.

    Что делатьПриводим код к тому виду, который записан в самом инфоблоке.

  4. Элемент закрыт правами примерно 12% случаев

    ПризнакАдминистратор видит данные, а покупатель - нет.

    ПроверкаОткрываем ту же самую страницу из окна браузера вообще без всякой авторизации.

    Что делатьПравим права группы на инфоблок или на конкретные элементы.

  5. Значение пустое у самого элемента примерно 8% случаев

    ПризнакКлюч свойства в результате есть, а значение пустое.

    ПроверкаСмотрим значение прямо в карточке элемента и в выборке из консоли.

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

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

Почему компонент не тянет все свойства сразу?

Ради скорости: лишние свойства - это лишние запросы. Поэтому их перечисляют явно.

Как отключить кэш на время разбора?

Параметром кэширования в вызове компонента. После разбора его обязательно возвращают.

Свойство есть, а значение пустое - это та же причина?

Нет, это уже про данные: смотреть нужно карточку и обмен. Разница видна по наличию ключа в результате.

Что делать со свойствами торговых предложений?

У них свой список кодов в параметрах вызова. Свойства товара и предложения задаются раздельно.

Смежное

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