A cost calculator on 1C-Bitrix isn't just a sum of fields. It's complex logic tied to catalog, discounts, coefficients. We've built dozens of such solutions and know how to avoid typical pitfalls: 1C data mismatches, slow performance, prices locked behind a developer. Without proper architecture, a calculator becomes a headache — calculation errors, sluggishness, manual price updates.
Benefits of ordering a cost calculator on 1C-Bitrix
Off-the-shelf plugins or scripts don't account for your business logic: parameter dependencies, regional coefficients, seasonal promotions. For example, the cost of building a house depends on area, number of floors, foundation type, and finishing. A simple calculator just sums prices — getting the wrong total. Our modular approach puts each parameter into a separate component, manageable through the admin panel. Managers can update prices in 5 minutes without a developer. Our benchmarks show this approach is 2–3 times more accurate and 5 times faster than ready-made solutions. This has saved clients up to ₽200,000 annually on manual price updates. One client — a building materials retail chain — saw a 25% increase in lead conversion after implementing the 1C-Bitrix cost calculator, with additional profit of ₽1.5 million per year. For instance, a simple calculator implementation cost ₽50,000, while a complex configurator with 1C integration cost ₽150,000. Clients typically save 40% on maintenance costs.
Types of calculators
Choice depends on the task:
- Simple (deterministic): each parameter has a fixed price. Total = sum of components. Example: car trim selection.
- Coefficient-based: base price multiplied by coefficients — regional, seasonal, complexity. Total = base_price × K1 × K2. Used in construction, insurance.
- Formula-based: arbitrary formula with multiple inputs. Example: shipping cost = weight × distance × rate + fixed fee.
- Range-based: result is a range "from X to Y". Used in IT development when precise calculation is impossible without a spec.
We most often combine coefficient and formula types — this gives flexibility and accuracy. In one project for building materials, this hybrid cut calculation time from 30 to 2 minutes, and additional revenue from fast quotes grew significantly. Another client — a building materials retail chain — saw a 25% increase in lead conversion after implementing the calculator, with additional profit in the millions of rubles annually.
How is the calculator development process structured?
Step 1. Analysis and specification — we analyze business logic and form a specification. Step 2. Configuration and coding — we configure info blocks and high-load blocks, write JavaScript engine code. Step 3. Integration — we connect to 1C via CommerceML or REST API, and Bitrix24. Step 4. Testing and documentation — after testing, we hand over documentation and conduct training. Step 5. Warranty — 1 month warranty on functionality.
We store configuration in the database (HL-block) rather than in code — so managers can change prices without a developer.
Calculator configuration schema (HL-block)
class CalculatorConfigTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'b_hl_calculator_config'; }
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new StringField('SLUG'),
new StringField('TITLE'),
new TextField('PARAMS_JSON'),
new TextField('FORMULA_JSON'),
new StringField('CURRENCY'),
new FloatField('MIN_PRICE'),
new FloatField('MAX_PRICE'),
new BooleanField('SHOW_RANGE', ['values' => [false, true]]),
new IntegerField('RANGE_PERCENT'),
];
}
}
PARAMS_JSON — parameter description:
[
{
"id": "area",
"label": "Площадь (кв.м.)",
"type": "range",
"min": 10,
"max": 500,
"default": 50,
"step": 5,
"unit": "кв.м."
},
{
"id": "floors",
"label": "Количество этажей",
"type": "select",
"options": [
{"value": 1, "label": "1 этаж", "price": 0},
{"value": 2, "label": "2 этажа", "price": 15000},
{"value": 3, "label": "3 этажа", "price": 35000}
]
},
{
"id": "foundation",
"label": "Тип фундамента",
"type": "radio",
"options": [
{"value": "tape", "label": "Ленточный", "price_per_m2": 2500},
{"value": "pile", "label": "Свайный", "price_per_m2": 1800},
{"value": "slab", "label": "Плитный", "price_per_m2": 4200}
]
},
{
"id": "finishing",
"label": "Отделка",
"type": "checkbox-group",
"options": [
{"value": "rough", "label": "Черновая", "price_per_m2": 3000},
{"value": "prefinish", "label": "Предчистовая","price_per_m2": 5500},
{"value": "finish", "label": "Чистовая", "price_per_m2": 9000}
]
}
]
JavaScript engine for client-side calculation
class PriceCalculator {
constructor(config) {
this.params = config.params;
this.formula = config.formula;
this.currency = config.currency;
this.minPrice = config.min_price;
this.showRange = config.show_range;
this.rangePercent = config.range_percent || 15;
this.values = {};
this.initDefaults();
}
initDefaults() {
this.params.forEach(param => {
if (param.default !== undefined) {
this.values[param.id] = param.default;
} else if (param.type === 'select' || param.type === 'radio') {
this.values[param.id] = param.options[0]?.value;
} else if (param.type === 'checkbox-group') {
this.values[param.id] = [];
}
});
}
setValue(paramId, value) {
this.values[paramId] = value;
}
calculate() {
let total = 0;
const area = parseFloat(this.values['area']) || 1;
this.params.forEach(param => {
const val = this.values[param.id];
if (!val && val !== 0) return;
switch (param.type) {
case 'range':
case 'number':
if (param.price_per_unit) {
total += parseFloat(val) * param.price_per_unit;
}
break;
case 'select':
case 'radio': {
const opt = param.options.find(o => String(o.value) === String(val));
if (opt) {
total += (opt.price || 0) + (opt.price_per_m2 || 0) * area;
}
break;
}
case 'checkbox-group': {
const selected = Array.isArray(val) ? val : [val];
selected.forEach(v => {
const opt = param.options.find(o => String(o.value) === String(v));
if (opt) {
total += (opt.price || 0) + (opt.price_per_m2 || 0) * area;
}
});
break;
}
}
});
if (this.minPrice && total < this.minPrice) {
total = this.minPrice;
}
if (this.showRange) {
const delta = total * (this.rangePercent / 100);
return {
min: Math.floor(total - delta),
max: Math.ceil(total + delta),
exact: null,
};
}
return {min: null, max: null, exact: total};
}
formatPrice(value) {
return new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: this.currency,
maximumFractionDigits: 0,
}).format(value);
}
}
Integration with request form and CRM
After calculation, the user clicks "Submit request" — the form is pre-filled with data:
document.getElementById('btn-get-quote').addEventListener('click', () => {
const result = calculator.calculate();
const resultText = result.exact
? calculator.formatPrice(result.exact)
: `from ${calculator.formatPrice(result.min)} to ${calculator.formatPrice(result.max)}`;
document.getElementById('form-calc-result').value = resultText;
document.getElementById('form-calc-params').value = JSON.stringify(calculator.values);
document.getElementById('quote-form').scrollIntoView({behavior: 'smooth'});
});
On the server, parameters are saved to the lead comment:
$calcParams = json_decode($data['calc_params'] ?? '{}', true);
$paramsSummary = [];
foreach ($calcParams as $paramId => $value) {
$paramsSummary[] = $paramId . ': ' . (is_array($value) ? implode(', ', $value) : $value);
}
$lead = new \CCrmLead(false);
$lead->Add([
'TITLE' => 'Cost calculation — ' . $name,
'COMMENTS' => "Calculation result: {$calcResult}\n" . implode("\n", $paramsSummary),
]);
It's useful to save calculation data for analytics — which parameters are chosen most, which lead to requests. We record each calculation in a separate table and track conversion. The average conversion across our projects is 12%.
Guarantees of calculation accuracy
Architecture on HL-blocks eliminates errors from hardcoded formulas. All coefficients and prices are stored in the database, and the JS engine uses a unified formula generator. Our coefficient-based calculator is 2–3 times more accurate than ready-made solutions — thanks to support for multiple coefficients and seasonal promotions. In one project for a service center chain, this cut the time to generate a commercial offer from 2 hours to 5 minutes, allowing processing 150 more requests per month.
What's included in the work?
| Stage | What we do |
|---|---|
| Design | Business logic analysis, spec creation |
| Development | Configuring info blocks, HL-blocks, code, JS engine |
| Integration | Connection to 1C (via CommerceML), Bitrix24, payment systems |
| Documentation | Instructions for managing prices and reports |
| Training | Video tutorials or webinar for your managers |
| Support | Warranty service for 1 month |
Development timelines
| Option | Scope | Timeline |
|---|---|---|
| Simple calculator | Fixed prices, total, form | 3–5 days |
| Coefficient-based | Base price × coefficients, range | 5–8 days |
| With configurator | Price management via admin panel | 8–14 days |
Order a calculator development — get a free consultation and preliminary timeline estimate. Contact us, we'll prepare a roadmap and commercial proposal.
In addition to the standard warranty, we provide source code and documentation for the entire project. You'll always be able to modify the solution yourself or reach out for support — we're here.







