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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка калькулятора с динамической подгрузкой цен 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка калькулятора с динамической подгрузкой цен 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 дня