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







