Налаштування повідомлення про зниження ціни товару 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування повідомлення про зниження ціни товару 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування сповіщення про зниження ціни товара 1С-Bitrix

Ціна на товар знизилась — потрібно повідомити користувачів, які додали його до улюблених або явно підписалися на зниження ціни. Механізм складається з двох частин: відстеження змін ціни та розсилка сповіщень зацікавленим користувачам. У Bitrix обидва компоненти реалізуються без сторонніх сервісів.

Фіксація змін ціни

Ціни каталогу зберігаються в b_catalog_price. При зміні ціни через API (CCatalogProduct::SetPrice() або \Bitrix\Catalog\PriceTable::update()) спрацьовує подія OnCatalogPriceUpdate. Підписуємось на неї:

AddEventHandler('catalog', 'OnCatalogPriceUpdate', function($fields) {
    $productId = $fields['PRODUCT_ID'];
    $newPrice   = $fields['PRICE'];
    $typeId     = $fields['CATALOG_GROUP_ID']; // тип ціни

    // Отримуємо стару ціну з нашої таблиці снимків
    $oldPrice = PriceSnapshotTable::getLastPrice($productId, $typeId);

    if ($oldPrice && $newPrice < $oldPrice) {
        // Ставимо завдання на розсилку сповіщень
        PriceDropQueue::add($productId, $newPrice, $oldPrice);
    }

    // Зберігаємо новий снимок
    PriceSnapshotTable::save($productId, $typeId, $newPrice);
});

Таблиця снимків bl_price_snapshot: поля product_id, catalog_group_id, price, currency, recorded_at.

Зберігання підписок користувачів

Створіть таблицю bl_price_watch з полями:

  • user_id — ID з b_user (NULL для анонімів)
  • email — email для сповіщення
  • product_id — ID товара
  • target_price — бажана ціна (опціонально, NULL = будь-яке зниження)
  • created_at
  • notified_at — дата останнього сповіщення

Кнопка «Стежити за ціною» на сторінці товара відправляє AJAX-запит, який вставляє рядок в bl_price_watch. Для авторизованих користувачів email береться автоматично з b_user.

Відправка сповіщень

Агент запускається раз на 30 хвилин. Логіка:

  1. Читаємо очередь bl_price_drop_queue
  2. Для кожного товара знаходимо підписників в bl_price_watch у яких target_price IS NULL OR target_price >= new_price
  3. Сповіщення відправляється через \Bitrix\Main\Mail\Event::send() з типом CATALOG_PRICE_DROP:
\Bitrix\Main\Mail\Event::send([
    'EVENT_NAME' => 'CATALOG_PRICE_DROP',
    'LID'        => SITE_ID,
    'C_FIELDS'   => [
        'USER_EMAIL'  => $subscriber['email'],
        'PRODUCT_NAME' => $productName,
        'OLD_PRICE'   => number_format($oldPrice, 0, '.', ' '),
        'NEW_PRICE'   => number_format($newPrice, 0, '.', ' '),
        'PRODUCT_URL' => $productUrl,
        'DISCOUNT_PCT' => round((1 - $newPrice / $oldPrice) * 100),
    ],
]);

Після відправки ставимо notified_at = NOW() та можемо додати логіку: не сповіщувати повторно по одному товару частіше ніж раз на 7 днів.

Що налаштовуємо

  • Обробник OnCatalogPriceUpdate з записом у таблицю снимків та очередь
  • Таблиці bl_price_snapshot та bl_price_watch
  • UI-кнопку «Стежити за ціною» в шаблоні компонента catalog.element
  • Тип поштової події CATALOG_PRICE_DROP та HTML-шаблон листа
  • Агент розсилки з дедубліцією за notified_at