Из умного фильтра каталога пропали параметры подбора. В карточке свойства галочки стоят, кеш сброшен, а параметров нет. Дело в том, что признак "показывать в умном фильтре" хранится не в свойстве, а в отдельной таблице привязок к разделам. После импорта каталога эти привязки часто пропадают. Разбирался с этим, когда у магазина из 16 параметров подбора осталось 9.
Проверено на Битриксе 26-й версии с шаблоном Аспро.
Где на самом деле лежит настройка
В таблице b_iblock_section_property, это привязка свойства к разделу каталога:
| Поле | Смысл |
|---|---|
IBLOCK_ID, SECTION_ID, PROPERTY_ID | ключ; SECTION_ID = 0 значит весь каталог |
SMART_FILTER | Y или 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) есть три места, где параметр пропадает молча:
- Жесткий список номеров свойств для сортировки. Чего нет в списке, того не будет в фильтре. У шаблонов для компьютера и телефона списки разные, поэтому набор параметров на телефоне может отличаться.
- Черный список свойств в начале файла: перечисленные там удаляются принудительно.
- Правило "убрать пустой ползунок": если максимум минус минимум не больше нуля, блок удаляется. Свойство без заполненных значений исчезнет именно так.
Мобильный шаблон еще и делит параметры на группы по шесть. Отсюда эффект "было три вкладки, стало две": верстка не сломалась, просто параметров стало меньше.
Порядок работ
- Проверить строки в
b_iblock_section_property, а не карточку свойства. - Убедиться, что у свойств есть значения и что включаете не дубль.
- Включить нужные свойства через
SectionPropertyTable. - Пересобрать фасетный индекс кодом.
- Очистить кеш всеми тремя вызовами.
- Сверить набор со списками в
result_modifier.phpобоих шаблонов.
Если фильтр на вашем сайте ведет себя странно после импорта или обновления, напишите мне. Проверка по этому списку обычно занимает час-два.