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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с Dynamic Yield
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • 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С-Битрикс с Dynamic Yield

Dynamic Yield — enterprise-платформа персонализации от Mastercard, конкурент Adobe Target и Optimizely. Используется крупными ритейлерами для A/B-тестирования, персонализации контента и рекомендаций в реальном времени. Интеграция с Битрикс строится на двух слоях: Data Feed для синхронизации каталога и Experience OS JavaScript SDK для передачи поведенческих событий.

Data Feed: синхронизация каталога

Dynamic Yield принимает фид продуктов в формате JSON или CSV. JSON-фид гибче — позволяет передавать произвольные атрибуты для сегментации.

Структура JSON-фида:

{
  "version": "1.0",
  "type": "full",
  "products": [
    {
      "sku": "PROD-001",
      "name": "Название товара",
      "url": "https://example.ru/catalog/product/",
      "price": 1500.00,
      "in_stock": true,
      "image_url": "https://example.ru/upload/iblock/abc/photo.jpg",
      "categories": ["Электроника", "Смартфоны"],
      "group_id": "GROUP-001",
      "description": "Краткое описание товара",
      "brand": "Samsung",
      "keywords": ["смартфон", "android"],
      "custom_attributes": {
        "color": "Black",
        "weight": "185g",
        "supplier_id": 42
      }
    }
  ]
}

Генератор фида в Битрикс:

function generateDynamicYieldFeed(): string
{
    $products = [];

    $res = CIBlockElement::GetList(
        [],
        ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
        false,
        false,
        ['ID', 'NAME', 'DETAIL_PAGE_URL', 'DETAIL_PICTURE',
         'PREVIEW_TEXT', 'IBLOCK_SECTION_ID']
    );

    while ($el = $res->GetNextElement()) {
        $fields = $el->GetFields();
        $props  = $el->GetProperties();

        $price     = CCatalogProduct::GetOptimalPrice($fields['ID']);
        $priceVal  = (float)($price['PRICE']['PRICE'] ?? 0);

        $quantity  = (int)(CCatalogProduct::GetByIDEx($fields['ID'])['QUANTITY'] ?? 0);
        $inStock   = $quantity > 0;

        $imgUrl = '';
        if ($fields['DETAIL_PICTURE']) {
            $f = CFile::GetFileArray($fields['DETAIL_PICTURE']);
            if ($f) $imgUrl = 'https://' . SITE_SERVER_NAME . $f['SRC'];
        }

        $section   = CIBlockSection::GetByID($fields['IBLOCK_SECTION_ID'])->Fetch();
        $categories = $section ? [$section['NAME']] : [];

        $product = [
            'sku'        => $props['CML2_ARTICLE']['VALUE'] ?? (string)$fields['ID'],
            'name'       => $fields['NAME'],
            'url'        => 'https://' . SITE_SERVER_NAME . $fields['DETAIL_PAGE_URL'],
            'price'      => $priceVal,
            'in_stock'   => $inStock,
            'image_url'  => $imgUrl,
            'categories' => $categories,
            'description'=> strip_tags($fields['PREVIEW_TEXT'] ?? ''),
        ];

        // Добавляем дополнительные атрибуты из свойств
        $customAttrs = [];
        foreach (['BRAND', 'COLOR', 'WEIGHT'] as $propCode) {
            if (!empty($props[$propCode]['VALUE'])) {
                $customAttrs[strtolower($propCode)] = $props[$propCode]['VALUE'];
            }
        }
        if ($customAttrs) {
            $product['custom_attributes'] = $customAttrs;
        }

        $products[] = $product;
    }

    return json_encode([
        'version'  => '1.0',
        'type'     => 'full',
        'products' => $products,
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

Фид публикуется по URL и указывается в Dynamic Yield → Feeds. Рекомендуемая частота обновления — ежедневно; при частых изменениях цен — несколько раз в день через агент.

JavaScript SDK: события поведения

Dynamic Yield требует инициализации на каждой странице:

window.DY = window.DY || {};
DY.recommendationContext = { type: 'HOMEPAGE' }; // переопределяется на каждом типе страниц

(function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = '//cdn.dynamicyield.com/api/<?= DY_SITE_ID ?>/api_dynamic.js';
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'DY-api-script'));

DY_SITE_ID — идентификатор из личного кабинета Dynamic Yield.

Контекст страницы — Dynamic Yield персонализирует контент по типу страницы:

// В шаблоне карточки товара
?>
<script>
window.DY = window.DY || {};
DY.recommendationContext = {
    type: 'PRODUCT',
    data: ['<?= $arResult['ID'] ?>']  // SKU текущего товара
};
</script>
<?php

// В шаблоне категории
?>
<script>
DY.recommendationContext = {
    type: 'CATEGORY',
    data: ['<?= $sectionCode ?>']
};
</script>
<?php

Событие добавления в корзину:

DY.API('event', {
    name: 'Add to Cart',
    properties: {
        dyType: 'add-to-cart-v1',
        value: price * quantity,
        currency: 'RUB',
        productId: String(productId),
        quantity: quantity,
        cart: currentCartItems.map(function(item) {
            return { productId: String(item.id), quantity: item.qty, itemPrice: item.price };
        })
    }
});

Событие завершения заказа:

DY.API('event', {
    name: 'Purchase',
    properties: {
        dyType: 'purchase-v1',
        uniqueTransactionId: String(orderId),
        value: orderTotal,
        currency: 'RUB',
        cart: orderItems.map(function(item) {
            return { productId: String(item.product_id), quantity: item.quantity, itemPrice: item.price };
        })
    }
});

Данные для этого события передаются через data-атрибуты HTML или через inline-переменные PHP на странице «Спасибо за заказ».

Идентификация пользователя

Dynamic Yield связывает анонимные и авторизованные сессии. При авторизации вызываем:

DY.API('event', {
    name: 'Login',
    properties: {
        dyType: 'login-v1',
        hashedEmail: sha256(userEmail.toLowerCase().trim())
    }
});

Хеш SHA-256 email вычисляется на клиенте. Dynamic Yield не принимает email в открытом виде.

Widgets: блоки рекомендаций

Dynamic Yield отображает персонализированные блоки через «виджеты» — конфигурируются в личном кабинете. На стороне Битрикс — только HTML-контейнер с ID:

<!-- В шаблоне карточки товара: "Вам может понравиться" -->
<div class="dy-recommendations" id="dy-widget-product-page"></div>

<!-- На главной: "Персональные рекомендации" -->
<div class="dy-recommendations" id="dy-widget-homepage"></div>

Dynamic Yield сам заполняет эти контейнеры рекомендациями на основе поведения пользователя.

Сроки реализации

Объём Состав Срок
Фид + базовый SDK (контекст + корзина + покупка) Генератор фида + JS-события 2–4 дня
Идентификация + все типы страниц + хешированный email + контексты +1–2 дня
A/B-тесты + сегменты + виджеты Настройка в DY + тестирование виджетов отдельная статья бюджета