Интеграция 1С-Битрикс с Retail Rocket

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с Retail Rocket
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция 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 дня