Настройка персонализации контента по поведению пользователя 1С-Битрикс

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

Персонализация в Битриксе чаще всего понимается как «показать баннер пользователям из Москвы». Это геотаргетинг, не персонализация. Поведенческая персонализация — это когда пользователь, который три раза смотрел ноутбуки, видит на главной странице блок с ноутбуками, а не случайный акционный баннер. Реализовать это в Битриксе без внешних платформ — задача решаемая, но требует понимания, где хранить поведенческий профиль.

Хранение поведенческого профиля пользователя

Для авторизованных пользователей данные хранятся в 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 вызывается с фильтром по этим разделам.

Кеширование персонального контента

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

Второй вариант лучше для производительности: страница грузится из кеша мгновенно, персональный блок подтягивается отдельным запросом после рендеринга.