Электрика ПУЭ 7 СП 76.13330

Расчёт электропроводки — калькулятор

Точки × цена, кабель по группам (3×2.5 / 3×1.5), щит с автоматами и УЗО, штробы, подключения.

Короткий ответ

Калькулятор составляет смету на электромонтаж: считает число точек (розетки, выключатели, светильники), метраж кабеля по группам (освещение 3×1.5, розетки 3×2.5, плита 3×6), комплектацию щита (автоматы, УЗО, дифавтоматы) и работы (штробы, подключения, монтаж щита).

Что считает

Источники

Калькулятор

Как пользоваться

  1. Введите площадь дома и число комнат.
  2. Задайте число точек: розетки (от 4 на комнату), выключатели (1–2 на комнату), светильники.
  3. Укажите длину кабельных трасс отдельно по группам.
  4. Выберите комплектацию щита: число автоматов, УЗО.
  5. Задайте цены на материалы и работы.
  6. Нажмите «Рассчитать» — увидите итоговую смету с разбивкой по категориям.
<!DOCTYPE html> <html lang="ru"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- ===================================================================== КАЛЬКУЛЯТОР №5 «СМЕТА ЭЛЕКТРИКИ В КВАРТИРЕ» (smetach.ru) Самодостаточный модуль: ванильный JS, без внешних библиотек и запросов. Все CSS-классы с префиксом smc-. ФОРМУЛЫ И ИСТОЧНИКИ --------------------------------------------------------------------- 1) Количество точек (дефолты, редактируются): - Розетки = ceil(Площадь / 2.5) — практический норматив «1 розетка на 2.5 м²» (усиленный вариант; минимальный норматив — не менее 1 розетки на 4 м² жилых комнат: СП 31-110-2003 п.6.2 / практика по СП 256.1325800.2016). - Выключатели = Комнаты + 2 (санузел, прихожая) — практика проектов. - Светильники = Комнаты + 2 (санузел, прихожая) — практика проектов. 2) Метраж кабеля (практические укрупнённые нормы расхода): - Розетки: ВВГнг-LS 3×2.5 = 25 м/комната + 40 м на кухню. - Свет: ВВГнг-LS 3×1.5 = 15 м/комната + 10 м (санузел+прихожая). - Варочная панель (чекбокс): ВВГнг-LS 3×6 = 15 м, автомат 32А. Марка и сечения кабеля: ГОСТ 31996-2012 (ВВГнг-LS); сечения 2.5 мм² на розетки и 1.5 мм² на свет — ПУЭ 7-е изд. гл. 7.1 (табл. 7.1.1) и СП 256.1325800.2016 п.10.2; линия электроплиты 6 мм² — СП 256.1325800.2016 п.10.3. 3) Электрощит: - Группы розеток = ceil(Розетки / 8); 1 автомат 16А на группу (розеточные группы на автоматах до 16А — ПУЭ гл. 7.1 / ГОСТ Р 50345; до 8 точек на группу — проектная практика). - Группы света = max(1, ceil(Светильники / 10)); автомат 10А. - УЗО 40А/30мА на влажные зоны — редактируемое число, дефолт 1 (обязательность УЗО 30 мА для ванных/кухонь: ПУЭ 7.1.71–7.1.72). - Вводной автомат 2P — 1 шт. - Модули = группыРозеток + группыСвета + УЗО×2 + 2 (вводной) + (варочная ? 1 : 0). - Бокс: с запасом +2 модуля, округление вверх до ряда 12/18/24/36/48 (стандартные типоразмеры боксов ABB/Legrand/IEK). 4) Прочие материалы: - Подрозетники = Розетки + Выключатели. - Гофра ПВХ = 0.8 × (весь кабель) — часть трассы идёт без гофры. - Штробление = 0.5 × (кабель 3×2.5 + 3×1.5) — остальное по потолку / в стяжке. Коэффициенты — укрупнённая сметная практика. 5) Работы (дефолты — середина 2026, прайсы elektrikclub.ru, d-mastera.ru, simferopol.dom-electric.ru; июль 2026): - Монтаж точки (розетка/выключатель/светильник под ключ): 1200 ₽. - Штробление 20×20: 350 ₽/м (кирпич/бетон — «от 350 ₽/м»). - Сборка щита: 8000 ₽. - Линия варочной панели: 2500 ₽. Материалы (ЭТМ, a-cab.ru, июль 2026): ВВГнг-LS 3×2.5 ≈ 127–150 ₽/м (дефолт 140); 3×1.5 ≈ 95 ₽/м; 3×6 ≈ 270 ₽/м; автомат 16А ≈ 350 ₽; УЗО 40А/30мА ≈ 2600 ₽; подрозетник ≈ 45 ₽; гофра ≈ 30 ₽/м; бокс 12–18 мод. ≈ 1800 ₽. ВСЕ цены редактируются в форме. ТЕСТОВЫЕ ВЕКТОРА (дефолтные цены, без изменений полей) --------------------------------------------------------------------- Вектор 1. Вход: 40 м², 1 комната, варочная ВЫКЛ, УЗО 1. Точки: розетки 16, выключатели 3, светильники 3. Кабель 3×2.5 = 65 м; 3×1.5 = 25 м. Группы: 2 розеточные, 1 света. Модули 7 → бокс 12 мод. Подрозетники 19. Гофра 72 м. Штробы 45 м. Ожидаемо: материалы 20 810 ₽; работы 50 150 ₽; ИТОГО 70 960 ₽; 1 774 ₽/м². Вектор 2. Вход: 60 м², 2 комнаты, варочная ВКЛ, УЗО 1. Точки: розетки 24, выключатели 4, светильники 4. Кабель: 90 м (2.5), 40 м (1.5), 15 м (6). Группы: 3 + 1. Модули 9 → бокс 12 мод. Подрозетники 28. Гофра 116 м. Штробы 65 м. Ожидаемо: материалы 32 310 ₽; работы 71 650 ₽; ИТОГО 103 960 ₽; 1 733 ₽/м². Вектор 3. Вход: 100 м², 3 комнаты, варочная ВЫКЛ, УЗО 1. Точки: розетки 40, выключатели 5, светильники 5. Кабель: 115 м (2.5), 55 м (1.5). Группы: 5 + 1. Модули 10 → бокс 12 мод. Подрозетники 45. Гофра 136 м. Штробы 85 м. Ожидаемо: материалы 34 800 ₽; работы 97 750 ₽; ИТОГО 132 550 ₽; 1 326 ₽/м². ===================================================================== --> <style> .smc-calc { --smc-accent: #b3541e; --smc-accent-hover: #96450f; --smc-text: #2b2b2b; --smc-muted: #6f6a63; --smc-bg: #faf8f5; --smc-card: #ffffff; --smc-border: #e2ddd5; --smc-error: #b3261e; --smc-ok-bg: #f3efe9; font-family: inherit; color: var(--smc-text); background: var(--smc-bg); border: 1px solid var(--smc-border); border-radius: 10px; padding: 24px; max-width: 860px; margin: 0 auto; box-sizing: border-box; line-height: 1.5; } .smc-calc *, .smc-calc *::before, .smc-calc *::after { box-sizing: border-box; } .smc-calc h2 { margin: 0 0 6px; font-size: 1.45rem; line-height: 1.3; color: var(--smc-text); } .smc-sub { margin: 0 0 18px; color: var(--smc-muted); font-size: 0.92rem; } .smc-section { margin-bottom: 18px; } .smc-section-title { font-size: 1.02rem; font-weight: 600; margin: 0 0 10px; padding-bottom: 6px; border-bottom: 1px solid var(--smc-border); } .smc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; } .smc-grid-2 { grid-template-columns: repeat(2, 1fr); } .smc-field label { display: block; font-size: 0.85rem; color: var(--smc-muted); margin-bottom: 4px; } .smc-input-wrap { display: flex; align-items: stretch; } .smc-calc input[type="number"], .smc-calc input[type="text"] { width: 100%; padding: 8px 10px; font-size: 0.95rem; border: 1px solid var(--smc-border); border-radius: 6px; background: var(--smc-card); color: var(--smc-text); font-family: inherit; } .smc-calc input[type="number"]:focus, .smc-calc input[type="text"]:focus { outline: 2px solid var(--smc-accent); outline-offset: -1px; } .smc-unit { display: inline-flex; align-items: center; padding: 0 10px; font-size: 0.85rem; color: var(--smc-muted); background: var(--smc-ok-bg); border: 1px solid var(--smc-border); border-left: none; border-radius: 0 6px 6px 0; white-space: nowrap; } .smc-input-wrap input { border-radius: 6px 0 0 6px; } .smc-check { display: flex; align-items: center; gap: 8px; margin-top: 12px; font-size: 0.95rem; } .smc-check input { width: 18px; height: 18px; accent-color: var(--smc-accent); } .smc-prices summary { cursor: pointer; font-weight: 600; font-size: 1.02rem; padding: 10px 0; list-style: none; } .smc-prices summary::before { content: "▸ "; color: var(--smc-accent); } .smc-prices[open] summary::before { content: "▾ "; } .smc-prices { border: 1px solid var(--smc-border); border-radius: 8px; background: var(--smc-card); padding: 4px 14px 14px; margin-bottom: 18px; } .smc-prices-note { font-size: 0.82rem; color: var(--smc-muted); margin: 0 0 12px; } .smc-btn { display: inline-block; width: 100%; padding: 13px 20px; font-size: 1.05rem; font-weight: 600; font-family: inherit; color: #fff; background: var(--smc-accent); border: none; border-radius: 8px; cursor: pointer; } .smc-btn:hover { background: var(--smc-accent-hover); } .smc-btn-ghost { background: transparent; color: var(--smc-accent); border: 1px solid var(--smc-accent); margin-top: 12px; } .smc-btn-ghost:hover { background: var(--smc-ok-bg); } .smc-errors { display: none; margin: 0 0 14px; padding: 12px 14px; border: 1px solid var(--smc-error); border-radius: 8px; color: var(--smc-error); background: #fdf3f2; font-size: 0.9rem; } .smc-errors ul { margin: 6px 0 0; padding-left: 20px; } .smc-results { display: none; margin-top: 24px; } .smc-table-wrap { overflow-x: auto; margin-bottom: 16px; } .smc-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; background: var(--smc-card); } .smc-table caption { text-align: left; font-weight: 600; font-size: 1rem; padding: 8px 0; color: var(--smc-text); } .smc-table th, .smc-table td { padding: 8px 10px; border: 1px solid var(--smc-border); text-align: right; } .smc-table th:first-child, .smc-table td:first-child { text-align: left; } .smc-table thead th { background: var(--smc-ok-bg); font-weight: 600; } .smc-table tfoot td { font-weight: 700; background: var(--smc-ok-bg); } .smc-total { display: flex; flex-wrap: wrap; gap: 14px; justify-content: space-between; align-items: baseline; padding: 16px; margin-top: 6px; background: var(--smc-ok-bg); border: 1px solid var(--smc-border); border-radius: 8px; } .smc-total-label { font-size: 1.05rem; font-weight: 600; } .smc-total-value { font-size: 1.5rem; font-weight: 700; color: var(--smc-accent); } .smc-per-m2 { font-size: 0.95rem; color: var(--smc-muted); } .smc-per-m2 b { color: var(--smc-text); } .smc-copy-note { font-size: 0.85rem; color: var(--smc-muted); margin-top: 8px; min-height: 1.2em; } .smc-disclaimer { margin-top: 18px; padding-top: 12px; font-size: 0.8rem; color: var(--smc-muted); border-top: 1px solid var(--smc-border); } @media (max-width: 700px) { .smc-grid, .smc-grid-2 { grid-template-columns: 1fr; } .smc-calc { padding: 16px; } .smc-total-value { font-size: 1.25rem; } } </style> <body> <div class="smc-calc" id="smcCalc"> <h2>Калькулятор сметы электрики в квартире</h2> <p class="smc-sub">Материалы и работы для полной замены электропроводки: кабель, щит, точки, монтаж.</p> <div class="smc-errors" id="smcErrors" role="alert"></div> <form id="smcForm" novalidate> <div class="smc-section"> <p class="smc-section-title">Параметры квартиры</p> <div class="smc-grid"> <div class="smc-field"> <label for="smcArea">Площадь квартиры</label> <div class="smc-input-wrap"> <input type="number" id="smcArea" min="10" max="300" step="0.5" value="50" required> <span class="smc-unit">м²</span> </div> </div> <div class="smc-field"> <label for="smcRooms">Количество комнат</label> <div class="smc-input-wrap"> <input type="number" id="smcRooms" min="1" max="6" step="1" value="2" required> <span class="smc-unit">шт</span> </div> </div> <div class="smc-field"> <label for="smcUzo">УЗО на влажные зоны (ванная, кухня)</label> <div class="smc-input-wrap"> <input type="number" id="smcUzo" min="0" max="4" step="1" value="1" required> <span class="smc-unit">шт</span> </div> </div> </div> <label class="smc-check"> <input type="checkbox" id="smcHob"> <span>Электрическая варочная панель (отдельная линия ВВГнг-LS 3×6, 15 м, автомат 32А)</span> </label> </div> <div class="smc-section"> <p class="smc-section-title">Электроточки <span style="font-weight:400;font-size:0.82rem;color:var(--smc-muted)">(заполнены по площади — можно изменить)</span></p> <div class="smc-grid"> <div class="smc-field"> <label for="smcSockets">Розетки (~1 шт на 2,5 м²)</label> <div class="smc-input-wrap"> <input type="number" id="smcSockets" min="1" max="200" step="1" value="20" required> <span class="smc-unit">шт</span> </div> </div> <div class="smc-field"> <label for="smcSwitches">Выключатели</label> <div class="smc-input-wrap"> <input type="number" id="smcSwitches" min="0" max="60" step="1" value="4" required> <span class="smc-unit">шт</span> </div> </div> <div class="smc-field"> <label for="smcLights">Светильники / точки света</label> <div class="smc-input-wrap"> <input type="number" id="smcLights" min="0" max="100" step="1" value="4" required> <span class="smc-unit">шт</span> </div> </div> </div> </div> <details class="smc-prices"> <summary>Цены на материалы и работы</summary> <p class="smc-prices-note">Цены ориентировочные (середина 2026 г.). Все поля можно редактировать под ваш регион и поставщика.</p> <div class="smc-grid smc-grid-2"> <div class="smc-field"><label for="smcP25">Кабель ВВГнг-LS 3×2,5 (розетки)</label> <div class="smc-input-wrap"><input type="number" id="smcP25" min="1" max="5000" step="1" value="140"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcP15">Кабель ВВГнг-LS 3×1,5 (свет)</label> <div class="smc-input-wrap"><input type="number" id="smcP15" min="1" max="5000" step="1" value="95"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcP6">Кабель ВВГнг-LS 3×6 (варочная)</label> <div class="smc-input-wrap"><input type="number" id="smcP6" min="1" max="5000" step="1" value="270"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcPAuto16">Автомат 16А (группа розеток)</label> <div class="smc-input-wrap"><input type="number" id="smcPAuto16" min="1" max="20000" step="10" value="350"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPAuto10">Автомат 10А (группа света)</label> <div class="smc-input-wrap"><input type="number" id="smcPAuto10" min="1" max="20000" step="10" value="320"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPAuto32">Автомат 32А (варочная)</label> <div class="smc-input-wrap"><input type="number" id="smcPAuto32" min="1" max="20000" step="10" value="450"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPAutoMain">Вводной автомат 2P 40А</label> <div class="smc-input-wrap"><input type="number" id="smcPAutoMain" min="1" max="50000" step="10" value="900"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPUzo">УЗО 40А / 30 мА</label> <div class="smc-input-wrap"><input type="number" id="smcPUzo" min="1" max="50000" step="50" value="2600"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPBox">Бокс электрощита</label> <div class="smc-input-wrap"><input type="number" id="smcPBox" min="1" max="100000" step="50" value="1800"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPPodr">Подрозетник</label> <div class="smc-input-wrap"><input type="number" id="smcPPodr" min="1" max="2000" step="1" value="45"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPGofra">Гофра ПВХ 16–20 мм</label> <div class="smc-input-wrap"><input type="number" id="smcPGofra" min="1" max="1000" step="1" value="30"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcWPoint">Монтаж точки под ключ</label> <div class="smc-input-wrap"><input type="number" id="smcWPoint" min="1" max="20000" step="50" value="1200"><span class="smc-unit">₽/точка</span></div></div> <div class="smc-field"><label for="smcWShtroba">Штробление 20×20</label> <div class="smc-input-wrap"><input type="number" id="smcWShtroba" min="1" max="5000" step="10" value="350"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcWShield">Сборка и подключение щита</label> <div class="smc-input-wrap"><input type="number" id="smcWShield" min="0" max="200000" step="500" value="8000"><span class="smc-unit">₽</span></div></div> <div class="smc-field"><label for="smcWHob">Монтаж линии варочной панели</label> <div class="smc-input-wrap"><input type="number" id="smcWHob" min="0" max="100000" step="100" value="2500"><span class="smc-unit">₽</span></div></div> </div> </details> <button type="submit" class="smc-btn">Рассчитать</button> </form> <div class="smc-results" id="smcResults"> <div class="smc-table-wrap"> <table class="smc-table" id="smcMatTable"> <caption>Материалы</caption> <thead><tr><th>Наименование</th><th>Кол-во</th><th>Цена</th><th>Сумма</th></tr></thead> <tbody></tbody> <tfoot></tfoot> </table> </div> <div class="smc-table-wrap"> <table class="smc-table" id="smcWorkTable"> <caption>Работы</caption> <thead><tr><th>Наименование</th><th>Кол-во</th><th>Цена</th><th>Сумма</th></tr></thead> <tbody></tbody> <tfoot></tfoot> </table> </div> <div class="smc-total"> <span class="smc-total-label">Итого смета (материалы + работы)</span> <span class="smc-total-value" id="smcGrandTotal">—</span> <span class="smc-per-m2" id="smcPerM2"></span> </div> <button type="button" class="smc-btn smc-btn-ghost" id="smcCopy">Скопировать смету</button> <div class="smc-copy-note" id="smcCopyNote"></div> </div> <p class="smc-disclaimer">Расчёт ориентировочный, не является офертой. Фактический метраж кабеля, состав щита и стоимость работ зависят от планировки, материала стен и выбранного оборудования и определяются после замера.</p> </div> <script> (function () { "use strict"; var $ = function (id) { return document.getElementById(id); }; var fmt = function (n) { return Math.round(n).toLocaleString("ru-RU"); }; var fmtMoney = function (n) { return fmt(n) + " ₽"; }; /* ---- Автодефолты точек по площади/комнатам (не трогаем поля, которые пользователь редактировал вручную) ---- */ var dirty = { smcSockets: false, smcSwitches: false, smcLights: false }; ["smcSockets", "smcSwitches", "smcLights"].forEach(function (id) { $(id).addEventListener("input", function () { dirty[id] = true; }); }); function applyDefaults() { var area = parseFloat($("smcArea").value); var rooms = parseInt($("smcRooms").value, 10); if (isFinite(area) && area > 0 && !dirty.smcSockets) { $("smcSockets").value = Math.max(1, Math.ceil(area / 2.5)); } if (isFinite(rooms) && rooms > 0) { if (!dirty.smcSwitches) $("smcSwitches").value = rooms + 2; if (!dirty.smcLights) $("smcLights").value = rooms + 2; } } $("smcArea").addEventListener("input", applyDefaults); $("smcRooms").addEventListener("input", applyDefaults); applyDefaults(); /* ---- Чтение и валидация полей ---- */ function readNum(id, label, min, max, errors, isInt) { var raw = $(id).value.trim(); var v = parseFloat(raw); if (raw === "" || !isFinite(v)) { errors.push("Поле «" + label + "» не заполнено или содержит не число."); return 0; } if (isInt && Math.abs(v - Math.round(v)) > 1e-9) { errors.push("Поле «" + label + "» должно быть целым числом."); return 0; } if (v < min || v > max) { errors.push("Поле «" + label + "»: допустимо от " + min + " до " + max + "."); return 0; } return v; } function pickBoxes(needModules) { var sizes = [12, 18, 24, 36, 48]; var boxes = []; var n = needModules; while (n > 48) { boxes.push(48); n -= 48; } for (var i = 0; i < sizes.length; i++) { if (sizes[i] >= n) { boxes.push(sizes[i]); break; } } return boxes; } var lastText = ""; function calculate(e) { e.preventDefault(); var errors = []; var area = readNum("smcArea", "Площадь квартиры", 10, 300, errors, false); var rooms = readNum("smcRooms", "Количество комнат", 1, 6, errors, true); var uzos = readNum("smcUzo", "УЗО на влажные зоны", 0, 4, errors, true); var sockets = readNum("smcSockets", "Розетки", 1, 200, errors, true); var switches = readNum("smcSwitches", "Выключатели", 0, 60, errors, true); var lights = readNum("smcLights", "Светильники", 0, 100, errors, true); var hob = $("smcHob").checked; var p25 = readNum("smcP25", "Кабель 3×2,5", 1, 5000, errors, false); var p15 = readNum("smcP15", "Кабель 3×1,5", 1, 5000, errors, false); var p6 = readNum("smcP6", "Кабель 3×6", 1, 5000, errors, false); var pA16 = readNum("smcPAuto16", "Автомат 16А", 1, 20000, errors, false); var pA10 = readNum("smcPAuto10", "Автомат 10А", 1, 20000, errors, false); var pA32 = readNum("smcPAuto32", "Автомат 32А", 1, 20000, errors, false); var pAMain = readNum("smcPAutoMain", "Вводной автомат", 1, 50000, errors, false); var pUzo = readNum("smcPUzo", "УЗО 40А/30мА", 1, 50000, errors, false); var pBox = readNum("smcPBox", "Бокс электрощита", 1, 100000, errors, false); var pPodr = readNum("smcPPodr", "Подрозетник", 1, 2000, errors, false); var pGofra = readNum("smcPGofra", "Гофра ПВХ", 1, 1000, errors, false); var wPoint = readNum("smcWPoint", "Монтаж точки", 1, 20000, errors, false); var wShtr = readNum("smcWShtroba", "Штробление", 1, 5000, errors, false); var wShield= readNum("smcWShield", "Сборка щита", 0, 200000, errors, false); var wHob = readNum("smcWHob", "Линия варочной", 0, 100000, errors, false); var errBox = $("smcErrors"); if (errors.length) { errBox.innerHTML = "<b>Проверьте введённые данные:</b><ul><li>" + errors.join("</li><li>") + "</li></ul>"; errBox.style.display = "block"; $("smcResults").style.display = "none"; errBox.scrollIntoView({ behavior: "smooth", block: "center" }); return; } errBox.style.display = "none"; /* ---- Расчёт количеств ---- */ var cable25 = rooms * 25 + 40; // розетки: 25 м/комн + 40 м кухня var cable15 = rooms * 15 + 10; // свет: 15 м/комн + 10 м var cable6 = hob ? 15 : 0; // варочная линия var socketGroups = Math.ceil(sockets / 8); var lightGroups = Math.max(1, Math.ceil(lights / 10)); var hobBreaker = hob ? 1 : 0; var modules = socketGroups + lightGroups + uzos * 2 + 2 + hobBreaker; var boxes = pickBoxes(modules + 2); // +2 модуля запаса var podrozetniki = sockets + switches; var gofra = Math.round((cable25 + cable15 + cable6) * 0.8); var shtroba = Math.round((cable25 + cable15) * 0.5); var points = sockets + switches + lights; /* ---- Таблица материалов ---- */ var mat = []; mat.push({ name: "Кабель ВВГнг-LS 3×2,5 (розеточные группы)", qty: cable25 + " м", price: p25, sum: cable25 * p25 }); mat.push({ name: "Кабель ВВГнг-LS 3×1,5 (группы освещения)", qty: cable15 + " м", price: p15, sum: cable15 * p15 }); if (hob) mat.push({ name: "Кабель ВВГнг-LS 3×6 (варочная панель)", qty: cable6 + " м", price: p6, sum: cable6 * p6 }); mat.push({ name: "Автоматический выключатель 16А (групп розеток: " + socketGroups + ")", qty: socketGroups + " шт", price: pA16, sum: socketGroups * pA16 }); mat.push({ name: "Автоматический выключатель 10А (групп света: " + lightGroups + ")", qty: lightGroups + " шт", price: pA10, sum: lightGroups * pA10 }); if (hob) mat.push({ name: "Автоматический выключатель 32А (варочная)", qty: "1 шт", price: pA32, sum: pA32 }); mat.push({ name: "Вводной автомат 2P 40А", qty: "1 шт", price: pAMain, sum: pAMain }); if (uzos > 0) mat.push({ name: "УЗО 40А / 30 мА (влажные зоны)", qty: uzos + " шт", price: pUzo, sum: uzos * pUzo }); var boxLabel = boxes.map(function (b) { return b + " мод."; }).join(" + "); mat.push({ name: "Бокс электрощита (" + boxLabel + "; всего " + modules + " модулей занято)", qty: boxes.length + " шт", price: pBox, sum: boxes.length * pBox }); mat.push({ name: "Подрозетники", qty: podrozetniki + " шт", price: pPodr, sum: podrozetniki * pPodr }); mat.push({ name: "Гофра ПВХ 16–20 мм", qty: gofra + " м", price: pGofra, sum: gofra * pGofra }); /* ---- Таблица работ ---- */ var work = []; work.push({ name: "Монтаж точек под ключ (розетки, выключатели, светильники)", qty: points + " точек", price: wPoint, sum: points * wPoint }); work.push({ name: "Штробление 20×20 под кабель", qty: shtroba + " м", price: wShtr, sum: shtroba * wShtr }); work.push({ name: "Сборка и подключение электрощита", qty: "1 усл.", price: wShield, sum: wShield }); if (hob) work.push({ name: "Монтаж отдельной линии варочной панели", qty: "1 усл.", price: wHob, sum: wHob }); var matTotal = mat.reduce(function (s, r) { return s + r.sum; }, 0); var workTotal = work.reduce(function (s, r) { return s + r.sum; }, 0); var grand = matTotal + workTotal; var perM2 = grand / area; /* ---- Рендер ---- */ function render(tableId, rows, total) { var t = $(tableId); var tb = t.querySelector("tbody"); var tf = t.querySelector("tfoot"); tb.innerHTML = rows.map(function (r) { return "<tr><td>" + r.name + "</td><td>" + r.qty + "</td><td>" + fmtMoney(r.price) + "</td><td>" + fmtMoney(r.sum) + "</td></tr>"; }).join(""); tf.innerHTML = "<tr><td colspan=\"3\">Итого</td><td>" + fmtMoney(total) + "</td></tr>"; } render("smcMatTable", mat, matTotal); render("smcWorkTable", work, workTotal); $("smcGrandTotal").textContent = fmtMoney(grand); $("smcPerM2").innerHTML = "Это <b>" + fmtMoney(perM2) + "</b> за 1 м² при площади " + area.toLocaleString("ru-RU") + " м²"; $("smcResults").style.display = "block"; $("smcCopyNote").textContent = ""; /* ---- Текст для буфера обмена ---- */ var lines = []; lines.push("СМЕТА ЭЛЕКТРИКИ В КВАРТИРЕ (расчёт ориентировочный, не оферта)"); lines.push("Площадь: " + area.toLocaleString("ru-RU") + " м²; комнат: " + rooms + "; розеток: " + sockets + "; выключателей: " + switches + "; светильников: " + lights + (hob ? "; варочная панель: да" : "")); lines.push(""); lines.push("МАТЕРИАЛЫ:"); mat.forEach(function (r) { lines.push("- " + r.name + " — " + r.qty + " × " + fmtMoney(r.price) + " = " + fmtMoney(r.sum)); }); lines.push("Итого материалы: " + fmtMoney(matTotal)); lines.push(""); lines.push("РАБОТЫ:"); work.forEach(function (r) { lines.push("- " + r.name + " — " + r.qty + " × " + fmtMoney(r.price) + " = " + fmtMoney(r.sum)); }); lines.push("Итого работы: " + fmtMoney(workTotal)); lines.push(""); lines.push("ИТОГО СМЕТА: " + fmtMoney(grand) + " (" + fmtMoney(perM2) + " за 1 м²)"); lastText = lines.join("\n"); } $("smcForm").addEventListener("submit", calculate); /* ---- Копирование сметы ---- */ $("smcCopy").addEventListener("click", function () { var note = $("smcCopyNote"); function done(ok) { note.textContent = ok ? "Смета скопирована в буфер обмена." : "Не удалось скопировать автоматически — выделите текст таблиц вручную."; } if (!lastText) { done(false); return; } if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(lastText).then(function () { done(true); }, function () { fallback(); }); } else { fallback(); } function fallback() { var ta = document.createElement("textarea"); ta.value = lastText; ta.style.position = "fixed"; ta.style.opacity = "0"; document.body.appendChild(ta); ta.select(); var ok = false; try { ok = document.execCommand("copy"); } catch (e) { ok = false; } document.body.removeChild(ta); done(ok); } }); })(); </script> </body> </html> <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Калькулятор: Смета электрики в квартире — Сметач</title> <!-- ===================================================================== КАЛЬКУЛЯТОР №5 «СМЕТА ЭЛЕКТРИКИ В КВАРТИРЕ» (smetach.ru) Самодостаточный модуль: ванильный JS, без внешних библиотек и запросов. Все CSS-классы с префиксом smc-. ФОРМУЛЫ И ИСТОЧНИКИ --------------------------------------------------------------------- 1) Количество точек (дефолты, редактируются): - Розетки = ceil(Площадь / 2.5) — практический норматив «1 розетка на 2.5 м²» (усиленный вариант; минимальный норматив — не менее 1 розетки на 4 м² жилых комнат: СП 31-110-2003 п.6.2 / практика по СП 256.1325800.2016). - Выключатели = Комнаты + 2 (санузел, прихожая) — практика проектов. - Светильники = Комнаты + 2 (санузел, прихожая) — практика проектов. 2) Метраж кабеля (практические укрупнённые нормы расхода): - Розетки: ВВГнг-LS 3×2.5 = 25 м/комната + 40 м на кухню. - Свет: ВВГнг-LS 3×1.5 = 15 м/комната + 10 м (санузел+прихожая). - Варочная панель (чекбокс): ВВГнг-LS 3×6 = 15 м, автомат 32А. Марка и сечения кабеля: ГОСТ 31996-2012 (ВВГнг-LS); сечения 2.5 мм² на розетки и 1.5 мм² на свет — ПУЭ 7-е изд. гл. 7.1 (табл. 7.1.1) и СП 256.1325800.2016 п.10.2; линия электроплиты 6 мм² — СП 256.1325800.2016 п.10.3. 3) Электрощит: - Группы розеток = ceil(Розетки / 8); 1 автомат 16А на группу (розеточные группы на автоматах до 16А — ПУЭ гл. 7.1 / ГОСТ Р 50345; до 8 точек на группу — проектная практика). - Группы света = max(1, ceil(Светильники / 10)); автомат 10А. - УЗО 40А/30мА на влажные зоны — редактируемое число, дефолт 1 (обязательность УЗО 30 мА для ванных/кухонь: ПУЭ 7.1.71–7.1.72). - Вводной автомат 2P — 1 шт. - Модули = группыРозеток + группыСвета + УЗО×2 + 2 (вводной) + (варочная ? 1 : 0). - Бокс: с запасом +2 модуля, округление вверх до ряда 12/18/24/36/48 (стандартные типоразмеры боксов ABB/Legrand/IEK). 4) Прочие материалы: - Подрозетники = Розетки + Выключатели. - Гофра ПВХ = 0.8 × (весь кабель) — часть трассы идёт без гофры. - Штробление = 0.5 × (кабель 3×2.5 + 3×1.5) — остальное по потолку / в стяжке. Коэффициенты — укрупнённая сметная практика. 5) Работы (дефолты — середина 2026, прайсы elektrikclub.ru, d-mastera.ru, simferopol.dom-electric.ru; июль 2026): - Монтаж точки (розетка/выключатель/светильник под ключ): 1200 ₽. - Штробление 20×20: 350 ₽/м (кирпич/бетон — «от 350 ₽/м»). - Сборка щита: 8000 ₽. - Линия варочной панели: 2500 ₽. Материалы (ЭТМ, a-cab.ru, июль 2026): ВВГнг-LS 3×2.5 ≈ 127–150 ₽/м (дефолт 140); 3×1.5 ≈ 95 ₽/м; 3×6 ≈ 270 ₽/м; автомат 16А ≈ 350 ₽; УЗО 40А/30мА ≈ 2600 ₽; подрозетник ≈ 45 ₽; гофра ≈ 30 ₽/м; бокс 12–18 мод. ≈ 1800 ₽. ВСЕ цены редактируются в форме. ТЕСТОВЫЕ ВЕКТОРА (дефолтные цены, без изменений полей) --------------------------------------------------------------------- Вектор 1. Вход: 40 м², 1 комната, варочная ВЫКЛ, УЗО 1. Точки: розетки 16, выключатели 3, светильники 3. Кабель 3×2.5 = 65 м; 3×1.5 = 25 м. Группы: 2 розеточные, 1 света. Модули 7 → бокс 12 мод. Подрозетники 19. Гофра 72 м. Штробы 45 м. Ожидаемо: материалы 20 810 ₽; работы 50 150 ₽; ИТОГО 70 960 ₽; 1 774 ₽/м². Вектор 2. Вход: 60 м², 2 комнаты, варочная ВКЛ, УЗО 1. Точки: розетки 24, выключатели 4, светильники 4. Кабель: 90 м (2.5), 40 м (1.5), 15 м (6). Группы: 3 + 1. Модули 9 → бокс 12 мод. Подрозетники 28. Гофра 116 м. Штробы 65 м. Ожидаемо: материалы 32 310 ₽; работы 71 650 ₽; ИТОГО 103 960 ₽; 1 733 ₽/м². Вектор 3. Вход: 100 м², 3 комнаты, варочная ВЫКЛ, УЗО 1. Точки: розетки 40, выключатели 5, светильники 5. Кабель: 115 м (2.5), 55 м (1.5). Группы: 5 + 1. Модули 10 → бокс 12 мод. Подрозетники 45. Гофра 136 м. Штробы 85 м. Ожидаемо: материалы 34 800 ₽; работы 97 750 ₽; ИТОГО 132 550 ₽; 1 326 ₽/м². ===================================================================== --> <style> .smc-calc { --smc-accent: #b3541e; --smc-accent-hover: #96450f; --smc-text: #2b2b2b; --smc-muted: #6f6a63; --smc-bg: #faf8f5; --smc-card: #ffffff; --smc-border: #e2ddd5; --smc-error: #b3261e; --smc-ok-bg: #f3efe9; font-family: inherit; color: var(--smc-text); background: var(--smc-bg); border: 1px solid var(--smc-border); border-radius: 10px; padding: 24px; max-width: 860px; margin: 0 auto; box-sizing: border-box; line-height: 1.5; } .smc-calc *, .smc-calc *::before, .smc-calc *::after { box-sizing: border-box; } .smc-calc h2 { margin: 0 0 6px; font-size: 1.45rem; line-height: 1.3; color: var(--smc-text); } .smc-sub { margin: 0 0 18px; color: var(--smc-muted); font-size: 0.92rem; } .smc-section { margin-bottom: 18px; } .smc-section-title { font-size: 1.02rem; font-weight: 600; margin: 0 0 10px; padding-bottom: 6px; border-bottom: 1px solid var(--smc-border); } .smc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; } .smc-grid-2 { grid-template-columns: repeat(2, 1fr); } .smc-field label { display: block; font-size: 0.85rem; color: var(--smc-muted); margin-bottom: 4px; } .smc-input-wrap { display: flex; align-items: stretch; } .smc-calc input[type="number"], .smc-calc input[type="text"] { width: 100%; padding: 8px 10px; font-size: 0.95rem; border: 1px solid var(--smc-border); border-radius: 6px; background: var(--smc-card); color: var(--smc-text); font-family: inherit; } .smc-calc input[type="number"]:focus, .smc-calc input[type="text"]:focus { outline: 2px solid var(--smc-accent); outline-offset: -1px; } .smc-unit { display: inline-flex; align-items: center; padding: 0 10px; font-size: 0.85rem; color: var(--smc-muted); background: var(--smc-ok-bg); border: 1px solid var(--smc-border); border-left: none; border-radius: 0 6px 6px 0; white-space: nowrap; } .smc-input-wrap input { border-radius: 6px 0 0 6px; } .smc-check { display: flex; align-items: center; gap: 8px; margin-top: 12px; font-size: 0.95rem; } .smc-check input { width: 18px; height: 18px; accent-color: var(--smc-accent); } .smc-prices summary { cursor: pointer; font-weight: 600; font-size: 1.02rem; padding: 10px 0; list-style: none; } .smc-prices summary::before { content: "▸ "; color: var(--smc-accent); } .smc-prices[open] summary::before { content: "▾ "; } .smc-prices { border: 1px solid var(--smc-border); border-radius: 8px; background: var(--smc-card); padding: 4px 14px 14px; margin-bottom: 18px; } .smc-prices-note { font-size: 0.82rem; color: var(--smc-muted); margin: 0 0 12px; } .smc-btn { display: inline-block; width: 100%; padding: 13px 20px; font-size: 1.05rem; font-weight: 600; font-family: inherit; color: #fff; background: var(--smc-accent); border: none; border-radius: 8px; cursor: pointer; } .smc-btn:hover { background: var(--smc-accent-hover); } .smc-btn-ghost { background: transparent; color: var(--smc-accent); border: 1px solid var(--smc-accent); margin-top: 12px; } .smc-btn-ghost:hover { background: var(--smc-ok-bg); } .smc-errors { display: none; margin: 0 0 14px; padding: 12px 14px; border: 1px solid var(--smc-error); border-radius: 8px; color: var(--smc-error); background: #fdf3f2; font-size: 0.9rem; } .smc-errors ul { margin: 6px 0 0; padding-left: 20px; } .smc-results { display: none; margin-top: 24px; } .smc-table-wrap { overflow-x: auto; margin-bottom: 16px; } .smc-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; background: var(--smc-card); } .smc-table caption { text-align: left; font-weight: 600; font-size: 1rem; padding: 8px 0; color: var(--smc-text); } .smc-table th, .smc-table td { padding: 8px 10px; border: 1px solid var(--smc-border); text-align: right; } .smc-table th:first-child, .smc-table td:first-child { text-align: left; } .smc-table thead th { background: var(--smc-ok-bg); font-weight: 600; } .smc-table tfoot td { font-weight: 700; background: var(--smc-ok-bg); } .smc-total { display: flex; flex-wrap: wrap; gap: 14px; justify-content: space-between; align-items: baseline; padding: 16px; margin-top: 6px; background: var(--smc-ok-bg); border: 1px solid var(--smc-border); border-radius: 8px; } .smc-total-label { font-size: 1.05rem; font-weight: 600; } .smc-total-value { font-size: 1.5rem; font-weight: 700; color: var(--smc-accent); } .smc-per-m2 { font-size: 0.95rem; color: var(--smc-muted); } .smc-per-m2 b { color: var(--smc-text); } .smc-copy-note { font-size: 0.85rem; color: var(--smc-muted); margin-top: 8px; min-height: 1.2em; } .smc-disclaimer { margin-top: 18px; padding-top: 12px; font-size: 0.8rem; color: var(--smc-muted); border-top: 1px solid var(--smc-border); } @media (max-width: 700px) { .smc-grid, .smc-grid-2 { grid-template-columns: 1fr; } .smc-calc { padding: 16px; } .smc-total-value { font-size: 1.25rem; } } </style> </head> <div class="smc-calc" id="smcCalc"> <h2>Калькулятор сметы электрики в квартире</h2> <p class="smc-sub">Материалы и работы для полной замены электропроводки: кабель, щит, точки, монтаж.</p> <div class="smc-errors" id="smcErrors" role="alert"></div> <form id="smcForm" novalidate> <div class="smc-section"> <p class="smc-section-title">Параметры квартиры</p> <div class="smc-grid"> <div class="smc-field"> <label for="smcArea">Площадь квартиры</label> <div class="smc-input-wrap"> <input type="number" id="smcArea" min="10" max="300" step="0.5" value="50" required> <span class="smc-unit">м²</span> </div> </div> <div class="smc-field"> <label for="smcRooms">Количество комнат</label> <div class="smc-input-wrap"> <input type="number" id="smcRooms" min="1" max="6" step="1" value="2" required> <span class="smc-unit">шт</span> </div> </div> <div class="smc-field"> <label for="smcUzo">УЗО на влажные зоны (ванная, кухня)</label> <div class="smc-input-wrap"> <input type="number" id="smcUzo" min="0" max="4" step="1" value="1" required> <span class="smc-unit">шт</span> </div> </div> </div> <label class="smc-check"> <input type="checkbox" id="smcHob"> <span>Электрическая варочная панель (отдельная линия ВВГнг-LS 3×6, 15 м, автомат 32А)</span> </label> </div> <div class="smc-section"> <p class="smc-section-title">Электроточки <span style="font-weight:400;font-size:0.82rem;color:var(--smc-muted)">(заполнены по площади — можно изменить)</span></p> <div class="smc-grid"> <div class="smc-field"> <label for="smcSockets">Розетки (~1 шт на 2,5 м²)</label> <div class="smc-input-wrap"> <input type="number" id="smcSockets" min="1" max="200" step="1" value="20" required> <span class="smc-unit">шт</span> </div> </div> <div class="smc-field"> <label for="smcSwitches">Выключатели</label> <div class="smc-input-wrap"> <input type="number" id="smcSwitches" min="0" max="60" step="1" value="4" required> <span class="smc-unit">шт</span> </div> </div> <div class="smc-field"> <label for="smcLights">Светильники / точки света</label> <div class="smc-input-wrap"> <input type="number" id="smcLights" min="0" max="100" step="1" value="4" required> <span class="smc-unit">шт</span> </div> </div> </div> </div> <details class="smc-prices"> <summary>Цены на материалы и работы</summary> <p class="smc-prices-note">Цены ориентировочные (середина 2026 г.). Все поля можно редактировать под ваш регион и поставщика.</p> <div class="smc-grid smc-grid-2"> <div class="smc-field"><label for="smcP25">Кабель ВВГнг-LS 3×2,5 (розетки)</label> <div class="smc-input-wrap"><input type="number" id="smcP25" min="1" max="5000" step="1" value="140"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcP15">Кабель ВВГнг-LS 3×1,5 (свет)</label> <div class="smc-input-wrap"><input type="number" id="smcP15" min="1" max="5000" step="1" value="95"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcP6">Кабель ВВГнг-LS 3×6 (варочная)</label> <div class="smc-input-wrap"><input type="number" id="smcP6" min="1" max="5000" step="1" value="270"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcPAuto16">Автомат 16А (группа розеток)</label> <div class="smc-input-wrap"><input type="number" id="smcPAuto16" min="1" max="20000" step="10" value="350"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPAuto10">Автомат 10А (группа света)</label> <div class="smc-input-wrap"><input type="number" id="smcPAuto10" min="1" max="20000" step="10" value="320"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPAuto32">Автомат 32А (варочная)</label> <div class="smc-input-wrap"><input type="number" id="smcPAuto32" min="1" max="20000" step="10" value="450"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPAutoMain">Вводной автомат 2P 40А</label> <div class="smc-input-wrap"><input type="number" id="smcPAutoMain" min="1" max="50000" step="10" value="900"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPUzo">УЗО 40А / 30 мА</label> <div class="smc-input-wrap"><input type="number" id="smcPUzo" min="1" max="50000" step="50" value="2600"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPBox">Бокс электрощита</label> <div class="smc-input-wrap"><input type="number" id="smcPBox" min="1" max="100000" step="50" value="1800"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPPodr">Подрозетник</label> <div class="smc-input-wrap"><input type="number" id="smcPPodr" min="1" max="2000" step="1" value="45"><span class="smc-unit">₽/шт</span></div></div> <div class="smc-field"><label for="smcPGofra">Гофра ПВХ 16–20 мм</label> <div class="smc-input-wrap"><input type="number" id="smcPGofra" min="1" max="1000" step="1" value="30"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcWPoint">Монтаж точки под ключ</label> <div class="smc-input-wrap"><input type="number" id="smcWPoint" min="1" max="20000" step="50" value="1200"><span class="smc-unit">₽/точка</span></div></div> <div class="smc-field"><label for="smcWShtroba">Штробление 20×20</label> <div class="smc-input-wrap"><input type="number" id="smcWShtroba" min="1" max="5000" step="10" value="350"><span class="smc-unit">₽/м</span></div></div> <div class="smc-field"><label for="smcWShield">Сборка и подключение щита</label> <div class="smc-input-wrap"><input type="number" id="smcWShield" min="0" max="200000" step="500" value="8000"><span class="smc-unit">₽</span></div></div> <div class="smc-field"><label for="smcWHob">Монтаж линии варочной панели</label> <div class="smc-input-wrap"><input type="number" id="smcWHob" min="0" max="100000" step="100" value="2500"><span class="smc-unit">₽</span></div></div> </div> </details> <button type="submit" class="smc-btn">Рассчитать</button> </form> <div class="smc-results" id="smcResults"> <div class="smc-table-wrap"> <table class="smc-table" id="smcMatTable"> <caption>Материалы</caption> <thead><tr><th>Наименование</th><th>Кол-во</th><th>Цена</th><th>Сумма</th></tr></thead> <tbody></tbody> <tfoot></tfoot> </table> </div> <div class="smc-table-wrap"> <table class="smc-table" id="smcWorkTable"> <caption>Работы</caption> <thead><tr><th>Наименование</th><th>Кол-во</th><th>Цена</th><th>Сумма</th></tr></thead> <tbody></tbody> <tfoot></tfoot> </table> </div> <div class="smc-total"> <span class="smc-total-label">Итого смета (материалы + работы)</span> <span class="smc-total-value" id="smcGrandTotal">—</span> <span class="smc-per-m2" id="smcPerM2"></span> </div> <button type="button" class="smc-btn smc-btn-ghost" id="smcCopy">Скопировать смету</button> <div class="smc-copy-note" id="smcCopyNote"></div> </div> <p class="smc-disclaimer">Расчёт ориентировочный, не является офертой. Фактический метраж кабеля, состав щита и стоимость работ зависят от планировки, материала стен и выбранного оборудования и определяются после замера.</p> </div> <script> (function () { "use strict"; var $ = function (id) { return document.getElementById(id); }; var fmt = function (n) { return Math.round(n).toLocaleString("ru-RU"); }; var fmtMoney = function (n) { return fmt(n) + " ₽"; }; /* ---- Автодефолты точек по площади/комнатам (не трогаем поля, которые пользователь редактировал вручную) ---- */ var dirty = { smcSockets: false, smcSwitches: false, smcLights: false }; ["smcSockets", "smcSwitches", "smcLights"].forEach(function (id) { $(id).addEventListener("input", function () { dirty[id] = true; }); }); function applyDefaults() { var area = parseFloat($("smcArea").value); var rooms = parseInt($("smcRooms").value, 10); if (isFinite(area) && area > 0 && !dirty.smcSockets) { $("smcSockets").value = Math.max(1, Math.ceil(area / 2.5)); } if (isFinite(rooms) && rooms > 0) { if (!dirty.smcSwitches) $("smcSwitches").value = rooms + 2; if (!dirty.smcLights) $("smcLights").value = rooms + 2; } } $("smcArea").addEventListener("input", applyDefaults); $("smcRooms").addEventListener("input", applyDefaults); applyDefaults(); /* ---- Чтение и валидация полей ---- */ function readNum(id, label, min, max, errors, isInt) { var raw = $(id).value.trim(); var v = parseFloat(raw); if (raw === "" || !isFinite(v)) { errors.push("Поле «" + label + "» не заполнено или содержит не число."); return 0; } if (isInt && Math.abs(v - Math.round(v)) > 1e-9) { errors.push("Поле «" + label + "» должно быть целым числом."); return 0; } if (v < min || v > max) { errors.push("Поле «" + label + "»: допустимо от " + min + " до " + max + "."); return 0; } return v; } function pickBoxes(needModules) { var sizes = [12, 18, 24, 36, 48]; var boxes = []; var n = needModules; while (n > 48) { boxes.push(48); n -= 48; } for (var i = 0; i < sizes.length; i++) { if (sizes[i] >= n) { boxes.push(sizes[i]); break; } } return boxes; } var lastText = ""; function calculate(e) { e.preventDefault(); var errors = []; var area = readNum("smcArea", "Площадь квартиры", 10, 300, errors, false); var rooms = readNum("smcRooms", "Количество комнат", 1, 6, errors, true); var uzos = readNum("smcUzo", "УЗО на влажные зоны", 0, 4, errors, true); var sockets = readNum("smcSockets", "Розетки", 1, 200, errors, true); var switches = readNum("smcSwitches", "Выключатели", 0, 60, errors, true); var lights = readNum("smcLights", "Светильники", 0, 100, errors, true); var hob = $("smcHob").checked; var p25 = readNum("smcP25", "Кабель 3×2,5", 1, 5000, errors, false); var p15 = readNum("smcP15", "Кабель 3×1,5", 1, 5000, errors, false); var p6 = readNum("smcP6", "Кабель 3×6", 1, 5000, errors, false); var pA16 = readNum("smcPAuto16", "Автомат 16А", 1, 20000, errors, false); var pA10 = readNum("smcPAuto10", "Автомат 10А", 1, 20000, errors, false); var pA32 = readNum("smcPAuto32", "Автомат 32А", 1, 20000, errors, false); var pAMain = readNum("smcPAutoMain", "Вводной автомат", 1, 50000, errors, false); var pUzo = readNum("smcPUzo", "УЗО 40А/30мА", 1, 50000, errors, false); var pBox = readNum("smcPBox", "Бокс электрощита", 1, 100000, errors, false); var pPodr = readNum("smcPPodr", "Подрозетник", 1, 2000, errors, false); var pGofra = readNum("smcPGofra", "Гофра ПВХ", 1, 1000, errors, false); var wPoint = readNum("smcWPoint", "Монтаж точки", 1, 20000, errors, false); var wShtr = readNum("smcWShtroba", "Штробление", 1, 5000, errors, false); var wShield= readNum("smcWShield", "Сборка щита", 0, 200000, errors, false); var wHob = readNum("smcWHob", "Линия варочной", 0, 100000, errors, false); var errBox = $("smcErrors"); if (errors.length) { errBox.innerHTML = "<b>Проверьте введённые данные:</b><ul><li>" + errors.join("</li><li>") + "</li></ul>"; errBox.style.display = "block"; $("smcResults").style.display = "none"; errBox.scrollIntoView({ behavior: "smooth", block: "center" }); return; } errBox.style.display = "none"; /* ---- Расчёт количеств ---- */ var cable25 = rooms * 25 + 40; // розетки: 25 м/комн + 40 м кухня var cable15 = rooms * 15 + 10; // свет: 15 м/комн + 10 м var cable6 = hob ? 15 : 0; // варочная линия var socketGroups = Math.ceil(sockets / 8); var lightGroups = Math.max(1, Math.ceil(lights / 10)); var hobBreaker = hob ? 1 : 0; var modules = socketGroups + lightGroups + uzos * 2 + 2 + hobBreaker; var boxes = pickBoxes(modules + 2); // +2 модуля запаса var podrozetniki = sockets + switches; var gofra = Math.round((cable25 + cable15 + cable6) * 0.8); var shtroba = Math.round((cable25 + cable15) * 0.5); var points = sockets + switches + lights; /* ---- Таблица материалов ---- */ var mat = []; mat.push({ name: "Кабель ВВГнг-LS 3×2,5 (розеточные группы)", qty: cable25 + " м", price: p25, sum: cable25 * p25 }); mat.push({ name: "Кабель ВВГнг-LS 3×1,5 (группы освещения)", qty: cable15 + " м", price: p15, sum: cable15 * p15 }); if (hob) mat.push({ name: "Кабель ВВГнг-LS 3×6 (варочная панель)", qty: cable6 + " м", price: p6, sum: cable6 * p6 }); mat.push({ name: "Автоматический выключатель 16А (групп розеток: " + socketGroups + ")", qty: socketGroups + " шт", price: pA16, sum: socketGroups * pA16 }); mat.push({ name: "Автоматический выключатель 10А (групп света: " + lightGroups + ")", qty: lightGroups + " шт", price: pA10, sum: lightGroups * pA10 }); if (hob) mat.push({ name: "Автоматический выключатель 32А (варочная)", qty: "1 шт", price: pA32, sum: pA32 }); mat.push({ name: "Вводной автомат 2P 40А", qty: "1 шт", price: pAMain, sum: pAMain }); if (uzos > 0) mat.push({ name: "УЗО 40А / 30 мА (влажные зоны)", qty: uzos + " шт", price: pUzo, sum: uzos * pUzo }); var boxLabel = boxes.map(function (b) { return b + " мод."; }).join(" + "); mat.push({ name: "Бокс электрощита (" + boxLabel + "; всего " + modules + " модулей занято)", qty: boxes.length + " шт", price: pBox, sum: boxes.length * pBox }); mat.push({ name: "Подрозетники", qty: podrozetniki + " шт", price: pPodr, sum: podrozetniki * pPodr }); mat.push({ name: "Гофра ПВХ 16–20 мм", qty: gofra + " м", price: pGofra, sum: gofra * pGofra }); /* ---- Таблица работ ---- */ var work = []; work.push({ name: "Монтаж точек под ключ (розетки, выключатели, светильники)", qty: points + " точек", price: wPoint, sum: points * wPoint }); work.push({ name: "Штробление 20×20 под кабель", qty: shtroba + " м", price: wShtr, sum: shtroba * wShtr }); work.push({ name: "Сборка и подключение электрощита", qty: "1 усл.", price: wShield, sum: wShield }); if (hob) work.push({ name: "Монтаж отдельной линии варочной панели", qty: "1 усл.", price: wHob, sum: wHob }); var matTotal = mat.reduce(function (s, r) { return s + r.sum; }, 0); var workTotal = work.reduce(function (s, r) { return s + r.sum; }, 0); var grand = matTotal + workTotal; var perM2 = grand / area; /* ---- Рендер ---- */ function render(tableId, rows, total) { var t = $(tableId); var tb = t.querySelector("tbody"); var tf = t.querySelector("tfoot"); tb.innerHTML = rows.map(function (r) { return "<tr><td>" + r.name + "</td><td>" + r.qty + "</td><td>" + fmtMoney(r.price) + "</td><td>" + fmtMoney(r.sum) + "</td></tr>"; }).join(""); tf.innerHTML = "<tr><td colspan=\"3\">Итого</td><td>" + fmtMoney(total) + "</td></tr>"; } render("smcMatTable", mat, matTotal); render("smcWorkTable", work, workTotal); $("smcGrandTotal").textContent = fmtMoney(grand); $("smcPerM2").innerHTML = "Это <b>" + fmtMoney(perM2) + "</b> за 1 м² при площади " + area.toLocaleString("ru-RU") + " м²"; $("smcResults").style.display = "block"; $("smcCopyNote").textContent = ""; /* ---- Текст для буфера обмена ---- */ var lines = []; lines.push("СМЕТА ЭЛЕКТРИКИ В КВАРТИРЕ (расчёт ориентировочный, не оферта)"); lines.push("Площадь: " + area.toLocaleString("ru-RU") + " м²; комнат: " + rooms + "; розеток: " + sockets + "; выключателей: " + switches + "; светильников: " + lights + (hob ? "; варочная панель: да" : "")); lines.push(""); lines.push("МАТЕРИАЛЫ:"); mat.forEach(function (r) { lines.push("- " + r.name + " — " + r.qty + " × " + fmtMoney(r.price) + " = " + fmtMoney(r.sum)); }); lines.push("Итого материалы: " + fmtMoney(matTotal)); lines.push(""); lines.push("РАБОТЫ:"); work.forEach(function (r) { lines.push("- " + r.name + " — " + r.qty + " × " + fmtMoney(r.price) + " = " + fmtMoney(r.sum)); }); lines.push("Итого работы: " + fmtMoney(workTotal)); lines.push(""); lines.push("ИТОГО СМЕТА: " + fmtMoney(grand) + " (" + fmtMoney(perM2) + " за 1 м²)"); lastText = lines.join("\n"); } $("smcForm").addEventListener("submit", calculate); /* ---- Копирование сметы ---- */ $("smcCopy").addEventListener("click", function () { var note = $("smcCopyNote"); function done(ok) { note.textContent = ok ? "Смета скопирована в буфер обмена." : "Не удалось скопировать автоматически — выделите текст таблиц вручную."; } if (!lastText) { done(false); return; } if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(lastText).then(function () { done(true); }, function () { fallback(); }); } else { fallback(); } function fallback() { var ta = document.createElement("textarea"); ta.value = lastText; ta.style.position = "fixed"; ta.style.opacity = "0"; document.body.appendChild(ta); ta.select(); var ok = false; try { ok = document.execCommand("copy"); } catch (e) { ok = false; } document.body.removeChild(ta); done(ok); } }); })(); </script> </html>