Розробка модуля калькулятора послуг 1С-Бітрікс
Калькулятор послуг — інструмент конверсії. Користувач вводить параметри (площа, кількість, терміни, опції), отримує миттєву вартість і надсилає заявку. Правильно зроблений калькулятор збільшує конверсію: клієнт розуміє ціноутворення, не боїться несподіваних сум.
Готових рішень у маркетплейсі Бітрікс практично немає, або вони надто прості. Для серйозного бізнесу — страхової компанії, будівельного підрядника, друкарні — потрібен модуль із гнучкою формулою та інтеграцією з CRM.
Що повинен вміти модуль
- Кілька незалежних калькуляторів на одному сайті (для різних послуг)
- Багатокроковий ввід параметрів
- Складні формули з умовами (
if площа > 100, то знижка 10%) - Залежні поля (вибір одного поля змінює список опцій в іншому)
- Прив'язка до цін із торгового каталогу Бітрікс (
b_catalog_price) - Надсилання заявки з розрахунком до CRM як лід або угода
- Перерахунок у реальному часі без перезавантаження сторінки
Структура даних
Модуль vendor.calculator із наступними таблицями:
-
b_vendor_calc_calculator— калькулятори: id, name, slug, config (JSON полів і кроків), formula (JSON дерево обчислень), crm_target (lead/deal), is_active -
b_vendor_calc_field— поля калькулятора: id, calculator_id, type, name, label, options (JSON), depends_on, validation_rules, sort -
b_vendor_calc_result— збережені розрахунки: id, calculator_id, session_id, user_id, params (JSON), result (JSON суми), created_at -
b_vendor_calc_lead— зв'язок розрахунку з лідом/угодою CRM: result_id, crm_type, crm_id
Типи полів
Підтримувані типи полів калькулятора:
-
number— числове поле з min/max/step -
slider— повзунок із діапазоном -
select— випадаючий список із прив'язкою коефіцієнтів -
checkbox— прапорець із додатковою вартістю -
radio— вибір одного варіанта -
area— двовимірний ввід (ширина × висота) -
catalog_product— вибір товару з інфоблоку з автопідстановкою ціни
Рушій формул
Формула зберігається в JSON-структурі, яка інтерпретується на стороні сервера (PHP) і на стороні клієнта (JavaScript). Синхронність критична: підсумкова сума в інтерфейсі повинна збігатися із сумою в CRM.
Приклад формули для розрахунку ремонтних робіт:
{
"type": "add",
"operands": [
{
"type": "multiply",
"operands": [
{"type": "field", "name": "area"},
{"type": "field", "name": "work_type_price"}
]
},
{
"type": "if",
"condition": {"type": "gt", "left": {"type": "field", "name": "area"}, "right": 100},
"then": {"type": "multiply", "operands": [{"type": "ref", "name": "subtotal"}, -0.1]},
"else": 0
}
]
}
PHP-інтерпретатор FormulaEvaluator::evaluate($formula, $fieldValues) рекурсивно обходить дерево та обчислює підсумок.
JavaScript-частина
На фронтенді — реактивний перерахунок. При зміні будь-якого поля:
- Збираються поточні значення всіх полів
- Локальна копія формули обчислюється в JS (та сама логіка, що на PHP)
- Результат миттєво оновлюється в інтерфейсі
- Додатково: AJAX-запит на сервер для точного розрахунку з урахуванням актуальних цін із БД
// Перерахунок при зміні поля
document.querySelectorAll('.calc-field').forEach(field => {
field.addEventListener('change', () => {
const values = collectFieldValues();
const localResult = evaluateFormula(calculatorConfig.formula, values);
updateResultDisplay(localResult);
debounce(() => fetchServerResult(values), 500)();
});
});
Залежні поля
Залежність описується в конфігурації поля:
{
"name": "material_type",
"type": "select",
"depends_on": {
"field": "work_type",
"map": {
"painting": ["latex", "acrylic", "oil"],
"wallpaper": ["paper", "vinyl", "non-woven"],
"tile": ["ceramic", "porcelain", "mosaic"]
}
}
}
При виборі work_type = 'painting' список матеріалів фільтрується до ["latex", "acrylic", "oil"]. Логіка працює і на клієнті, і перевіряється на сервері при надсиланні форми.
Надсилання до CRM
Після завершення розрахунку користувач заповнює контактні дані та надсилає заявку. Модуль створює лід або угоду:
$leadFields = [
'TITLE' => 'Розрахунок із калькулятора: ' . $calculator['NAME'],
'NAME' => $formData['name'],
'PHONE' => [['VALUE' => $formData['phone'], 'VALUE_TYPE' => 'WORK']],
'EMAIL' => [['VALUE' => $formData['email'], 'VALUE_TYPE' => 'WORK']],
'COMMENTS' => $this->buildCalculatorComment($result),
'UF_CALC_SUM' => $result['total'],
'SOURCE_ID' => 'CALCULATOR',
];
$leadId = \Bitrix\Crm\LeadTable::add($leadFields)->getId();
Параметри розрахунку записуються до коментаря ліда та до користувацького поля UF_CALC_PARAMS (JSON).
Терміни розробки
| Етап | Термін |
|---|---|
| Архітектура, таблиці, інсталятор | 1 день |
| Конструктор полів і конфігуратор | 2 дні |
| Рушій формул PHP + JS | 3 дні |
| Залежні поля, реактивний перерахунок | 2 дні |
| Інтеграція з цінами каталогу | 1 день |
| Надсилання до CRM | 1 день |
| Адміністративний інтерфейс | 2 дні |
| Компонент для розміщення на сторінці | 1 день |
Разом: 13 робочих днів. Нестандартні формули із зовнішніми довідниками (тарифні сітки, регіональні коефіцієнти) — +2–3 дні.







