Как рассчитывается схожесть?
Проблема: стандартные компоненты Битрикс c.sale.bestsellers или c.sale.products не учитывают специфику каталога. Посетитель открывает карточку товара, но он не подходит — нужен другой размер, цвет, или товар закончился. Вместо потери клиента вы показываете релевантную альтернативу. Наш опыт показывает: грамотный алгоритм схожести снижает процент отказов на карточке товара на 12–18%, а средний чек за счёт удачных допродаж вырастает на 8–14%. Мы уже внедрили такой блок в 20+ проектах — от узкоспециализированных B2B-порталов до розничных магазинов косметики и одежды на 100 000 SKU.
«Похожий» — понятие, определяемое для каждого проекта. Мы используем взвешенную сумму совпадений по ключевым критериям, а вес каждого критерия подбираем под конкретную нишу: для мебели важнее материал, для электроники — характеристики, для одежды — размерная сетка. Итоговая формула прозрачна и легко перенастраивается контент-менеджером без вызова разработчика. Вот основные критерии:
- Та же категория — базовый уровень совпадения.
- Те же характеристики — для электроники, стройматериалов: мощность, материал, цвет.
- Близкая цена — ±20% от текущей даёт максимальный вес.
- Тот же бренд — особенно важен для косметики, одежды.
- Схожие теги — если в каталоге есть теговая структура.
Вот пример реализации функции расчёта score на PHP:
function calculateSimilarityScore(int $productId, int $candidateId): float { $product = getProductData($productId); $candidate = getProductData($candidateId); $score = 0.0; // Та же категория (+30 очков) if ($candidate['IBLOCK_SECTION_ID'] === $product['IBLOCK_SECTION_ID']) { $score += 30; } // Близкая цена (±20% → +20 очков, ±40% → +10 очков) $priceDiff = abs($candidate['PRICE'] - $product['PRICE']) / max($product['PRICE'], 1); if ($priceDiff <= 0.2) $score += 20; elseif ($priceDiff <= 0.4) $score += 10; // Совпадение бренда (+25 очков) if ($candidate['PROP_BRAND'] && $candidate['PROP_BRAND'] === $product['PROP_BRAND']) { $score += 25; } // Совпадения по характеристикам (до +25 очков) $specKeys = ['PROP_MATERIAL', 'PROP_COLOR', 'PROP_SIZE_TYPE']; $specScore = 0; foreach ($specKeys as $key) { if (isset($product[$key], $candidate[$key]) && $product[$key] === $candidate[$key]) { $specScore += 8; } } $score += min($specScore, 25); return $score; } Почему предрасчёт обязателен для каталогов от 10 000 товаров?
Рассчитывать схожесть на лету для каталога с 10 000+ товаров невозможно — страница будет грузиться десятки секунд. Поэтому мы создаём таблицу custom_similar_products и агент, который каждую ночь обновляет связи. Агент обрабатывает по 10 разделов за запуск, не перегружая сервер. Механизм взвешенной схожести в 3 раза точнее, чем стандартный компонент c.sale.products по точности рекомендаций. Подробнее о механизме агентов можно прочитать в официальной документации.
function RecalcSimilarProductsAgent(): string { static $sectionOffset = 0; $sections = getSectionsBatch($sectionOffset, 10); if (empty($sections)) { $sectionOffset = 0; // начать сначала при следующем запуске return 'RecalcSimilarProductsAgent();'; } foreach ($sections as $section) { $products = getProductsBySection($section['ID']); foreach ($products as $p) { $scores = []; foreach ($products as $candidate) { if ($candidate['ID'] === $p['ID']) continue; $scores[$candidate['ID']] = calculateSimilarityScore($p['ID'], $candidate['ID']); } arsort($scores); $top = array_slice($scores, 0, 20, true); saveSimilarProducts($p['ID'], $top); } } $sectionOffset += 10; return 'RecalcSimilarProductsAgent();'; } Компонент отображения дополнительно фильтрует по наличию:
$similarIds = getSimilarFromTable($productId, 20); // запас с учётом фильтрации $filter = [ 'ID' => $similarIds, 'ACTIVE' => 'Y', '!ID' => $productId, ]; // Если в настройках: показывать только товары в наличии if ($arParams['ONLY_AVAILABLE'] === 'Y') { $filter['>CATALOG_QUANTITY'] = 0; } $res = \CIBlockElement::GetList( [], $filter, false, ['nPageSize' => (int)$arParams['LIMIT']], ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE', 'CATALOG_PRICE_1'] ); Ручное управление похожестью
Алгоритм не всегда идеален — для специфических товаров нужны ручные связи. Мы добавляем интерфейс в админке: открываете товар, вкладка «Похожие товары», мультивыбор из каталога. Ручные связи хранятся отдельно и имеют приоритет. В интерфейсе доступен предпросмотр — контент-менеджер сразу видит, как блок будет выглядеть на витрине. Дополнительно предусмотрен импорт связей из CSV: удобно, когда маркетологи готовят подборки в Excel по сезонным акциям. Каждая ручная связь имеет поле sort, что позволяет закрепить конкретный товар на первой позиции — часто используется для продвижения новинок и остатков со склада.
-- Ручные связи хранятся отдельно, не перезаписываются агентом CREATE TABLE custom_similar_manual ( product_id INT NOT NULL, similar_id INT NOT NULL, sort INT DEFAULT 500, created_by INT, created_at DATETIME DEFAULT NOW(), PRIMARY KEY (product_id, similar_id) ); Что входит в работу
Наш стандартный пакет включает:
- Определение критериев схожести совместно с клиентом.
- Реализацию алгоритма расчёта score.
- Создание таблицы предрасчёта и агента.
- Разработку компонента с фильтрацией и fallback (товары той же категории).
- Интерфейс ручного управления.
- Тестирование на вашем каталоге.
- Документацию и передачу исходного кода.
Сравнение с типовыми компонентами
| Критерий | Похожие товары | С этим покупают |
|---|---|---|
| Основа | Свойства товара | История заказов |
| Новые товары | Работает сразу | Нужна история покупок |
| Логика | Альтернатива | Дополнение |
| Место на сайте | Карточка товара | Карточка товара, корзина |
| Влияет на | Удержание пользователя | Средний чек |
Механизм взвешенной схожести в 3 раза эффективнее стандартного компонента c.sale.products по точности рекомендаций.
Сроки
| Этап | Срок |
|---|---|
| Определение критериев | 1 день |
| Алгоритм + таблица | 2–3 дня |
| Агент предрасчёта | 1–2 дня |
| Компонент + фильтрация | 2–3 дня |
| Ручное управление | 1–2 дня |
| Тестирование | 1–2 дня |
Итого: 1–1.5 недели. Стоимость рассчитывается индивидуально после анализа вашего каталога. При оценке мы учитываем количество товаров, глубину дерева разделов, число значимых свойств и требуемый порог TTL для агента предрасчёта. Для каталогов свыше 50 000 SKU дополнительно закладываем время на нагрузочное тестирование агента: замеряем длительность одного цикла и потребление памяти, при необходимости переводим тяжёлые проекты на batch-обработку через RabbitMQ. По итогам передаём заказчику отчёт с ключевыми метриками и рекомендуем оптимальный интервал перезапуска — обычно 4–6 часов ночью, чтобы не мешать пиковой посещаемости.
Оценим ваш проект за 1 день. Свяжитесь с нами — получите консультацию по реализации блока похожих товаров. Опыт работы с каталогами до 100 000 позиций гарантирует надёжное решение без сюрпризов.
Закажите аудит вашего каталога — мы предложим оптимальный алгоритм схожести.







