Налаштування ціноутворення за часом доби 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 день. Отримайте консультацію з ціноутворення та термінів.







