Налаштування динамічних блоків на основі історії переглядів 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 не має вбудованого компонента для цього. Модуль «Персоналізація» існує в Enterprise-версії, але для більшості проектів потрібно будувати самостійно.

Cookies vs. сеанс vs. база даних

Три варіанти зберігання історії переглядів — з різними компромісами.

Cookies — найпростіше: масив ID товарів, серіалізований у cookie. Працює без бази даних, не потребує авторизації, живе до закінчення терміну cookie. Обмеження: максимум 4KB, тобто ~200–300 ID товарів. Цього достатньо для історії переглядів, але не для складної аналітики.

База даних — таблиця b_user_behavior (з попередньої задачі) або окрема b_viewed_products. Працює для авторизованих користувачів, переживає зміну пристрою, дозволяє аналізувати паттерни. Для анонімів — прив'язка до сеансу з подальшим об'єднанням.

Оптимальний підхід: cookies для негайного відображення (без запиту до БД), фоновий запис в БД для аналітики.

Запис у cookies при перегляді товару

В шаблоні catalog.element або в компоненті додайте JavaScript:

(function() {
    var elementId = <?= (int)$arResult['ID'] ?>;
    var cookieName = 'bx_viewed';
    var maxItems = 20;

    var viewed = [];
    try {
        var raw = document.cookie.match(/bx_viewed=([^;]+)/);
        if (raw) viewed = JSON.parse(decodeURIComponent(raw[1]));
    } catch(e) {}

    viewed = viewed.filter(function(id) { return id !== elementId; });
    viewed.unshift(elementId);
    if (viewed.length > maxItems) viewed = viewed.slice(0, maxItems);

    var expires = new Date(Date.now() + 30 * 24 * 3600 * 1000).toUTCString();
    document.cookie = cookieName + '=' + encodeURIComponent(JSON.stringify(viewed))
        + '; expires=' + expires + '; path=/; SameSite=Lax';
})();

Компонент відображення історії

Користувацький компонент local:catalog.viewed читає cookie на сервері та завантажує дані за ID:

// component.php
$viewed = [];
if (!empty($_COOKIE['bx_viewed'])) {
    $raw = json_decode($_COOKIE['bx_viewed'], true);
    if (is_array($raw)) {
        $viewed = array_map('intval', array_slice($raw, 0, 10));
    }
}

if (empty($viewed)) {
    $this->AbortResultCache();
    return;
}

$res = \CIBlockElement::GetList(
    [],
    ['ID' => $viewed, 'IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
    false,
    ['nTopCount' => 10],
    ['ID', 'NAME', 'PREVIEW_PICTURE', 'DETAIL_PAGE_URL', 'CATALOG_PRICE_1']
);

$items = [];
while ($el = $res->GetNextElement()) {
    $fields = $el->GetFields();
    $items[$fields['ID']] = $fields;
}

// Відновити порядок переглядів
$arResult = array_filter(array_map(fn($id) => $items[$id] ?? null, $viewed));

Компонент повинен працювати без кешу (CACHE_TYPE = 'N') або з кешем, прив'язаним до користувача/сеансу.

Виключення поточного товару

Якщо блок «Ви переглядали» розташований на карточці товару — поточний товар не повинен в ньому з'являтися. Фільтр:

$currentId = (int)$GLOBALS['arParams']['ELEMENT_ID'] ?? 0;
$viewed = array_filter($viewed, fn($id) => $id !== $currentId);

AJAX-завантаження для збереження кешу сторінки

Якщо карточка товару кешується (а вона повинна), блок «Ви переглядали» краще завантажувати окремим AJAX-запитом після рендерингу основного контенту. Це дозволяє кешувати карточку на рівні nginx (або кешу Bitrix) і при цьому показувати персональний блок кожному користувачу свій. Контролер повертає готовий HTML-фрагмент — мінімум логіки на клієнті.