Інтеграція 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 + тестування віджетів | окремий рядок бюджету |







