Разборы

Умный фильтр Битрикса потерял параметры: где на самом деле хранится настройка

Из умного фильтра каталога пропали параметры подбора. В карточке свойства галочки стоят, кеш сброшен, а параметров нет. Дело в том, что признак "показывать в умном фильтре" хранится не в свойстве, а в отдельной таблице привязок к разделам. После импорта каталога эти привязки часто пропадают. Разбирался с этим, когда у магазина из 16 параметров подбора осталось 9.

Проверено на Битриксе 26-й версии с шаблоном Аспро.

Где на самом деле лежит настройка

В таблице b_iblock_section_property, это привязка свойства к разделу каталога:

ПолеСмысл
IBLOCK_ID, SECTION_ID, PROPERTY_IDключ; SECTION_ID = 0 значит весь каталог
SMART_FILTERY или N, участвует ли свойство в фильтре
DISPLAY_TYPEвид: A ползунок, F флажки, K переключатель, P выпадающий список
DISPLAY_EXPANDEDразвернут ли блок по умолчанию

Чего нет там, где его обычно ищут:

  • в таблице свойств b_iblock_property колонки SMART_FILTER нет вообще;
  • в b_iblock_property_feature лежат только признаки показа в списке и карточке товара;
  • вкладки "Умный фильтр" в настройках каталога может не быть.

Поэтому **нет строки в b_iblock_section_property - свойство выключено**, и никакая правка карточки свойства этого не изменит. Импорт каталога такие строки затирает, а номера самих свойств сохраняет. Снаружи это выглядит как "свойства пересоздались", хотя это не так.

Диагностика

Какие свойства реально включены:

SELECT * FROM b_iblock_section_property WHERE IBLOCK_ID = 10 ORDER BY SECTION_ID, PROPERTY_ID;

Есть ли у свойств значения (свойство без значений тоже исчезнет из фильтра):

SELECT IBLOCK_PROPERTY_ID, COUNT(*) AS CNT, MIN(VALUE_NUM) AS MN, MAX(VALUE_NUM) AS MX
FROM b_iblock_element_property
WHERE IBLOCK_PROPERTY_ID IN (101, 102, 103) GROUP BY IBLOCK_PROPERTY_ID;

Нет ли дублей после импорта, когда включить легко не тот экземпляр:

SELECT NAME, COUNT(*) AS CNT, GROUP_CONCAT(ID ORDER BY ID) AS IDS
FROM b_iblock_property WHERE IBLOCK_ID = 10 GROUP BY NAME HAVING CNT > 1;

Вместо 10 и 101-103 подставьте номер своего каталога и своих свойств.

Как включить свойство

Правильнее через API, потому что он сам сбрасывает связанные кеши: \Bitrix\Iblock\SectionPropertyTable или старый CIBlockSectionPropertyLink::Set(). Прямой INSERT в таблицу работает, но кеш потом придется чистить руками.

Фасетный индекс: кнопки пересборки нет

Страница "Контент -> Инфоблоки -> Фасетные индексы" только показывает состояние и пишет "Все индексы созданы". Пересобрать оттуда нельзя, а без пересборки новые свойства в фильтре не появятся. Делается кодом из командной PHP-строки в админке:

\Bitrix\Main\Loader::includeModule('iblock');
$id = 10;
\Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($id);
\Bitrix\Iblock\PropertyIndex\Manager::deleteIndex($id);
$indexer = \Bitrix\Iblock\PropertyIndex\Manager::createIndexer($id);
$indexer->startIndex();
$guard = 0;
while ($indexer->continueIndex(30) && ++$guard < 200) {}
$indexer->endIndex();

Метода Manager::checkAdminNotice(), который встречается в примерах, нет в некоторых версиях: его вызов роняет скрипт. Из-за этого плашка "Необходимо создать фасетный индекс" может висеть, хотя индекс уже собран. Проверяйте по таблице, а не по плашке:

SELECT FACET_ID, COUNT(*) FROM b_iblock_10_index GROUP BY FACET_ID;

FACET_ID равен номеру свойства, умноженному на 2.

Кеш, который не протухает

У компонента фильтра время кеша нередко стоит огромным. В разобранном проекте было CACHE_TIME = 36000000, это 416 дней. Если меняли таблицу мимо API, чистить так:

BXClearCache(true);
$GLOBALS['CACHE_MANAGER']->CleanAll();
$GLOBALS['stackCacheManager']->CleanAll();

Признак того, что вы смотрите на кеш, а не на результат: страница отдается за 1-2 секунды и полностью совпадает с прошлым замером.

У пересборки оказался полезный побочный эффект. Страница подбора, которая на холодном кеше собиралась больше 100 секунд и обрывалась по таймауту, стала отвечать за 1,4 секунды.

Шаблон может выбросить свойство без следов

В шаблонах умного фильтра Аспро (catalog.smart.filter/*/result_modifier.php) есть три места, где параметр пропадает молча:

  1. Жесткий список номеров свойств для сортировки. Чего нет в списке, того не будет в фильтре. У шаблонов для компьютера и телефона списки разные, поэтому набор параметров на телефоне может отличаться.
  2. Черный список свойств в начале файла: перечисленные там удаляются принудительно.
  3. Правило "убрать пустой ползунок": если максимум минус минимум не больше нуля, блок удаляется. Свойство без заполненных значений исчезнет именно так.

Мобильный шаблон еще и делит параметры на группы по шесть. Отсюда эффект "было три вкладки, стало две": верстка не сломалась, просто параметров стало меньше.

Порядок работ

  1. Проверить строки в b_iblock_section_property, а не карточку свойства.
  2. Убедиться, что у свойств есть значения и что включаете не дубль.
  3. Включить нужные свойства через SectionPropertyTable.
  4. Пересобрать фасетный индекс кодом.
  5. Очистить кеш всеми тремя вызовами.
  6. Сверить набор со списками в result_modifier.php обоих шаблонов.

Если фильтр на вашем сайте ведет себя странно после импорта или обновления, напишите мне. Проверка по этому списку обычно занимает час-два.

Похожая проблема на вашем сайте? Напишите в Telegram или оставьте заявку.