Настройка акционных цен по расписанию 1С-Битрикс
Менеджер хочет запустить скидку в пятницу в 18:00 и снять в понедельник в 09:00 — без ручного вмешательства. Модуль catalog поддерживает скидки с диапазоном дат, но на практике настройка ломается из-за неправильного выбора типа скидки, игнорирования кэша и конфликтов между правилами корзины и каталога.
Два механизма скидок: каталог vs. корзина
В Битрикс параллельно работают два движка скидок, и путать их — главная ошибка.
Скидки каталога (b_catalog_discount) — применяются на этапе показа цены. Имеют поля ACTIVE_FROM и ACTIVE_TO, которые задают период действия. Работают с типами цен, группами пользователей и условиями по свойствам товара. Это именно тот механизм, который нужен для расписания.
Правила корзины (b_sale_discount) — применяются при расчёте заказа в модуле sale. Тоже имеют ACTIVE_FROM/ACTIVE_TO, но работают иначе: условие проверяется в момент оформления, а не показа. Если акционная цена должна быть видна в каталоге до добавления в корзину — используйте скидки каталога.
Настройка скидки каталога по расписанию
Путь: Магазин → Скидки на товары → Добавить скидку.
Ключевые поля:
- Активность — обязательно «Да».
-
Дата начала / Дата окончания — задают окно акции. Формат зависит от настройки сайта, внутренне хранится как
DATETIMEвb_catalog_discount. - Тип скидки — процент или фиксированная сумма.
- Условия применения — раздел каталога, конкретные товары (по ID или свойству), группа пользователей.
- Приоритет — число, определяющее порядок применения. Скидка с приоритетом 1 применяется раньше скидки с приоритетом 2.
Флаг «Прекратить применение» — если включён, скидки с меньшим приоритетом не применяются. Используйте его, чтобы акционная цена не суммировалась с накопительной скидкой.
Автоматизация через агенты
Для сложных расписаний (каждую пятницу, каждый первый день месяца) полей ACTIVE_FROM/ACTIVE_TO недостаточно — они задают одноразовый период. Решение — агент, который программно создаёт и деактивирует скидки.
Агент регистрируется в b_agent и вызывает \Bitrix\Catalog\DiscountTable::update() для изменения полей ACTIVE_FROM, ACTIVE_TO и ACTIVE. Расписание хранится в пользовательской таблице или в UF-полях скидки.
Альтернатива — cron-скрипт, который по таблице расписаний (custom_discount_schedule) находит скидки, подлежащие активации, и переключает флаг ACTIVE. Такой подход проще отлаживать: лог выполнения скрипта покажет, что именно активировалось и когда.
Кэширование и отображение
Скидки каталога кэшируются компонентами catalog.section и catalog.element. Если TTL кэша — 3600 секунд, а акция стартует в 18:00, посетитель может увидеть старую цену до 19:00.
Решения:
- Уменьшить TTL до 300–600 секунд на период акции.
-
Сбросить кэш программно в агенте после активации скидки:
\Bitrix\Main\Data\Cache::clearCache(true, '/bitrix/catalog.section/'). -
Использовать тегированный кэш — при изменении скидки модуль
catalogсбрасывает тегcatalog, но только если скидка изменена через API, а не прямым SQL.
Перечёркнутая старая цена отображается автоматически, если в типе цены указана «старая цена» и шаблон компонента поддерживает вывод OLD_PRICE. Проверьте, что шаблон каталога выводит оба значения — иначе посетитель не увидит выгоду.







