Настройка отслеживания цены товара пользователем 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка отслеживания цены товара пользователем 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка отслеживания цены товара пользователем 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 — текущую цену на момент подписки. Без этого нельзя определить, стала ли новая цена ниже.

Проверка снижений

Агент запускается раз в час. Логика:

  1. Берём все активные подписки из bl_price_tracker со STATUS = active
  2. Для каждого PRODUCT_ID получаем текущую цену через \Bitrix\Catalog\PriceTable::getRow(['filter' => ['PRODUCT_ID' => $id, 'CATALOG_GROUP_ID' => 1]])
  3. Сравниваем с PRICE_AT_SUBSCRIBE: если новая цена < старой — отправляем уведомление
  4. Обновляем 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 с динамическим состоянием
  • Агент сравнения цен и отправки уведомлений
  • Страницу «Мои отслеживания» в личном кабинете