Розробка калькулятора площі/об'єму на 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка калькулятора площі/об'єму на 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка калькулятора площі/об'єму на 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% запас, ніж занизити і втратити довіру.