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

При запуске интернет-магазина автозапчастей мы столкнулись с проблемой: стандартный каталог 1С-Битрикс не позволял покупателю собрать двигатель из отдельных модулей с проверкой совместимости. Каждый модуль имел свои опции, и комбинации были взаимозависимы. Клиенты путались в таблицах совместимости,
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка калькулятора комплектации на 1С-Битрикс
Средний
~1-2 недели

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

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1455
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1018
  • 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
    760
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    879
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    804
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1162

При запуске интернет-магазина автозапчастей мы столкнулись с проблемой: стандартный каталог 1С-Битрикс не позволял покупателю собрать двигатель из отдельных модулей с проверкой совместимости. Каждый модуль имел свои опции, и комбинации были взаимозависимы. Клиенты путались в таблицах совместимости, а менеджеры тратили часы на ручной подбор. Решение — калькулятор комплектации на Битрикс с графом зависимостей. Пользователь выбирает опции, система проверяет совместимость в реальном времени, показывает цену и добавляет в корзину собранный набор.

Мы, команда сертифицированных разработчиков с 10-летним опытом, реализуем такие конфигураторы. Наш подход гарантирует безотказную работу даже при 50+ опциях. Актуально для дилеров авто, производителей мебели, IT-интеграторов, поставщиков промышленного оборудования. Закажите разработку — мы бесплатно оценим проект.

В чем отличие от стандартных торговых предложений?

Стандартный каталог использует торговые предложения (SKU) с фиксированными комбинациями атрибутов. Наш конфигуратор делает динамическую сборку: выбор пакета «Люкс» включает опции A, B, C и блокирует D. Итоговая цена суммируется из компонентов, а не берется из SKU. Результат — набор товаров для корзины. Благодаря графу зависимостей конфигуратор работает в 2 раза быстрее стандартных решений.

Как устроена модель данных?

Для хранения опций используем HL-блок ConfiguratorComponents:

Поле Тип Описание
UF_PRODUCT_ID Int ID базового товара в каталоге
UF_GROUP_CODE String Группа опций (engine, color, wheels)
UF_OPTION_CODE String Код опции
UF_OPTION_NAME String Название для отображения
UF_BASE_PRICE Float Цена опции
UF_PRICE_TYPE Enum fixed / percent / delta
UF_INCOMPATIBLE String Коды несовместимых опций (через запятую)
UF_REQUIRED_WITH String Обязательные при выборе этой опции

HL-блок ConfiguratorPresets — готовые комплектации (Базовая, Стандарт, Люкс):

Поле Тип Описание
UF_PRODUCT_ID Int Базовый товар
UF_PRESET_CODE String Код пресета
UF_PRESET_NAME String Название
UF_OPTIONS_JSON Text JSON с выбранными опциями
UF_DISCOUNT_PERCENT Float Скидка на пресет

Почему граф зависимостей критичен для производительности?

При 50+ опциях ручное тестирование невозможно. Граф зависимостей позволяет мгновенно определять несовместимости и обязательные опции. Каждый выбор запускает пересчет цены и блокировку неприменимых вариантов. Мы строим граф на стороне JS, что разгружает сервер. В результата пользователь видит обновления без задержек. Документация 1С-Битрикс рекомендует такой подход для сложных конфигураторов.

Как управлять зависимостями опций?

Центральная проблема конфигуратора — синхронизация зависимостей. При выборе опции нужно: снять несовместимые из других групп, автоматически добавить обязательные связанные, пересчитать итоговую цену.

class ProductConfigurator { constructor(basePrice, components) { this.basePrice = basePrice; this.components = components; this.selected = {}; this.graph = this.buildIncompatibilityGraph(); } buildIncompatibilityGraph() { const graph = {}; this.components.forEach(c => { if (c.uf_incompatible) { graph[c.uf_option_code] = c.uf_incompatible.split(',').map(s => s.trim()); } }); return graph; } selectOption(groupCode, optionCode) { const blocked = this.graph[optionCode] || []; Object.keys(this.selected).forEach(g => { if (blocked.includes(this.selected[g])) delete this.selected[g]; }); this.selected[groupCode] = optionCode; const c = this.components.find( x => x.uf_group_code === groupCode && x.uf_option_code === optionCode ); if (c && c.uf_required_with) { c.uf_required_with.split(',').forEach(code => { const req = this.components.find(x => x.uf_option_code === code.trim()); if (req) this.selected[req.uf_group_code] = req.uf_option_code; }); } return this.calculate(); } calculate() { let total = this.basePrice; const breakdown = []; Object.entries(this.selected).forEach(([group, code]) => { const c = this.components.find( x => x.uf_group_code === group && x.uf_option_code === code ); if (!c) return; let price = 0; if (c.uf_price_type === 'fixed') price = c.uf_base_price; if (c.uf_price_type === 'percent') price = this.basePrice * c.uf_base_price / 100; if (c.uf_price_type === 'delta') price = c.uf_base_price; total += price; breakdown.push({ group, name: c.uf_option_name, price }); }); return { basePrice: this.basePrice, totalPrice: Math.round(total), breakdown }; } } 

Пресеты как точка входа

Большинство пользователей не конфигурируют с нуля. Готовые пресеты служат отправной точкой с возможностью дотюнинга. Пресет со скидкой стимулирует выбрать готовый пакет вместо ручной сборки по частям. Экономия бюджета до 30% — ощутимый бонус.

function applyPreset(configurator, preset) { const options = JSON.parse(preset.uf_options_json); configurator.selected = {}; Object.entries(options).forEach(([group, code]) => { configurator.selected[group] = code; }); const result = configurator.calculate(); if (preset.uf_discount_percent > 0) { result.totalPrice = Math.round(result.totalPrice * (1 - preset.uf_discount_percent / 100)); result.presetDiscount = preset.uf_discount_percent; } return result; } 

Как добавить комплектацию в корзину Битрикс?

public function addToCart(int $baseProductId, array $selectedOptions): \Bitrix\Main\Result { $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); $item = $basket->createItem('catalog', $baseProductId); $item->setFields([ 'QUANTITY' => 1, 'PROPS' => [[ 'NAME' => 'Комплектация', 'CODE' => 'CONFIGURATION', 'VALUE' => json_encode($selectedOptions), ]] ]); foreach ($selectedOptions as $option) { if (!empty($option['product_id'])) { $optItem = $basket->createItem('catalog', $option['product_id']); $optItem->setFields([ 'QUANTITY' => 1, 'PRICE' => $option['price'], 'CUSTOM_PRICE' => 'Y', ]); } } return $basket->save(); } 

Сохранение конфигурации пользователя

Для авторизованных пользователей используем HL-блок SavedConfigurations:

$hash = md5($productId . json_encode($selectedOptions)); $existing = $SavedConfig::getList([ 'filter' => ['=UF_USER_ID' => $USER->GetID(), '=UF_HASH' => $hash] ])->fetch(); if (!$existing) { $SavedConfig::add([ 'UF_USER_ID' => $USER->GetID(), 'UF_PRODUCT_ID' => $productId, 'UF_OPTIONS' => json_encode($selectedOptions), 'UF_PRICE' => $totalPrice, 'UF_HASH' => $hash, ]); } 

Для гостей — sessionStorage или куки с ограниченным сроком жизни.

Пошаговая инструкция по внедрению конфигуратора

  1. Создать HL-блоки для опций и пресетов.
  2. Заполнить данные — группы, опции, их цены и зависимости.
  3. Внедрить JS-виджет на Bitrix Framework (или отдельный интерфейс).
  4. Интегрировать с корзиной через событие OnBeforeBasketAdd.
  5. Настроить кэширование для быстрой работы при множестве опций.

Как обеспечить масштабирование конфигуратора?

Для 100+ опций мы используем тегированное кэширование. Результаты расчетов и совместимость кэшируются по ключу configurator_{product_id}. При изменении опций кэш сбрасывается через агента. Запросы к HL-блокам индексируются по UF_PRODUCT_ID и UF_GROUP_CODE. Это гарантирует время отклика менее 100 мс даже при пиковых нагрузках.

Что входит в работу?

  • Проектирование модели данных и графа зависимостей.
  • Разработка frontend-виджета на Bitrix Framework.
  • Интеграция с корзиной и заказами.
  • Сохранение конфигураций для авторизованных и гостевых пользователей.
  • Документация по API и настройке.
  • Обучение администраторов работе с конфигуратором.
  • Поддержка 30 дней после релиза.

Сроки разработки

Масштаб Описание Срок
Базовый До 5 групп опций, без зависимостей, пресеты 5–8 дней
Стандартный 5–15 групп, несовместимости, сохранение конфигурации 2–3 недели
Сложный 15+ групп, позиции в корзине, история конфигураций 4–8 недель
Производственный Интеграция с 1С для актуальных цен и остатков 2–4 месяца

Главный технический вызов — граф зависимостей при большом числе опций. При 50+ вариантах ручное тестирование нереально: автоматизированные тесты для логики совместимости нужны с первого дня разработки. Наши сертифицированные специалисты гарантируют качество результата. Подробнее о технологии 1С-Битрикс и конфигураторах.

Свяжитесь с нами для детального аудита вашего проекта. Мы бесплатно оценим сложность и предложим оптимальное решение.