Интеграция 1С-Битрикс с Retail Rocket
Retail Rocket — платформа персонализации для e-commerce: рекомендации товаров, персональные email-рассылки, поведенческая аналитика. Техническая интеграция состоит из двух частей: передача данных о поведении пользователей через JavaScript-трекер и синхронизация каталога товаров через XML-фид.
XML-фид товаров
Retail Rocket принимает товарный фид в формате Яндекс.Маркет YML или в собственном XML-формате. Проще всего использовать уже сгенерированный YML-фид Битрикс — если он уже есть для Яндекс.Маркета, он подойдёт и для Retail Rocket.
Если фид нужен отдельный (с дополнительными полями для сегментации), генерируем через компонент или агент:
// Минимальная структура для Retail Rocket
function generateRetailRocketFeed(): string
{
$xml = '<?xml version="1.0" encoding="UTF-8"?><yml_catalog>';
$xml .= '<shop><name>' . htmlspecialchars(SITE_NAME) . '</name>';
$xml .= '<url>https://' . SITE_SERVER_NAME . '</url>';
$xml .= '<currencies><currency id="RUB" rate="1"/></currencies>';
$xml .= '<categories>';
// Категории
$sections = CIBlockSection::GetList(
['LEFT_MARGIN' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
['ID', 'NAME', 'IBLOCK_SECTION_ID']
);
while ($section = $sections->GetNext()) {
$parentAttr = $section['IBLOCK_SECTION_ID']
? ' parentId="' . $section['IBLOCK_SECTION_ID'] . '"'
: '';
$xml .= '<category id="' . $section['ID'] . '"' . $parentAttr . '>'
. htmlspecialchars($section['NAME']) . '</category>';
}
$xml .= '</categories>';
$xml .= '<offers>';
// Товары
$res = CIBlockElement::GetList(
[],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE', 'DETAIL_PICTURE',
'PREVIEW_TEXT', 'IBLOCK_SECTION_ID']
);
while ($el = $res->GetNextElement()) {
$fields = $el->GetFields();
$props = $el->GetProperties();
$price = CCatalogProduct::GetOptimalPrice($fields['ID']);
$priceVal = $price['PRICE']['PRICE'] ?? 0;
$imgId = $fields['DETAIL_PICTURE'] ?: $fields['PREVIEW_PICTURE'];
$imgUrl = '';
if ($imgId) {
$imgUrl = 'https://' . SITE_SERVER_NAME . CFile::GetPath($imgId);
}
$url = 'https://' . SITE_SERVER_NAME . $fields['DETAIL_PAGE_URL'];
$xml .= '<offer id="' . $fields['ID'] . '" available="true">';
$xml .= '<url>' . htmlspecialchars($url) . '</url>';
$xml .= '<price>' . number_format($priceVal, 2, '.', '') . '</price>';
$xml .= '<currencyId>RUB</currencyId>';
$xml .= '<categoryId>' . $fields['IBLOCK_SECTION_ID'] . '</categoryId>';
if ($imgUrl) {
$xml .= '<picture>' . htmlspecialchars($imgUrl) . '</picture>';
}
$xml .= '<name>' . htmlspecialchars($fields['NAME']) . '</name>';
if ($fields['PREVIEW_TEXT']) {
$xml .= '<description><![CDATA['
. strip_tags($fields['PREVIEW_TEXT']) . ']]></description>';
}
// Артикул для связи с заказами
$sku = $props['CML2_ARTICLE']['VALUE'] ?? $fields['ID'];
$xml .= '<param name="sku">' . htmlspecialchars($sku) . '</param>';
$xml .= '</offer>';
}
$xml .= '</offers></shop></yml_catalog>';
return $xml;
}
Фид кешируется на 2–4 часа и обновляется инвалидацией при изменении товара. URL фида передаётся в личном кабинете Retail Rocket.
JavaScript-трекер: события
Retail Rocket предоставляет JS-библиотеку (rrpushdown), которую подключают на все страницы. В шаблоне Битрикс — в footer.php или через addExternalJs:
// Базовый код Retail Rocket (вставляется один раз)
var retailrocket = window.retailrocket || [];
(function(d, w) {
var rr = d.createElement('script');
rr.type = 'text/javascript';
rr.src = '//cdn.retailrocket.net/content/javascript/tracking.js';
d.head.appendChild(rr);
})(document, window);
Событие просмотра карточки товара. В шаблоне catalog.element:
// template.php
$productId = $arResult['ID'];
?>
<script>
retailrocket.push(['setAccountId', '<?= RETAIL_ROCKET_ACCOUNT_ID ?>']);
retailrocket.push(['track', 'view', { productId: '<?= $productId ?>' }]);
</script>
Событие добавления в корзину. В обработчике AJAX-добавления:
// При успешном добавлении товара в корзину
retailrocket.push(['track', 'addToBasket', {
productId: String(productId),
quantity: qty
}]);
Событие оформления заказа. В шаблоне страницы «Спасибо за заказ» или через обработчик события OnSaleOrderSaved:
// В шаблоне страницы подтверждения заказа
$orderId = $arOrder['ID'];
$orderPrice = $arOrder['PRICE'];
$items = []; // Массив позиций заказа
foreach ($arOrder['BASKET'] as $item) {
$items[] = [
'id' => $item['PRODUCT_ID'],
'qnt' => $item['QUANTITY'],
'price' => $item['PRICE'],
];
}
?>
<script>
retailrocket.push(['track', 'transaction', {
transaction: '<?= $orderId ?>',
revenue: <?= $orderPrice ?>,
lineItems: <?= json_encode($items) ?>
}]);
</script>
Событие поиска:
retailrocket.push(['track', 'search', { searchPhrase: searchQuery }]);
Блоки рекомендаций
Retail Rocket отдаёт готовые виджеты с рекомендациями. После настройки в личном кабинете — вставка блоков в шаблоны:
<!-- На главной странице: «Рекомендуем» -->
<div data-retailrocket-markup-block="5f4a3b2c1d0e9f8e7d6c5b4a"
data-algorithm="popular">
</div>
<!-- В карточке товара: «С этим покупают» -->
<div data-retailrocket-markup-block="5f4a3b2c1d0e9f8e7d6c5b4b"
data-algorithm="related"
data-item-id="<?= $arResult['ID'] ?>">
</div>
<!-- В корзине: «Вам может понравиться» -->
<div data-retailrocket-markup-block="5f4a3b2c1d0e9f8e7d6c5b4c"
data-algorithm="basket">
</div>
Виджеты рендерятся на стороне Retail Rocket — они подгружают список ID товаров и запрашивают данные для отображения из вашего каталога через JS.
Пользователь и авторизация
Для связи поведения с профилем пользователя передаём email при входе:
// В обработчике успешной авторизации
if ($USER->IsAuthorized()) {
$email = $USER->GetEmail();
?>
<script>
retailrocket.push(['setEmail', '<?= htmlspecialchars($email) ?>',
function() { console.log('RR email set'); }
]);
</script>
<?php } ?>
Сроки реализации
| Объём | Состав | Срок |
|---|---|---|
| Базовая интеграция (фид + трекер) | Фид + 3 события + подключение скрипта | 1–2 дня |
| Полная интеграция (все события + блоки рекомендаций) | + виджеты + email-событие + A/B тест | 3–5 дней |
| Персонализированные рассылки | + триггерные сценарии через Retail Rocket Email | добавить 2–3 дня |







