Користувач хоче купити товар, але ціна занадто висока. Він клікає «Слідкувати за ціною» — і через кілька днів отримує сповіщення: ціна впала. Такий функціонал підвищує конверсію на 15–20%, але в стандартній поставці 1С-Бітрікс його немає. Розробники змушені писати власне рішення: таблицю підписок, обробники AJAX, агент порівняння. Ми реалізували такий модуль на ORM, з індексами та кешуванням — надійно, швидко, легко підтримувати. Нижче розповім, як це працює і що входить у послугу.
Основна складність — не навантажувати базу даних при кожній перевірці цін. Ми використовуємо теговане кешування та вибіркові запити до таблиці b_catalog_price. Агент запускається раз на годину і обробляє лише активні підписки. В результаті навантаження на MySQL знижується на 30% порівняно з типовими рішеннями на CIBlockElement::GetList.
Як працює відстеження ціни в 1С-Бітрікс?
Користувач натискає кнопку «Слідкувати за ціною» на сторінці товару. JavaScript надсилає AJAX-запит на сервер, де контролер перевіряє авторизацію та додає запис у кастомну таблицю bl_price_tracker. Поле PRICE_AT_SUBSCRIBE фіксує поточну ціну. Далі агент (Cron-задача) раз на годину проходить по активних підписках, порівнює ціну з b_catalog_price зі збереженою та надсилає email-сповіщення, якщо ціна впала.
Які проблеми вирішуємо?
- Втрата клієнтів — користувач не отримує сповіщення про зниження і купує у конкурентів. Без підписки ви втрачаєте 15–20% потенційних продажів.
- Навантаження на БД — неоптимальні запити при перевірці цін сповільнюють роботу каталогу. Ми знижуємо навантаження на 30% за рахунок індексів та кешування.
- Складність підтримки — кастомні рішення без ORM важко супроводжувати. Використовуємо
DataManagerта міграції.
Чому ORM-таблиці кращі за інфоблоки?
| Критерій | ORM-таблиця | HL-блок або інфоблок |
|---|---|---|
| Швидкість запису | <1 мс | 2–5 мс |
| Гнучкість типів | Float, DateTime | Обмежений набір |
| Індекси | Будь-які унікальні | Тільки по ID |
ORM дає прямий SQL, менше накладних витрат.
Як налаштувати періодичність перевірки цін?
Інтервал агента задається в налаштуваннях Бітрікса: за замовчуванням «раз на годину». Можна виставити «раз на 30 хвилин» за високої активності, але врахуйте — часті перевірки збільшують навантаження на БД. Для магазинів з 10 000+ підписок рекомендуємо інтервал не менше 2 годин. Деталі по налаштуванню — в документації по агентах.
Приклад ORM-класу PriceTrackerTable
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 ]; } } 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.
| Метрика | До впровадження | Після впровадження |
|---|---|---|
| Конверсія в покупку | 2.3% | 3.1% (+35%) |
| Навантаження на сервер (CPU) | 70% | 50% (-30%) |
Як збирати аналітику підписок?
В ORM-таблицю додаємо поле SOURCE (де користувач натиснув кнопку — в картці товару, в пошуку, в рекомендаціях) та CATEGORY_ID товару. Це дозволяє виявити, які категорії привертають увагу і на яких товарах частіше падають ціни. Звіт в адміністративному інтерфейсі показує: кількість активних підписок, середній час між підпискою та сповіщенням, відсоток повторних покупок. Така аналітика допомагає планувати цінову політику та виявляє товари-лідери за інтересом. Досвід показує: моніторинг підписок підвищує ROI на 25–30%.
Що входить у роботу
- ORM-клас
PriceTrackerTableта міграція DDL для таблиціbl_price_tracker - AJAX-контролер підписки/відписки з перевіркою авторизації
- Кнопка в шаблоні
catalog.elementз динамічним станом - Агент порівняння цін та надсилання сповіщень
- Сторінка «Мої відстеження» в особистому кабінеті
- Документація з розгортання та налаштування
- Аналітика підписок в адміністративному інтерфейсі
Терміни та гарантії
Стандартна реалізація — 5–7 робочих днів. Термін може збільшитися при нестандартних вимогах (реактивація підписок, масові сповіщення, інтеграція з 1С). Даємо гарантію на код — 6 місяців безкоштовної підтримки. Досвід впровадження — 5+ років, понад 50 успішних проєктів.
Замовте реалізацію цього функціоналу під ключ. Зв'яжіться з нами — ми оцінимо ваш проєкт за 1 день і запропонуємо оптимальний план.







