Налаштування персоналізації контенту з поведінки користувача 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування персоналізації контенту з поведінки користувача 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • 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С-Bitrix

Персоналізація в Bitrix часто розуміється як «показати банер користувачам з Москви». Це геотаргетинг, а не персоналізація. Поведінкова персоналізація — це коли користувач, який три рази переглядав ноутбуки, бачить на головній сторінці блок з ноутбуками, а не випадковий акційний банер. Реалізувати це в Bitrix без зовнішніх платформ — завдання розв'язне, але потребує розуміння, де зберігати поведінковий профіль.

Збереження поведінкового профілю користувача

Для авторизованих користувачів дані зберігаються в b_user_field (UF-поля користувача) або в окремій таблиці. UF-поля зручні, але обмежені — вони не розраховані на JSON-блоби з історією переглядів. Найкраще рішення — користувацька таблиця, наприклад b_user_behavior:

CREATE TABLE b_user_behavior (
    ID          SERIAL PRIMARY KEY,
    USER_ID     INT NOT NULL,
    SESSION_ID  VARCHAR(64),
    EVENT_TYPE  VARCHAR(32) NOT NULL,  -- 'view', 'cart', 'search'
    ENTITY_TYPE VARCHAR(32),           -- 'catalog_element', 'section'
    ENTITY_ID   INT,
    VALUE       TEXT,
    DATE_CREATE TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_ubehav_user ON b_user_behavior(USER_ID, EVENT_TYPE, DATE_CREATE DESC);

Для анонімних користувачів — прив'язка до SESSION_ID. При авторизації сеансовий профіль об'єднується з користувацьким через обробник події OnAfterUserAuthorize.

Запис подій через AJAX

Кожна значима дія (перегляд карточки товару, додавання в корзину, пошуковий запит) записується асинхронно. В шаблоні catalog.element в кінці сторінки:

fetch('/local/ajax/behavior.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest'},
    body: JSON.stringify({
        event: 'view',
        entity_type: 'catalog_element',
        entity_id: <?= (int)$arResult['ID'] ?>,
        session_id: '<?= session_id() ?>'
    })
});

Файл behavior.php — контролер на D7 (Bitrix\Main\Engine\Controller), який валідує вхідні дані та пише в b_user_behavior. Важливо: запис повинен бути неблокуючим — жодних синхронних операцій з БД в основному потоці.

Використання профілю для відображення контенту

Компонент головної сторінки читає профіль поточного користувача та підбирає контент. Логіка пріоритетів:

  1. Категорії з найбільшою кількістю переглядів за останні 30 днів
  2. Товари, які додавалися в корзину, але не були придбані
  3. Пошукові запити без результату покупки
$userId = $GLOBALS['USER']->GetID();
$topCategories = [];

if ($userId) {
    $res = $DB->Query("
        SELECT ENTITY_ID, COUNT(*) as cnt
        FROM b_user_behavior
        WHERE USER_ID = {$userId}
          AND EVENT_TYPE = 'view'
          AND ENTITY_TYPE = 'section'
          AND DATE_CREATE > NOW() - INTERVAL 30 DAY
        GROUP BY ENTITY_ID
        ORDER BY cnt DESC
        LIMIT 3
    ");
    while ($row = $res->Fetch()) {
        $topCategories[] = (int)$row['ENTITY_ID'];
    }
}

Потім компонент bitrix:catalog.section або bitrix:catalog викликається з фільтром за цими розділами.

Кеширування персоналізованого контенту

Персоналізований контент не можна кешувати стандартним кешем Bitrix — блок унікальний для кожного користувача. Вихід: компонент з CACHE_TYPE = 'N' тільки для персоналізованого блока, решта сторінки кешується звичайно. Або використовувати bitrix:main.include з AJAX-завантаженням персонального блока вже після завантаження сторінки.

Другий варіант краще для продуктивності: сторінка завантажується з кешу миттєво, персональний блок витягується окремим запитом після рендерингу.