Розробка калькулятора з динамічним підвантаженням цін 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка калькулятора з динамічним підвантаженням цін 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка калькулятора з динамічним завантаженням цін 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 торгової пропозиції), а не основного товару.

Архітектура динамічного завантаження

Правильна схема для калькулятора з живими цінами:

  1. Ініціалізація. При завантаженні сторінки — завантаження початкових цін всіх необхідних позицій. Не AJAX — а PHP-рендеринг у data- атрибути або JSON-об'єкт у <script>. Перший рендер швидкий, без зайвих запитів.

  2. Перерахунок у браузері. Користувач змінює параметри — JavaScript перераховує вартість за вже завантаженими цінами. Жодного мережевого запиту.

  3. Оновлення цін за тригером. Опційно: якщо ціни можуть змінюватися протягом сесії (біржові товари, валютні ціни), додається періодичний 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 дні