Розробка калькулятора з динамічним завантаженням цін 1С-Бітрікс
Калькулятор з динамічним завантаженням цін відрізняється від статичного тим, що ціни в ньому беруться з каталогу Бітрікс у реальному часі, а не зашиті в JavaScript. Це означає: змінилася ціна на метал — калькулятор металоконструкцій одразу рахує за новими цінами. Без переписування коду. Саме тут більшість реалізацій ламається: або кешують ціни надто агресивно (застарілі дані годинами), або роблять AJAX-запит до БД при кожному русі слайдера (зайве навантаження).
Звідки брати ціни: API каталогу
Ціни в Бітрікс зберігаються в таблиці b_catalog_price. Для кожного товару може бути кілька цін (роздрібна, оптова, спеціальна) — тип ціни визначається CATALOG_GROUP_ID. Для завантаження цін у калькулятор використовується API:
// Отримання цін для набору товарів
$prices = \Bitrix\Catalog\PriceTable::getList([
'filter' => [
'PRODUCT_ID' => $productIds,
'CATALOG_GROUP_ID' => 1, // роздрібна ціна
],
'select' => ['PRODUCT_ID', 'PRICE', 'CURRENCY'],
])->fetchAll();
Для калькулятора, що працює з торговими пропозиціями (SKU), потрібно враховувати, що ціна зберігається на рівні торгової пропозиції (b_catalog_price.PRODUCT_ID = ID торгової пропозиції), а не основного товару.
Архітектура динамічного завантаження
Правильна схема для калькулятора з живими цінами:
-
Ініціалізація. При завантаженні сторінки — завантаження початкових цін всіх необхідних позицій. Не AJAX — а PHP-рендеринг у
data-атрибути або JSON-об'єкт у<script>. Перший рендер швидкий, без зайвих запитів. -
Перерахунок у браузері. Користувач змінює параметри — JavaScript перераховує вартість за вже завантаженими цінами. Жодного мережевого запиту.
-
Оновлення цін за тригером. Опційно: якщо ціни можуть змінюватися протягом сесії (біржові товари, валютні ціни), додається періодичний AJAX-запит на оновлення цін — раз на 5–10 хвилин, а не при кожній взаємодії.
// Ініціалізація цін з PHP
const calcPrices = <?= json_encode($pricesData) ?>;
// Перерахунок при зміні параметрів (без AJAX)
function recalculate() {
const materialId = document.getElementById('material').value;
const quantity = parseFloat(document.getElementById('quantity').value);
const pricePerUnit = calcPrices[materialId]?.price ?? 0;
document.getElementById('total').textContent =
formatPrice(pricePerUnit * quantity);
}
Ціни з урахуванням знижок та груп користувачів
Для авторизованих користувачів із групи «Оптовики» ціна має підтягуватися з відповідного типу цін (CATALOG_GROUP_ID = 2). При ініціалізації калькулятора серверна частина визначає групу користувача і повертає потрібний набір цін.
Механізм накопичувальних знижок і правил кошика при цьому не застосовується — калькулятор рахує прайсову ціну. Якщо потрібні ціни з урахуванням знижок, їх необхідно розраховувати через CCatalogProduct::GetOptimalPrice, що значно повільніше і потребує кешування.
Кешування цін
Ціни з каталогу кешуються на сервері з тегованим кешем Бітрікс:
$cache = \Bitrix\Main\Data\Cache::createInstance();
$cacheKey = 'calc_prices_' . md5(serialize($productIds));
if ($cache->initCache(3600, $cacheKey, '/calc/prices/')) {
$prices = $cache->getVars();
} elseif ($cache->startDataCache()) {
$prices = fetchPricesFromDB($productIds);
$cache->endDataCache($prices);
// тег інвалідації — при оновленні ціни в каталозі
\Bitrix\Main\Data\TaggedCache::clearByTag('catalog_price_' . $productId);
}
TTL 3600 секунд (1 година) — розумний баланс для більшості каталогів. Для біржових товарів — 60–300 секунд.
Кейс: калькулятор металопрокату з актуальними цінами
Клієнт — металоторговельна компанія. Каталог: 3 000 позицій, ціни оновлюються щоденно через вивантаження з 1С. Калькулятор: користувач вибирає вид прокату (кутник, швелер, труба), марку сталі, довжину — отримує ціну за тонну та підсумкову вартість.
Проблема вихідної реалізації: ціни були зашиті в JSON-файл, який оновлювався вручну при зміні прайсу. Траплялися ситуації, коли калькулятор показував ціни тижневої давнини.
Нова реалізація: ціни підтягуються з b_catalog_price при першому рендері сторінки (PHP → JSON у <script>). Тегований кеш інвалідується агентом Бітрікс через 30 хвилин після завершення імпорту з 1С. Користувач завжди бачить актуальні ціни із затримкою не більше 30 хвилин після оновлення прайсу — це прийнятно для даного бізнесу.
Терміни розробки
- Калькулятор із завантаженням цін з каталогу, без персоналізації — 3–6 днів
-
- Групові ціни (оптовики, дилери) — +1–2 дні
-
- Динамічне оновлення цін у сесії — +1 день
-
- Інтеграція з залишками (наявність на складах) — +2–3 дні







