Налаштування ціноутворення за часом доби 1С-Bitrix
Стандартний модуль 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-таймер зворотного відліку до зміни тарифу підвищує прозорість для покупця.







