Интеграция 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 + тестирование виджетов | отдельная статья бюджета |







