Блок совместных покупок на 1С-Битрикс: разработка и интеграция

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Блок совместных покупок на 1С-Битрикс: разработка и интеграция
Средний
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1321
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    914
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    663
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    810
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    709
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1042

Пустота на карточке товара или блок «похожие» по свойствам — конверсия падает. Покупатель не видит ценности: товары со схожими характеристиками не отражают реальное поведение. Блок совместных покупок решает задачу иначе — он опирается на статистику заказов. Такой подход даёт в 2–3 раза больше кликов и на 15–30% увеличивает средний чек. Мы реализовали его на 1С-Битрикс для десятков проектов — от каталогов в 500 товаров до маркетплейсов с миллионом позиций. Решение подходит для любой редакции: «Малый бизнес», «Бизнес» или «Энтерпрайз». Хотите оценить эффект на своём каталоге? Свяжитесь с нами — покажем демо.

Как работает блок «с этим товаром покупают»?

Логика: для каждого товара A находим все заказы, где он куплен, и смотрим, какие другие товары встречаются в тех же заказах. Чем чаще пара встречается — тем выше recommendation score. Мы используем порог в 3 совместные покупки за последние 90 дней, чтобы отсечь случайные совпадения.

Источники данных и SQL

Основная информация лежит в таблицах b_sale_order (заказы) и b_sale_basket (позиции). Запрос собирает товары, купленные вместе, за последние 90 дней — этого достаточно, чтобы ассортиментные изменения быстро отражались.

SELECT
    b2.product_id                       AS recommended_id,
    COUNT(DISTINCT b2.order_id)         AS co_purchase_count
FROM b_sale_basket b1
JOIN b_sale_order o ON b1.order_id = o.id
    AND o.canceled = 'N'
    AND o.status_id NOT IN ('F')
JOIN b_sale_basket b2 ON b1.order_id = b2.order_id
    AND b2.product_id != b1.product_id
    AND b2.product_id IS NOT NULL
WHERE
    b1.product_id = :productId
    AND o.date_insert >= DATE_SUB(NOW(), INTERVAL 90 DAY)
GROUP BY b2.product_id
HAVING co_purchase_count >= 3
ORDER BY co_purchase_count DESC
LIMIT 20;

Результаты сохраняются в отдельную таблицу custom_co_purchases с первичным ключом (product_id, recommended_id). Это позволяет делать быстрый lookup без тяжёлых запросов каждый раз. Подробнее о структуре таблиц модуля sale можно узнать в документации Битрикс.

Предрасчёт через агент

Запускать такой SQL при каждом просмотре карточки — убийственно для производительности. Поэтому мы делаем предрасчёт для топ-500 товаров с помощью агента, который запускается ночью.

// Агент в local/php_interface/init.php
function RecalcCoPurchasesAgent(): string {
    $topProducts = getTopSellingProducts(500);
    foreach ($topProducts as $productId) {
        $recs = calcCoPurchases($productId);
        saveToCoPurchases($productId, $recs);
    }
    return 'RecalcCoPurchasesAgent();';
}

Агент пересчитывает данные для селлера раз в сутки. Для не топовых товаров используем fallback.

Компонент с тегированным кешированием

Вывод блока реализован через компонент company:catalog.co_purchases. Компонент использует тегированный кеш, чтобы страницы карточек не пересчитывались при каждом открытии. Кэш привязывается к тегу co_purchases, что позволяет сбрасывать его при изменении заказов.

// component.php
if (!\Bitrix\Main\Loader::includeModule('iblock') || !\Bitrix\Main\Loader::includeModule('catalog')) {
    return;
}

$productId = (int)$arParams['PRODUCT_ID'];
$limit     = (int)($arParams['LIMIT'] ?? 8);

$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache(3600, "co_purchases_{$productId}_{$limit}", '/co_purchases')) {
    $arResult = $cache->getVars();
} elseif ($cache->startDataCache()) {
    $cache->registerTag('co_purchases');
    $recommendedIds = getFromCoPurchasesTable($productId, $limit);
    $arResult       = getProductsByIds($recommendedIds);
    $cache->endDataCache($arResult);
}

$this->IncludeComponentTemplate();

Фильтрация и cold start

Перед отображением рекомендации проходят фильтр: только активные товары с ненулевым остатком. Если для товара мало данных (новый товар или магазин только запущен), используем content-based fallback — показываем товары из той же категории. Это решает проблему cold start.

function getRecommendations(int $productId, int $limit): array {
    $coPurchases = getFromCoPurchasesTable($productId, $limit);

    if (count($coPurchases) >= $limit) {
        return $coPurchases;
    }

    $needed    = $limit - count($coPurchases);
    $exclude   = array_merge([$productId], $coPurchases);
    $categoryFill = getSameCategoryProducts($productId, $needed, $exclude);

    return array_merge($coPurchases, $categoryFill);
}

Блок в корзине

Этот же механизм можно применить для корзины: показать «к товарам в вашей корзине часто покупают». Берём все товары из корзины, собираем их рекомендации, суммируем score и исключаем уже добавленные.

$basketItems = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId());
$basketIds   = [];
foreach ($basketItems as $item) {
    $basketIds[] = $item->getProductId();
}

$allRecs = [];
foreach ($basketIds as $id) {
    $recs = getFromCoPurchasesTable($id, 20);
    foreach ($recs as $rec) {
        $allRecs[$rec['recommended_id']] = ($allRecs[$rec['recommended_id']] ?? 0) + $rec['score'];
    }
}

foreach ($basketIds as $id) unset($allRecs[$id]);
arsort($allRecs);
$topRecs = array_slice(array_keys($allRecs), 0, 8);

Почему совместные покупки эффективнее похожих товаров?

Сравнение подходов в таблице ниже. Блок совместных покупок опирается на реальное поведение покупателей, а не на формальные свойства. Мы гарантируем стабильную работу на любых версиях Битрикс (начиная с 17.0) и предоставляем гарантию на код.

Метод Источник Конверсия Производительность
Похожие по свойствам Инфоблок Средняя Высокая
Совместные покупки (наш) Заказы Высокая (в 2-3 раза выше) Средняя (с кешем)
Random Нет Низкая Высокая

Рекомендуем проводить A/B тест: на половине трафика показывать совместные покупки, на другой — стандартные рекомендации. В 80% проектов блок совместных покупок выигрывает по CTR на 30–50%.

Что входит в работу?

  1. Анализ текущих заказов и структуры данных
  2. SQL-запрос с оптимизацией под ваш объём
  3. Разработка агента предрасчёта
  4. Компонент с кешированием и fallback
  5. Интеграция блока в корзину
  6. Документация по развертыванию и настройке
  7. Консультации после релиза

Сроки разработки

Этап Срок
Анализ и проектирование 1 день
SQL и агент 2 дня
Компонент и кеширование 2–3 дня
Fallback и холодный старт 1 день
Интеграция в корзину 1 день
Тестирование и документация 2 дня
Итого 1–1.5 недели

Пример расчёта: при увеличении среднего чека на 20% дополнительная выручка с каждых 1000 посетителей существенно растёт. За год на трафике 10 000 посетителей в месяц это даёт значительный прирост.

Закажите разработку блока «с этим товаром покупают» — получите готовый компонент с документацией и консультацию после релиза. Свяжитесь с нами для оценки вашего проекта.