Розробка системи рекомендацій товарів 1С-Бітрікс

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

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка системи рекомендацій товарів 1С-Бітрікс

Система рекомендацій — це рушій, який вирішує задачу: який товар показати конкретному користувачеві в конкретний момент, щоб збільшити імовірність покупки. Вбудований інструментарій Бітрікс пропонує лише ручне налаштування зв'язків між товарами. Повноцінна система рекомендацій — це окрема розробка з аналізом поведінкових даних.

Алгоритми рекомендацій

Вибір алгоритму залежить від обсягу даних і вимог до якості:

Content-based filtering (на основі властивостей товарів). Рекомендуємо товари, схожі за характеристиками: та сама категорія, близький ціновий діапазон, спільні теги. Працює без історії покупок, підходить для нових користувачів.

function getContentBasedRecommendations(int $productId, int $limit = 10): array {
    $product  = \CIBlockElement::GetByID($productId)->GetNext();
    $iblockId = $product['IBLOCK_ID'];
    $price    = \CPrice::GetBasePrice($productId)['PRICE'];
    $sectionId = $product['IBLOCK_SECTION_ID'];

    // Товари з тієї самої категорії в ціновому діапазоні ±30%
    $result = \CIBlockElement::GetList(
        ['RAND' => 'ASC'],
        [
            'IBLOCK_ID'          => $iblockId,
            'IBLOCK_SECTION_ID'  => $sectionId,
            '!ID'                => $productId,
            '>=CATALOG_PRICE_1'  => $price * 0.7,
            '<=CATALOG_PRICE_1'  => $price * 1.3,
            'ACTIVE'             => 'Y',
        ],
        false,
        ['nPageSize' => $limit],
        ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE']
    );

    $items = [];
    while ($item = $result->GetNext()) {
        $items[] = $item;
    }
    return $items;
}

Collaborative filtering (колаборативна фільтрація). «Користувачі, які переглядали цей товар, також переглядали...» Потребує накопиченої історії переглядів і покупок.

Дані для колаборативної фільтрації збираємо з:

  • b_sale_basket і b_sale_order — реальні покупки.
  • Кастомна таблиця custom_product_views — перегляди карток.
  • b_sale_fuser — гостьові користувачі.

Матрична факторизація (ALS/SVD). Просунутий алгоритм, потребує бібліотек (Python: implicit, surprise). Виносимо розрахунок рекомендацій в окремий мікросервіс на Python, результати зберігаємо в Redis/PostgreSQL, Бітрікс лише читає.

Збір поведінкових даних

// Трекінг перегляду товару
// Викликається в шаблоні компонента catalog.element
$userId  = $USER->GetID() ?: 0;
$fuserId = (int)\Bitrix\Sale\Fuser::getId();

$db->query("
    INSERT INTO custom_product_views (product_id, user_id, fuser_id, viewed_at)
    VALUES (?, ?, ?, NOW())
    ON DUPLICATE KEY UPDATE view_count = view_count + 1, viewed_at = NOW()
", [$productId, $userId, $fuserId]);
CREATE TABLE custom_product_views (
    id         SERIAL PRIMARY KEY,
    product_id INT NOT NULL,
    user_id    INT DEFAULT 0,
    fuser_id   INT NOT NULL,
    view_count INT DEFAULT 1,
    viewed_at  DATETIME,
    UNIQUE KEY uk_product_fuser (product_id, fuser_id),
    INDEX idx_fuser (fuser_id),
    INDEX idx_product (product_id)
);

Розрахунок «користувачі також переглядали»

-- Товари, які найчастіше переглядають разом із товаром $productId
SELECT
    v2.product_id,
    COUNT(DISTINCT v2.fuser_id) AS co_views
FROM custom_product_views v1
JOIN custom_product_views v2
    ON v1.fuser_id = v2.fuser_id
    AND v2.product_id != v1.product_id
    AND v2.viewed_at BETWEEN DATE_SUB(v1.viewed_at, INTERVAL 1 HOUR)
                         AND DATE_ADD(v1.viewed_at, INTERVAL 1 HOUR)
WHERE v1.product_id = :productId
GROUP BY v2.product_id
ORDER BY co_views DESC
LIMIT 20;

Результати кешуються в Redis на 6–24 години. Перераховуються агентом Бітрікс вночі по всіх популярних товарах.

Персоналізація для авторизованого користувача

Для авторизованих користувачів дивимося на історію переглядів за останні 30 днів:

function getPersonalizedRecommendations(int $userId, int $limit = 12): array {
    // Останні переглянуті категорії користувача
    $recentCategories = getRecentUserCategories($userId, 5);

    // Товари з цих категорій, які він ще не переглядав
    return \CIBlockElement::GetList(
        ['CATALOG_PRICE_1' => 'ASC'],
        [
            'IBLOCK_ID'         => CATALOG_IBLOCK_ID,
            'IBLOCK_SECTION_ID' => $recentCategories,
            '!ID'               => getViewedProductIds($userId),
            'ACTIVE'            => 'Y',
        ],
        false,
        ['nPageSize' => $limit],
        ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE']
    );
}

Адміністративне управління рекомендаціями

Система дозволяє:

  • Переглядати статистику кліків по рекомендаціях (CTR кожного алгоритму).
  • Додавати ручні рекомендації (пінкоди) для окремих товарів.
  • Виключати товари з рекомендацій (розпродані, сезонні).
  • A/B тестувати алгоритми: половина користувачів бачить content-based, половина — collaborative.

Терміни

Компонент Термін
Збір даних про перегляди та покупки 2–3 дні
Content-based рекомендації 2–3 дні
Collaborative filtering (SQL-підхід) 3–5 днів
Кешування + агент перерахунку 1–2 дні
Персоналізація для авторизованих 2–3 дні
Адміністративна панель + A/B тест 3–4 дні
Тестування 2–3 дні

Разом: 2.5–3.5 тижні для повної системи. Content-based рекомендації без персоналізації — 1 тиждень.