Настройка ценообразования по времени суток 1С-Битрикс
Владельцы интернет-магазинов часто сталкиваются с задачей: цены должны меняться автоматически в зависимости от времени суток — например, ночной тариф на доставку или скидка в обеденное время. Представьте: сеть кофеен хочет запустить happy hour с 16:00 до 18:00 — скидка 20% на все напитки. В стандартном Битрикс это нереализуемо: типы цен и скидки статичны, не привязаны к часам. Ночные тарифы для доставки, пиковые наценки для сервисов с ограниченной мощностью — все эти сценарии требуют нестандартного подхода. Концепция Time-based pricing активно используется в e-commerce, но на платформе 1С-Битрикс её внедрение требует кастомного кода.
Мы разработали решение через событие OnGetOptimalPrice, которое позволяет переопределять цену прямо перед показом. Обработчик учитывает текущий час, применяет коэффициент и возвращает актуальную цену. Грамотная реализация позволяет избежать просадок производительности даже при высоких нагрузках. Например, для сети кофеен из 30 точек мы создали правило: товары группы 'Напитки' получали скидку 20% с 16 до 18. Коэффициент 0.8 применялся в обработчике, кэш тегировался по часу. Результат: конверсия выросла на 40%, средний чек — на 12%, нагрузка на сервер увеличилась менее чем на 1%.
Цена товара проходит цепочку: базовая цена из b_catalog_price → скидки из b_catalog_discount → округление. Метод \Bitrix\Catalog\Product\Price::getPrice() возвращает финальное значение, но скидки каталога привязаны к группам пользователей и условиям (сумма, количество), а не к времени. Для реализации временных тарифов требуется кастомный обработчик.
Как реализовать ценообразование по времени суток в 1С-Битрикс?
Точка входа — событие OnGetOptimalPrice модуля catalog. Обработчик получает ID товара, количество, группы пользователя и может вернуть массив с переопределённой ценой. Вот пошаговая инструкция:
-
Регистрация обработчика. В
init.phpили в модуле:AddEventHandler('catalog', 'OnGetOptimalPrice', 'myTimePriceHandler');Определение текущего часа. Используйте
date('G')(0–23). Проверьте часовой пояс сервера черезdate_default_timezone_get()— он должен совпадать с бизнес-зоной клиента.Применение коэффициента. Например, для ночного тарифа (22:00–06:00) коэффициент 0.85. Коэффициенты можно хранить в
b_optionили в пользовательском свойстве инфоблока. Мы рекомендуем второй вариант — он гибче: для разных товаров можно задать разные правила.Кэширование коэффициентов. Обработчик вызывается при каждом показе цены — в каталоге, детальной странице, корзине. Не делайте в нём тяжёлых запросов. Коэффициенты кэшируйте в статическую переменную класса или используйте
\Bitrix\Main\Data\Cacheс TTL 300 секунд. Примените тегированное кэширование, чтобы инвалидировать кэш при изменении коэффициентов.Формирование результата. Верните массив с полем
'PRICE', содержащим объект\Bitrix\Catalog\Product\Priceс новой ценой. Пример:$result['PRICE'] = \Bitrix\Catalog\Product\Price::createFromArray([ 'PRICE' => round($basePrice * $coefficient, 2), 'CURRENCY' => 'RUB', 'CATALOG_GROUP_ID' => $priceTypeId, ]);Согласно документации 1С-Битрикс, событие
OnGetOptimalPriceявляется единственной точкой для переопределения цены, не затрагивая ядро.Почему это выгоднее статических скидок?
Статическая скидка в 15% на всю группу товаров не учитывает время — вы теряете выручку в пик и недополучаете спрос ночью. Динамическое ценообразование повышает конверсию на 15–30% в среднем по нашей практике. Один клиент — сеть кофеен — внедрил happy hour: выручка в период с 16:00 до 18:00 выросла на 40%, а средний чек — на 12%. Это сравнение показывает: гибкая цена лучше фиксированной скидки в любой день.
Подводные камни и их решение
Композитный кэш и кэш компонентов по умолчанию не учитывают время суток. Компонент
catalog.sectionзакэширует страницу с дневными ценами, и ночной посетитель увидит их до истечения TTL. Решение — добавить час в ключ кэша черезAddAdditionalCacheID()вcomponent_epilog.php. Кэш будет сбрасываться каждый час — это приемлемо для 99% магазинов.Также необходимо учесть:
- Часовой пояс сервера: цена может срабатывать не в тот час.
- Отображение в корзине и заказе: должна фиксироваться актуальная на момент добавления цена.
- Динамическая область при композитном кэше: без
bx:dynamicпользователи увидят устаревшие цены.
Отображение информации о тарифе
Покажите пользователю, что цена зависит от времени. В шаблон
catalog.elementдобавьте блок с текущим тарифом и таймером обратного отсчёта до смены. Время окончания считайте серверным кодом и передавайте через$arResult. JavaScript-таймер повышает прозрачность — покупатель видит, что через 15 минут тариф сменится. Закажите настройку под ключ — мы подготовим решение за 1 день.Что входит в работу
Этап Описание Результат Аналитика Разбор бизнес-требований: диапазоны часов, размеры наценок/скидок, товарные группы Техническое задание Разработка Обработчик OnGetOptimalPrice, хранение коэффициентов, кэширование Рабочий код Интеграция Настройка кэширования (компонентный + композитный), динамическая область Стабильная работа UI Вывод тарифа, таймер обратного отсчёта, адаптация шаблонов Понятный интерфейс Тестирование Проверка всех сценариев: смена часа, граничные условия, нагрузка Протокол тестов Документация Описание логики, инструкция по настройке коэффициентов Передача знаний Сравнение подходов: статические скидки vs динамическое ценообразование
Параметр Статические скидки Динамическое ценообразование Гибкость Фиксированный процент Изменяется по часам Реализация Через админку Кастомный обработчик + кэш Конверсия Базовая Выше на 15–30% Риск устаревания Нет (всегда актуально) Требует кэширования по часу Мы гарантируем стабильную работу: сертифицированные специалисты Битрикс, опыт более 5 лет. Свяжитесь с нами для детального разбора вашего проекта — оценим задачу за 1 день. Получите консультацию по ценообразованию и срокам.







