Налаштування сповіщення «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-компонент з періодичним оновленням лічильника
- Агент для очищення застарілих записів
- Вивід блоку з правильними умовами (поріг, відмінювання)







