Настройка отслеживания цены товара пользователем 1С-Битрикс
Отслеживание цены — это когда пользователь нажимает «Уведомить о снижении» и уходит. Через неделю цена упала — он получает письмо. Функционал несложный по логике, но требует трёх элементов: хранилища подписок, UI на странице товара и механизма сравнения цен. В стандартном Битрикс этого нет — собирается из нескольких модулей.
Таблица подписок
Создайте таблицу bl_price_tracker через \Bitrix\Main\ORM\Data\DataManager:
class PriceTrackerTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'bl_price_tracker'; }
public static function getMap(): array {
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\IntegerField('USER_ID'),
new \Bitrix\Main\ORM\Fields\StringField('EMAIL'),
new \Bitrix\Main\ORM\Fields\IntegerField('PRODUCT_ID'),
new \Bitrix\Main\ORM\Fields\FloatField('PRICE_AT_SUBSCRIBE'),
new \Bitrix\Main\ORM\Fields\FloatField('TARGET_PRICE'), // NULL = любое снижение
new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'),
new \Bitrix\Main\ORM\Fields\DatetimeField('NOTIFIED_AT'),
new \Bitrix\Main\ORM\Fields\StringField('STATUS'), // active, notified, cancelled
];
}
}
Индексы: уникальный на (USER_ID, PRODUCT_ID) — один пользователь не может подписаться на один товар дважды.
UI на странице товара
В шаблоне компонента bitrix:catalog.element (файл template.php) добавьте кнопку:
if ($USER->IsAuthorized()) {
$isTracking = PriceTrackerTable::getRow([
'filter' => ['USER_ID' => $USER->GetID(), 'PRODUCT_ID' => $arResult['ID'], 'STATUS' => 'active'],
]);
echo $isTracking
? '<button class="btn-untrack" data-id="'.$arResult['ID'].'">Отслеживается ✓</button>'
: '<button class="btn-track" data-id="'.$arResult['ID'].'">Следить за ценой</button>';
}
AJAX-обработчик добавляет или удаляет строку в bl_price_tracker. Записывайте PRICE_AT_SUBSCRIBE — текущую цену на момент подписки. Без этого нельзя определить, стала ли новая цена ниже.
Проверка снижений
Агент запускается раз в час. Логика:
- Берём все активные подписки из
bl_price_trackerсоSTATUS = active - Для каждого
PRODUCT_IDполучаем текущую цену через\Bitrix\Catalog\PriceTable::getRow(['filter' => ['PRODUCT_ID' => $id, 'CATALOG_GROUP_ID' => 1]]) - Сравниваем с
PRICE_AT_SUBSCRIBE: если новая цена < старой — отправляем уведомление - Обновляем
STATUS = notifiedиNOTIFIED_AT = NOW()
При желании снова активировать подписку после уведомления — переводите в active после N дней: добавьте в агент логику reactivation для записей, где NOTIFIED_AT < NOW() - INTERVAL '30 days'.
Страница «Мои отслеживания»
В личном кабинете пользователя добавьте раздел со списком отслеживаемых товаров. Компонент читает bl_price_tracker по USER_ID и JOIN'ит данные товара из b_iblock_element. Показывайте: название товара, цену при подписке, текущую цену, дату подписки. Кнопка «Отменить» меняет STATUS на cancelled.
Что настраиваем
- ORM-класс
PriceTrackerTableи миграцию DDL для таблицыbl_price_tracker - AJAX-контроллер подписки/отписки с проверкой авторизации
- Кнопку в шаблоне
catalog.elementс динамическим состоянием - Агент сравнения цен и отправки уведомлений
- Страницу «Мои отслеживания» в личном кабинете







