Настройка отображения количества просмотров товара 1С-Битрикс
Счётчик просмотров на карточке товара создаёт эффект популярности. В отличие от покупок, просмотры накапливаются быстрее — даже у нового товара через несколько дней появляются реальные цифры. Битрикс не ведёт счётчик просмотров по товарам по умолчанию, но предоставляет инструменты для его реализации.
Встроенный модуль статистики
Модуль statistic ведёт таблицу b_stat_page_hit — каждое обращение к странице пишется туда с полем PATH (URI страницы). Из этой таблицы можно получить количество просмотров детальной страницы товара по её URL. Но это тяжёлый способ: таблица растёт быстро, запросы к ней медленные, и модуль статистики часто отключён на нагруженных сайтах.
Собственный счётчик просмотров
Правильный подход — хранить счётчик прямо в свойстве инфоблока. Создаётся числовое свойство VIEW_COUNT в b_iblock_property. При каждом открытии детальной страницы товара обработчик события инкрементирует значение.
Событие срабатывает в компоненте bitrix:catalog.element, в component_epilog.php:
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
$elementId = $arResult["ID"];
$iblockId = $arResult["IBLOCK_ID"];
$currentCount = (int)$arResult["PROPERTIES"]["VIEW_COUNT"]["VALUE"];
CIBlockElement::SetPropertyValuesEx(
$elementId,
$iblockId,
["VIEW_COUNT" => $currentCount + 1]
);
Запись в component_epilog.php не блокирует отрисовку страницы — выполняется после отправки ответа клиенту (при использовании ob_flush/flush или встроенных механизмов Битрикс).
Проблема ботов и повторных просмотров
Без фильтрации счётчик накрутят поисковые роботы. Минимальная защита — не считать просмотры, если:
- В
$_SERVER['HTTP_USER_AGENT']есть признаки бота (Googlebot, YandexBot, Bingbot) - IP-адрес посетителя уже смотрел этот товар за последние N минут
Для фильтрации повторов используется сессия: $_SESSION['viewed_products'][$elementId] = time(). Если запись есть и прошло менее 30 минут — счётчик не инкрементируется.
Кэширование и производительность
Если детальная страница кэшируется (а она должна кэшироваться), component_epilog.php вызывается при каждом просмотре, даже если основной контент взят из кэша. Это именно то поведение, которое нужно — счётчик работает независимо от кэша страницы.
При высокой нагрузке (>100 просмотров в минуту на один товар) прямая запись в b_iblock_element_prop создаёт конкурентные обновления одной строки. Решение: инкремент через атомарный UPDATE:
$DB->Query("UPDATE b_iblock_element_prop_s{$iblockId}
SET PROPERTY_VIEW_COUNT = COALESCE(PROPERTY_VIEW_COUNT, 0) + 1
WHERE IBLOCK_ELEMENT_ID = " . intval($elementId));
Название колонки зависит от ID свойства — генерируется Битрикс автоматически при создании свойства.
Вывод счётчика
В шаблоне bitrix:catalog.element добавляется вывод значения свойства:
$viewCount = (int)$arResult["PROPERTIES"]["VIEW_COUNT"]["VALUE"];
echo '<span>' . $viewCount . ' просмотров</span>';
Значение выводится с правильным склонением: «просмотр», «просмотра», «просмотров» в зависимости от числа.
Что входит в настройку
- Создание свойства
VIEW_COUNTв инфоблоке каталога - Добавление обработчика в
component_epilog.phpс фильтрацией ботов - Реализация защиты от повторного счёта через сессию
- Атомарный INCREMENT для нагруженных магазинов
- Вывод счётчика с правильными окончаниями в шаблоне карточки







