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







