Настройка ценообразования по времени суток 1С-Битрикс
В стандартном модуле catalog нет механизма, который меняет цену товара в зависимости от часа. Типы цен, скидки, наценки — всё это статические сущности, не привязанные ко времени суток. Между тем задача реальна: ночные тарифы для доставки, happy hour для ресторанов, пиковые наценки для сервисов с ограниченной мощностью. Реализация требует вмешательства в логику расчёта цены на уровне событий.
Механизм расчёта цены в каталоге
Цена товара проходит через цепочку: базовая цена из b_catalog_price → применение скидок из b_catalog_discount → округление → результат. Метод \Bitrix\Catalog\Product\Price::getPrice() возвращает финальную цену, но скидки каталога применяются на основании групп пользователей и условий (сумма заказа, количество товара), а не времени.
Точка входа — событие OnGetOptimalPrice модуля catalog. Обработчик получает ID товара, количество, группы пользователя и может вернуть массив с переопределённой ценой. Именно здесь внедряется логика по времени.
Реализация через обработчик событий
Создайте обработчик в init.php или через собственный модуль:
-
Регистрация события:
AddEventHandler('catalog', 'OnGetOptimalPrice', ...). -
Определение текущего часа:
date('G')возвращает час без ведущего нуля (0–23). Учитывайте серверный часовой пояс —date_default_timezone_get()должен совпадать с бизнес-зоной. -
Применение коэффициента: ночной коэффициент 0.85 для часов 22:00–06:00 умножается на базовую цену. Коэффициенты хранятся в
b_optionили в пользовательском свойстве инфоблока — зависит от того, нужны ли разные правила для разных товаров.
Важно: обработчик OnGetOptimalPrice вызывается при каждом показе цены — в каталоге, на детальной странице, в корзине. Не делайте в нём тяжёлых запросов. Коэффициенты кэшируйте в статическую переменную класса или в \Bitrix\Main\Data\Cache с TTL 300 секунд.
Кэширование и подводные камни
Композитный кэш и кэш компонентов по умолчанию не учитывают время суток. Компонент catalog.section закэширует страницу с дневными ценами, и ночной посетитель увидит их до истечения TTL.
Решение — добавить час в ключ кэша через параметр CACHE_GROUPS компонента или через AddAdditionalCacheID() в component_epilog.php. Кэш будет сбрасываться каждый час — это приемлемо для большинства магазинов.
Для композитного кэша используйте динамическую область <bx:dynamic> вокруг блока с ценой. Цена будет подгружаться AJAX-запросом при каждом показе страницы.
Отображение информации о тарифе
Покажите пользователю, что цена зависит от времени. Добавьте в шаблон компонента catalog.element блок с текущим тарифом: «Ночной тариф: скидка 15% до 06:00». Время окончания считайте серверным кодом и передавайте через $arResult. JavaScript-таймер обратного отсчёта до смены тарифа повышает прозрачность для покупателя.







