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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка калькулятора площади/объема на 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • 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
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

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

Калькулятор площади и объёма — базовый инструмент для сайтов строительных, отделочных, клининговых компаний и производителей материалов. Задача простая на первый взгляд: пользователь вводит размеры, получает площадь или объём. На практике всё сложнее: нужны разные типы помещений, вычеты проёмов, нестандартные формы, суммирование нескольких комнат и автоматический переход к расчёту стоимости.

Геометрические формулы

Полный набор формул для строительных расчётов:

namespace MyProject\Services\Calculators;

class GeometryCalculator
{
    // Площади помещений
    public static function rectangleArea(float $width, float $length): float
    {
        return $width * $length;
    }

    public static function lShapeArea(float $w1, float $l1, float $w2, float $l2): float
    {
        // Г-образная комната: два прямоугольника
        return self::rectangleArea($w1, $l1) + self::rectangleArea($w2, $l2);
    }

    public static function circleArea(float $radius): float
    {
        return M_PI * $radius * $radius;
    }

    public static function triangleArea(float $base, float $height): float
    {
        return 0.5 * $base * $height;
    }

    // Площадь стен комнаты (с вычетом проёмов)
    public static function wallArea(
        float $perimeter,
        float $height,
        array $openings = [] // [{width, height}, ...]
    ): float {
        $totalWall   = $perimeter * $height;
        $openingsArea = array_sum(array_map(fn($o) => $o['width'] * $o['height'], $openings));
        return max(0, $totalWall - $openingsArea);
    }

    // Объёмы
    public static function boxVolume(float $width, float $length, float $height): float
    {
        return $width * $length * $height;
    }

    public static function cylinderVolume(float $radius, float $height): float
    {
        return M_PI * $radius * $radius * $height;
    }

    // Площадь кровли с учётом уклона
    public static function roofArea(float $horizontalArea, float $slopeDegrees): float
    {
        $slopeRad = deg2rad($slopeDegrees);
        return $horizontalArea / cos($slopeRad);
    }
}

Мультикомнатный калькулятор

Расчёт нескольких помещений с накоплением итога:

class RoomCalculator {
    constructor() {
        this.rooms = [];
    }

    addRoom(params) {
        const room = {
            id:      Date.now(),
            name:    params.name || `Помещение ${this.rooms.length + 1}`,
            floor:   params.width * params.length,
            ceiling: params.width * params.length,
            walls:   this.calcWalls(params),
        };
        this.rooms.push(room);
        return room;
    }

    calcWalls(params) {
        const perimeter = 2 * (params.width + params.length);
        const totalWall = perimeter * params.height;

        const openingsArea = (params.doors || []).reduce((sum, d) => sum + d.width * d.height, 0)
            + (params.windows || []).reduce((sum, w) => sum + w.width * w.height, 0);

        return totalWall - openingsArea;
    }

    getTotal() {
        return {
            totalFloor:   this.rooms.reduce((s, r) => s + r.floor, 0),
            totalCeiling: this.rooms.reduce((s, r) => s + r.ceiling, 0),
            totalWalls:   this.rooms.reduce((s, r) => s + r.walls, 0),
            rooms:        this.rooms,
        };
    }

    removeRoom(id) {
        this.rooms = this.rooms.filter(r => r.id !== id);
    }
}

Визуальный ввод параметров

Сложность — в UX. Пользователь не всегда знает точные размеры. Помогают:

Стандартные размеры. Выбор из справочника: «стандартная панельная квартира», «студия 25м²», «однушка 38м²». Автозаполнение размеров с возможностью корректировки.

SVG-схема помещения. Интерактивный чертёж, где пользователь кликает на стену и вводит размер. Реализуется через SVG + JavaScript, никаких внешних зависимостей.

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

Связь с каталогом Битрикс

После расчёта площади — автоматический переход к подбору материалов:

// AJAX-обработчик: по площади подбираем нужное количество товаров
public function suggestMaterialsAction(float $area, string $materialType): array
{
    $norm = MaterialNormRepository::getByType($materialType);

    $rawQuantity = $area * $norm['consumption_rate'] * $norm['waste_factor'];
    $packages    = ceil($rawQuantity / $norm['package_size']);

    // Проверяем наличие на складе
    $product = \CCatalogProduct::GetByID($norm['product_id']);
    $inStock  = (int)($product['QUANTITY'] ?? 0);

    return [
        'product_id'   => $norm['product_id'],
        'product_name' => $norm['product_name'],
        'packages'     => $packages,
        'in_stock'     => $inStock,
        'enough_stock' => $inStock >= $packages,
        'can_order'    => true,
    ];
}

Сохранение и печать результатов

Для сложных объектов пользователи хотят сохранить расчёт. Реализации:

Ссылка с параметрами — расчёт кодируется в URL-параметры, ссылка сохраняется или передаётся:

const paramsStr = btoa(JSON.stringify(calcParams));
const shareUrl  = `${window.location.origin}/calculator/?calc=${paramsStr}`;

PDF-выгрузка — серверная генерация через библиотеку TCPDF или mPDF, установленную через Composer в /local/:

$pdf = new \TCPDF();
$pdf->AddPage();
$pdf->writeHTML($this->renderCalcHtml($calcResult));
$pdf->Output('calc_result.pdf', 'D'); // D = force download

Email с результатом — отправка через \Bitrix\Main\Mail\Event::sendImmediate().

Сроки

Задача Срок
Простой калькулятор площади (один тип помещения, линейный вывод) 2–4 дня
Мультикомнатный калькулятор с несколькими формами и итоговой сметой 1.5–2 недели
Калькулятор с визуальным вводом, связью с каталогом и PDF-выгрузкой 3–5 недель

Точность расчёта — главное. Ошибка на 10% в меньшую сторону означает, что клиент докупает материалы по другой (часто более высокой) цене и возвращается недовольным. Лучше добавить 5% запас явно, чем занизить и потерять доверие.