Розробка системи рекомендацій товарів 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 тиждень.







