Настройка динамических блоков на основе истории просмотров 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С-Битрикс

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

Куки vs. сессия vs. база данных

Три варианта хранения истории просмотров — с разными компромиссами.

Куки — самое простое: массив ID товаров, сериализованный в cookie. Работает без базы данных, не требует авторизации, живёт до истечения срока куки. Ограничение: максимум 4KB, то есть ~200–300 ID товаров. Этого достаточно для истории просмотров, но не для сложной аналитики.

База данных — таблица b_user_behavior (из предыдущей задачи) или отдельная b_viewed_products. Работает для авторизованных пользователей, переживает смену устройства, позволяет анализировать паттерны. Для анонимов — привязка к сессии с последующим мержем.

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

Запись в куки при просмотре товара

В шаблоне 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 (или кеша Битрикса) и при этом показывать персональный блок каждому пользователю свой. Контроллер возвращает готовый HTML-фрагмент — минимум логики на клиенте.