Настройка триггера брошенного просмотра товара 1С-Битрикс
Пользователь открыл карточку товара, провёл на ней 40 секунд и ушёл без добавления в корзину. Это горячий лид: интерес был, решения не приняли. Триггер брошенного просмотра фиксирует этот момент и запускает автоматизацию — письмо, push или задачу менеджеру. В Битрикс это реализуется через модуль sale совместно с триггерами маркетинговой автоматизации в CRM или через собственный агент.
Где хранятся данные о просмотрах
Модуль catalog пишет историю просмотров в таблицу b_catalog_viewed_product. Структура: USER_ID, PRODUCT_ID, SITE_ID, DATE_VISIT. Таблица обновляется при каждом хите на детальную страницу через компонент bitrix:catalog.element — внутри него вызывается CCatalogViewedProduct::Add().
Анонимные пользователи записываются с USER_ID равным FUSER_ID из b_sale_fuser — это важно: поле в таблице b_catalog_viewed_product называется USER_ID, но для гостей туда пишется fake user ID, а не реальный b_user.ID.
Определение «брошенности»
Просмотр считается брошенным, если выполнены три условия: товар был просмотрен, в течение N минут после просмотра товар не был добавлен в корзину (b_sale_basket), и пользователь не оформил заказ с этим товаром (b_sale_order_basket). Временной порог — конфигурируемый параметр, обычно 30–60 минут.
Запрос для поиска брошенных просмотров за последние 2 часа:
SELECT v.USER_ID, v.PRODUCT_ID, v.DATE_VISIT
FROM b_catalog_viewed_product v
LEFT JOIN b_sale_basket b
ON b.FUSER_ID = v.USER_ID
AND b.PRODUCT_ID = v.PRODUCT_ID
AND b.DATE_INSERT > v.DATE_VISIT
WHERE v.DATE_VISIT > NOW() - INTERVAL '2 hours'
AND b.ID IS NULL;
Реализация через агент Битрикс
Стандартный механизм — агент в b_agent, который запускается каждые 15–30 минут. Агент проверяет таблицу b_catalog_viewed_product, находит кандидатов по условиям выше, и для каждого создаёт событие в маркетинговой автоматизации или отправляет email.
function AbandonedViewAgent(): string
{
$cutoffTime = new \Bitrix\Main\Type\DateTime();
$cutoffTime->add('-60 minutes');
$thresholdTime = new \Bitrix\Main\Type\DateTime();
$thresholdTime->add('-30 minutes');
$viewed = \Bitrix\Catalog\ViewedProductTable::getList([
'filter' => [
'>=DATE_VISIT' => $cutoffTime,
'<=DATE_VISIT' => $thresholdTime,
],
'select' => ['USER_ID', 'PRODUCT_ID', 'DATE_VISIT'],
])->fetchAll();
foreach ($viewed as $row) {
// Проверяем, нет ли товара в корзине после просмотра
$inBasket = \Bitrix\Sale\BasketTable::getList([
'filter' => [
'FUSER_ID' => $row['USER_ID'],
'PRODUCT_ID' => $row['PRODUCT_ID'],
'>=DATE_INSERT' => $row['DATE_VISIT'],
],
'limit' => 1,
])->fetch();
if (!$inBasket) {
// Запускаем сценарий автоматизации
\Bitrix\Marketing\Automation\Trigger\BaseTrigger::send(
'CATALOG_ABANDONED_VIEW',
['PRODUCT_ID' => $row['PRODUCT_ID'], 'FUSER_ID' => $row['USER_ID']]
);
}
}
return 'AbandonedViewAgent();';
}
Интеграция с Marketing Automation
В модуле marketing (Битрикс24 On-Premise) триггеры создаются через интерфейс «Автоматизация → Триггеры». Для кастомного триггера нужно зарегистрировать класс-наследник \Bitrix\Marketing\Automation\Trigger\BaseTrigger и прописать его в b_marketing_trigger. Триггер принимает PRODUCT_ID и FUSER_ID, строит сегмент, и запускает сценарий рассылки.
Если Битрикс24 не используется, альтернатива — модуль subscribe: создать событие через \Bitrix\Main\Mail\Event::send() с типом письма CATALOG_ABANDONED_VIEW, в шаблоне которого подставляются данные товара из инфоблока.
Дедупликация срабатываний
Агент должен помнить, что уже обработал. Иначе каждый запуск будет заново находить те же записи. Решение: отдельная таблица bl_abandoned_view_sent с полями (fuser_id, product_id, sent_at). Перед отправкой — проверка наличия записи. Уникальный индекс на (fuser_id, product_id) защитит от дублей при параллельных запусках агента.
Что настраиваем
- Регистрацию агента
AbandonedViewAgentвb_agentс нужным интервалом - Запрос к
b_catalog_viewed_productс учётом разницы FUSER/USER для анонимов - Таблицу дедупликации
bl_abandoned_view_sent - Шаблон письма или push-уведомления с данными о просмотренном товаре
- Логику исключения пользователей, уже добавивших товар в корзину или купивших его







