Задача
В каталоге неоригинальных запчастей, тюнинга и аксессуаров (aftermarket) две внешне одинаковые детали различаются поколением автомобиля, годом выпуска, типом кузова или стороной установки. Покупатель, который выбрал не ту, узнаёт об этом на подъёмнике и оформляет возврат. Магазину нужен был инструмент, который автоматически отсекает несовместимое.
Второй слой задачи — разные покупатели. Один знает SKU и производителя, второй начинает с типа детали, третий знает только собственную машину. Все три пути должны приводить к одной товарной модели и одинаково корректной корзине.
Третий — данные. Каталоги поставщиков приходили с разными обозначениями одного и того же автомобиля и одной и той же детали, разными единицами измерения и написанием брендов. Объём и частота изменений исключали ручное ведение связей: нужна была массовая загрузка с проверкой.
Решение
Совместимость как отдельная модель данных. Данные о совместимости не хранились строкой в заголовке товара. Отдельная структура связывала автомобиль с деталью. Автомобиль описывали марка и модельное семейство, поколение или внутренний код, тип кузова и модификация, год или диапазон годов, дополнительные технические признаки. Деталь — товар, вариант и категория. Поверх них хранились ограничения, исключения и универсальная совместимость. Связь «многие ко многим»: одна деталь подходит нескольким поколениям, одному автомобилю соответствуют товары из десятков категорий. Одна модель обслуживала весь магазин: поиск, фильтры, карточку товара и импорт.
Автомобиль как контекст навигации. На главной работал двухшаговый подбор: автомобиль, затем тип детали, выдача строилась на пересечении условий. Выбранный автомобиль сохранялся как контекст: при переходах по каталогу выдача продолжала ограничиваться совместимыми товарами, пока пользователь не изменит или не сбросит выбор. Универсальные позиции обрабатывались отдельно, чтобы не выпадать из релевантной выдачи вместе с несовместимыми.
Динамические фасеты. Набор фильтров зависит от категории и от того, какие товары в ней доступны: совместимые автомобили и поколения, производитель, цена, цвет и материал, сторона установки, технические атрибуты категории, наличие. Фасеты показывают количество товаров и пересчитываются при сочетании условий, поэтому пользователь не собирает заведомо пустую комбинацию. Условия снимаются по одному или очищаются целиком.
Поиск поверх той же модели. Искать можно по названию или его части, SKU, артикулу производителя и бренду. Распознаются также тип детали, модель автомобиля, распространённые обозначения поколения и ключевые слова описания. Если автомобиль уже выбран, результаты дополнительно ограничиваются совместимостью с ним. Поиск и фасеты работают над одними данными, поэтому ответ не зависит от точки входа.
Нормализация и валидация импорта. Интеграционный слой приводил названия, единицы, бренды, поколения и диапазоны лет к внутреннему справочнику. На загрузке проверялись обязательные поля, дубли SKU, неизвестные автомобили, пересекающиеся диапазоны годов, некорректные категории, изображения и коммерческие данные. Ошибочная запись не попадала на витрину молча: она фиксировалась для разбора и повторной загрузки.
Совместимость в карточке двумя способами. Она описана человеческим языком, с моделями и диапазонами лет, и структурированно. Покупатель проверяет совместимость до оплаты, те же данные работают в фильтрах и передаются менеджеру при вопросе или возврате. Связанные товары дополняют установочный комплект, альтернативы дают другой бренд или ценовой уровень без нового поиска.
Исполнение заказа шире доставки. Кроме курьерской отправки есть самовывоз онлайн-заказа из шоурума, локальная выдача после подтверждения готовности, запись на сервис и установку, отдельная обработка крупногабаритных деталей, трек-номер и уведомления о статусе. Перед завершением оформления заказа повторно проверялись цена, наличие и коммерческие ограничения. Повтор после ошибки оплаты не должен был создавать дубль заказа или списания.
Интеграции, которые можно перезапускать. Внешних связей много: каталоги поставщиков и массовый импорт, остатки, цены, платежи, финансирование покупки и расчёт налогов. К ним добавляются службы доставки и трекинг, транзакционная почта, CRM, учёт, аналитика и рассылки. Обмены построены на управляемых заданиях с журналами: повторная синхронизация обновляет существующую запись без дубля, ошибка внешнего API сохраняется для диагностики и безопасного повторного запуска.
Пограничные случаи. Отдельно разбирались универсальные детали, несколько поколений с похожими названиями, неполные данные о совместимости, пересекающиеся диапазоны годов, снятые с производства SKU и товары, которые не работают без дополнительных компонентов.
Результат
У большого технического каталога появились три понятных входа: автомобиль, бренд и тип детали. Все три ведут к одной товарной модели и одинаково корректной корзине. Подбор по автомобилю и динамические фильтры сняли главный риск покупки запчастей: клиент видит совместимость до оплаты, а не после установки.
Операционная команда ведёт магазин в одной системе, без разрозненных выгрузок. В ней каталог (справочники автомобилей и поколений, связи товара с конфигурациями, категории и атрибуты), импорт, цены и остатки. Там же заказы, отгрузки, самовывоз, отмены и возвраты, а для маркетинга — купоны и правила корзины, баннеры, страницы и рассылки. Права разделены между администраторами, менеджерами каталога, специалистами по совместимости, командами контента и маркетинга, обработкой заказов, складом и клиентским сервисом. Посадочные страницы по автомобилям и категориям работают сразу как навигация, SEO-контент и вход в отфильтрованный каталог.