Как работает стандартный смарт-фильтр в Битриксе из коробки и в большинстве готовых решений. Разберем на нескольких примерах.
Пример 1
Допустим, что весь каталог состоит из товаров с торговыми предложениями. Для примера возьмем одежду и разберем один из товаров:
Базовый товар: Футболка
Свойства базового товара:
- Наименование
- Описание
- Бренд
У данного базового товара есть торговые предложения, которые состоят из свойств:
- Цвет
- Размер
Допустим, мы хотим настроить фильтр в разделе «Футболки», который должен позволять фильтровать футболки по бренду, цвету и размеру.
Разумным будет предположить, что пользователь, задав определенный бренд, размер и цвет будет ожидать, что в выдаче ему будут предложены футболки заданного бренда, цвета и размера. Так и произойдет. Сайт отберет все подходящие базовые товары и все подходящие торговые предложения и покажет пользователю те результаты, которые соответствуют всем заданным условиям одновременно. Т.е., в выдаче не может оказаться, например, футболка заданного бренда, у которой нет ни одного подходящего по цвету и размеру торгового предложения. И наоборот: пользователю не будет показано ни одно торговое предложение, базовый товар которого не подходит под заданный бренд. Но что будет, если мы немного изменим условия?
Пример 2
Представим, что магазин торгует диванами. Одна и та же модель дивана может иметь несколько цветовых решений обивки, поэтому торговым предложением здесь выступает диван определенного цвета. Пока что в этом примере все похоже на кейс с футболками.
Базовый товар: Диван
Свойства базового товара:
- Наименование
- Описание
- Бренд
У данного базового товара есть торговые предложения, которые имеют свойство
- Цвет обивки
Однако некоторые модели диванов существуют только в одном цвете.
Для единообразия можно было бы для таких диванов создавать базовый товар с одним торговым предложением, но реальность такова, что далеко не во всех случаях такой подход устраивает владельца магазина. Это может быть связано и с особенностями каталога, заведенного в 1С, и с простым желанием сэкономить время штатных контент-менеджеров, которым бы пришлось создавать два элемента в админке сайта вместо одного.
Поэтому представим, что для диванов, существующих в одном цвете, мы создаем простой товар вместо товара с торговыми предложениями.
По понятным причинам в каталоге появляется еще один тип товара:
Простой товар: Диван
Свойства:
- Наименование
- Описание
- Бренд
- Цвет обивки
Обратите внимание, что свойство «Цвет обивки» теперь используется еще и в простых товарах. А это значит, что фильтр должен теперь учитывать и это свойство и выдавать адекватный результат пользователю.
Посмотрим, как сейчас поведет себя фильтр. Допустим, мы находимся в категории каталога, где есть диваны с разными цветовыми решениями и диваны в единственном цвете, и фильтровать нам необходимо по цвету и бренду.
Для битрикса свойство «Цвет обивки» торгового предложения и одноименное свойство простого товара — это разные свойства. Поэтому в фильтре эти свойства выведутся по отдельности. То есть, буквально, пользователь увидит в фильтре два свойства “Цвет обивки”, одно из которых будет фильтровать по простым товарам, другое — по товарам с торговыми предложениями.
Ключевая проблема в том, что если задать одновременно 2 цвета, то фильтр ничего не найдет. Можно отдельно получить выборку по одному свойству цвета и отдельно — по другому. То есть, по одному свойству он выдаст все базовые и все простые товары заданного цвета, а по другому — все торговые предложения заданного цвета с привязанными к ним базовыми товарами. А выбрать всё сразу не получится.
Почему так?
Если вы задаете фильтрацию по цвету простых и базовых товаров, то в выборку попадут все простые и базовые товары, у которых задан искомый цвет. Фильтр здесь работает только по базовым и простым товарам, не затрагивая торговые предложения.
Если вы задаете фильтрацию по цвету торговых предложений, то в выборку попадут только базовые товары, у которых есть торговые предложения заданного цвета. Фильтр здесь учитывает только цвет торговых предложений.
А если вы зададите фильтрацию по двум цветам сразу, то один фильтр сработает как уточнение к другому. То есть, фильтр по базовым товарам исключит из выборки все товары с торговыми предложениями, а фильтр по торговым предложениям исключит из выборки найденные базовые товары. Таким образом, выдача будет пустой.
Что с этим делать
Первое и очевидное — решить проблему дублирования свойств в фильтре. То есть, пользователь должен задавать цвет обивки один раз, а не два, и не думать о том, какой из этих цветов относится к простым товарам, а какой — к торговым предложениям. Сделать это можно только путем кастомизации компонента каталога.
Допустим, мы добились того, что два одноименных свойства выводятся, как одно. Следующим шагом будет доработка логики фильтрации таким образом, чтобы в выборку по двойному свойству попадали и товары, которые удовлетворяют фильтру, и торговые предложения, которые тоже удовлетворяют фильтру.
Казалось бы, очевидная логика, но в коробке ее нет.
Для таких случаев мы разработали свое решение для фильтра, которое успешно решает описанный кейс и которое мы предлагаем в том числе рамках разработки в формате «Быстро и недорого».