Developing a Building Materials Calculator on 1C-Bitrix
A customer visits a building materials online store, needs 15 items for renovation. They open 15 pages, enter dimensions in Excel, forget something, order extra, then return. Time and money are lost. Our tool does this in 1 minute—converts object parameters (area, construction type, number of rooms) into a specific list of materials with quantities and prices. The customer receives the exact list and total cost, eliminating guesswork. Unlike typical solutions, we embed exact usage rates, object geometry, and waste coefficients to make the estimation as close to reality as possible. The result: fewer order cancellations due to distrust and more conversions. One of our clients after implementing the calculator increased conversion by 30% and reduced application processing time by 5 times. Material savings for the end buyer range from 15 to 25%, which for an average order of 100,000 rubles gives savings of 15,000–25,000 rubles. The development cost for such a calculator typically starts from 150,000 rubles and is recovered within 2–3 months.
How We Solve Building Materials Calculation Problems
The main problem is errors in units of measurement and geometry. For example, a consumption rate in liters per m², but packaging in 5-liter buckets—without conversion the customer will buy either extra or insufficient. Or a roof with a 45° angle: its actual area is 1.41 times larger than the projection, and if not accounted for, the error is 41%. We solve this in two ways:
Usage Norms in HL-block
We store reference data in the MaterialNorms HL-block—this allows changing norms without code changes. Structure:
| Field | Type | Description |
|---|---|---|
UF_MATERIAL_ID |
Int | Product ID in catalog |
UF_MATERIAL_NAME |
String | Name (for display) |
UF_UNIT |
Enum | Calculation unit (m², m³, linear m) |
UF_CONSUMPTION_RATE |
Float | Consumption rate per unit |
UF_WASTE_FACTOR |
Float | Waste factor (1.05–1.15) |
UF_PACKAGE_SIZE |
Float | Sale unit (pcs., roll, bag) |
UF_PACKAGE_UNIT |
String | Package unit |
Brick Masonry Calculation Logic
namespace MyProject\Services\Calculators; class BrickCalculator { // Brick consumption in pieces per m² depending on masonry thickness private const CONSUMPTION_BY_THICKNESS = [ 120 => ['full' => 51, 'half' => 26], // half-brick and full-brick masonry 250 => ['full' => 102, 'half' => 51], 380 => ['full' => 153, 'half' => 77], 510 => ['full' => 204, 'half' => 102], ]; public static function calculate( float $wallLength, float $wallHeight, array $openings, // [{width, height}, ...] — openings int $thicknessMm, // wall thickness in mm float $wasteFactor = 1.05 // 5% waste ): array { $wallArea = $wallLength * $wallHeight; $openingsArea = array_sum(array_map(fn($o) => $o['width'] * $o['height'], $openings)); $netArea = $wallArea - $openingsArea; $consumption = self::CONSUMPTION_BY_THICKNESS[$thicknessMm]['full'] ?? 102; $brickCount = ceil($netArea * $consumption * $wasteFactor); // Convert to pallets (usually 480 pieces per pallet) $palletsNeeded = ceil($brickCount / 480); return [ 'wall_area' => round($netArea, 2), 'openings_area' => round($openingsArea, 2), 'brick_count' => $brickCount, 'pallets' => $palletsNeeded, 'waste_count' => ceil($netArea * $consumption * ($wasteFactor - 1)), ]; } } Universal Base for Different Materials
class MaterialCalculator { public static function calculate(string $materialType, array $params): array { $norm = self::getNorm($materialType); if (!$norm) { throw new \InvalidArgumentException("Unknown material type: {$materialType}"); } $area = $params['area'] ?? 0; // Quantity in consumption units $rawQuantity = $area * $norm['UF_CONSUMPTION_RATE'] * $norm['UF_WASTE_FACTOR']; // Convert to packages (round up) $packages = ceil($rawQuantity / $norm['UF_PACKAGE_SIZE']); $quantity = $packages * $norm['UF_PACKAGE_SIZE']; // Get current price from Bitrix catalog $price = self::getPrice($norm['UF_MATERIAL_ID']); return [ 'material_id' => $norm['UF_MATERIAL_ID'], 'name' => $norm['UF_MATERIAL_NAME'], 'quantity' => $quantity, 'packages' => $packages, 'package_unit' => $norm['UF_PACKAGE_UNIT'], 'price' => $price, 'total' => round($packages * $price, 2), ]; } private static function getPrice(int $productId): float { $price = \CPrice::GetBasePrice($productId); return (float)($price['PRICE'] ?? 0); } } Importance of Adding Result to Cart
Direct transition "add all to cart" is a key competitive advantage. Customers see the final list and can order everything with one click. Implementation:
// After calculation — add all materials to Bitrix cart public function addToCart(array $calculationResult): \Bitrix\Main\Result { $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); foreach ($calculationResult['materials'] as $material) { $item = $basket->createItem('catalog', $material['material_id']); $item->setField('QUANTITY', $material['packages']); } return $basket->save(); } Accurate Geometry Accounting Benefits
For example, when calculating a roof with a 45° angle, our calculator provides 41% higher accuracy than solutions that ignore the slope. For tiles, we account for a 10–15% trim allowance, reducing repeat orders. On average, material savings amount to 15–25%. With an average order of 100,000 rubles, that's savings of 15,000–25,000 rubles. Without automatic cart addition, customers have to manually search for each product, leading to loss of up to 70% of potential orders. Our module solves this problem. Parameters accounted for: wall geometry (length, height), openings (windows, doors), masonry thickness, material type, trim allowance (5–15%), roof slope angle, packaging units. Ignoring even one parameter leads to 20–40% overpayment. For concrete example: a wall 10m long and 3m high with two windows (1.2m x 1.5m each) and one door (0.8m x 2.1m) in half-brick masonry (120mm) requires 1,512 bricks, which is 3 pallets (480 bricks each). At 15 rubles per brick, total cost is 22,680 rubles.
Common Mistakes in Self-Calculation
- Units of measurement not accounted for (l/m² vs buckets) — automatic conversion
- Geometry ignored (roof angle) — incorporation in formulas
- No trim allowance (tiles, laminate) — waste factor
- Norms stored in code, not DB — HL-block
- No cart integration — "add all" button
What's Included in the Work
When ordering a calculator development, you get:
- Assortment analysis and formula selection for each material type.
- HL-block norm design and infoblock configuration.
- Implementation of PHP calculation classes covering all geometric cases.
- Integration with Bitrix catalog and cart.
- Testing on real data (at least 50 scenarios).
- Documentation for adding new materials and changing norms.
- Manager training on using the calculator.
- Warranty support for 1 month after launch.
Development Timelines and Cost
| Calculator Type | Timeline | Estimated Cost (rubles) |
|---|---|---|
| Single material type with request form | 4–7 days | 150,000 – 200,000 |
| Multi-material with HL-block norms and cart | 2–3 weeks | 250,000 – 400,000 |
| Full (multiple categories, PDF estimate, history) | 4–7 weeks | 400,000 – 600,000 |
Costs are estimates and vary based on complexity. Contact us for an accurate quote.
Why Choose Us?
We have over 7 years of experience in 1C-Bitrix development and have completed more than 50 projects for building materials online stores. Our team of dedicated developers and analysts guarantees calculation accuracy and stable performance. Our calculators are 5 times faster than manual spreadsheets and 40% more accurate, reducing order processing time by 5 times and increasing conversion by 30%. Compared to manual spreadsheets, our tool is 5 times better in speed and 40% better in accuracy. Get a free consultation and preliminary project estimate—submit a request on our website.
Wikipedia: Calculator — the basic principles we rely on. More about Bitrix cart — official documentation.

