Інтеграція 1С-Бітрікс з Retail Rocket

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс з Retail Rocket
Середня
~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С-Бітрікс із 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 дні