Настройка уведомления «N человек смотрят этот товар» 1С-Битрикс
Уведомление о количестве одновременных просмотров создаёт ощущение дефицита и срочности. «Сейчас смотрят 12 человек» подталкивает к решению о покупке. Ключевое слово здесь — «сейчас»: данные должны отражать активность в реальном времени, а не накопленную статистику.
Как определить «сейчас смотрят»
Понятие «смотрит прямо сейчас» — условное. На практике считают пользователей, открывших страницу товара за последние 2–15 минут (магазин выбирает окно самостоятельно). Типичный выбор: 5–10 минут.
Для хранения активных просмотров используется одна из двух стратегий:
Вариант 1 — таблица в MySQL/PostgreSQL. Создаётся таблица bl_product_viewers:
CREATE TABLE bl_product_viewers (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
session_id VARCHAR(64) NOT NULL,
last_seen DATETIME NOT NULL,
INDEX idx_product_time (product_id, last_seen)
);
При каждом просмотре вставляется или обновляется запись по (product_id, session_id). Для подсчёта: SELECT COUNT(DISTINCT session_id) WHERE product_id = ? AND last_seen > NOW() - INTERVAL 5 MINUTE. Агент раз в 10 минут чистит устаревшие записи.
Вариант 2 — Redis. Ключ viewers:product:{id} — это sorted set, где score = timestamp последнего визита, member = session_id. Подсчёт: ZCOUNT viewers:product:123 (NOW-300) +inf. Устаревшие записи удаляются через ZREMRANGEBYSCORE. Это быстрее и не нагружает БД, но требует Redis на сервере.
Реализация на стороне Битрикс
В component_epilog.php детальной страницы товара записывается визит:
$productId = $arResult["ID"];
$sessionId = session_id();
$now = date("Y-m-d H:i:s");
$DB->Query("INSERT INTO bl_product_viewers (product_id, session_id, last_seen)
VALUES (" . intval($productId) . ", '" . $DB->ForSql($sessionId) . "', '" . $now . "')
ON DUPLICATE KEY UPDATE last_seen = '" . $now . "'");
Подсчёт активных просмотров выносится в отдельный AJAX-контроллер — не стоит делать SELECT в epilog, иначе каждый запрос страницы будет тормозить на чтении.
AJAX-обновление счётчика
Счётчик обновляется на клиенте без перезагрузки страницы. JavaScript-компонент делает запрос каждые 30–60 секунд:
setInterval(() => {
fetch('/ajax/product-viewers/?id=' + productId)
.then(r => r.json())
.then(data => {
if (data.count > 1) {
document.querySelector('.viewers-count').textContent =
'Сейчас смотрят: ' + data.count;
}
});
}, 30000);
AJAX-обработчик в Битрикс регистрируется через CModule::AddAutoloadClasses() или как отдельный PHP-файл с включением ядра через require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'.
Защита от нереалистичных цифр
Минимальный порог вывода — 2 или 3 человека. Показывать «1 человек смотрит этот товар» бессмысленно и выглядит неправдоподобно. Максимальный порог — если цифра кажется неправдоподобно большой (например, 500 человек), можно ввести мягкий кэп или рандомизацию в допустимом диапазоне.
Ботов из подсчёта исключают по тому же принципу, что и в счётчике просмотров: проверка User-Agent в component_epilog.php перед записью в таблицу.
Что входит в настройку
- Создание таблицы
bl_product_viewers(или настройка Redis-ключей) - Запись визитов в
component_epilog.phpс фильтрацией ботов - AJAX-контроллер для получения актуального количества просмотров
- JavaScript-компонент с периодическим обновлением счётчика
- Агент для очистки устаревших записей
- Вывод блока с правильными условиями (порог, склонение)







