Расчёт электропроводки — калькулятор
Точки × цена, кабель по группам (3×2.5 / 3×1.5), щит с автоматами и УЗО, штробы, подключения.
Короткий ответ
Калькулятор составляет смету на электромонтаж: считает число точек (розетки, выключатели, светильники), метраж кабеля по группам (освещение 3×1.5, розетки 3×2.5, плита 3×6), комплектацию щита (автоматы, УЗО, дифавтоматы) и работы (штробы, подключения, монтаж щита).
Что считает
- Точки — розетки, выключатели, светильники (цена за точку)
- Кабель — метраж по группам с разделением по сечению
- Щит — автоматы, УЗО, дифавтоматы, шины
- Штробы — метраж по стенам и потолку
- Подключения — ввод в дом, заземление, молниезащита
- Итоговая смета — материалы + работы
Источники
- ПУЭ 7 «Правила устройства электроустановок» (выбор сечения, группы, защита)
- СП 76.13330.2016 «Электротехнические устройства»
- ГОСТ 31996-2012 «Кабели силовые с пластмассовой изоляцией» (допустимые токи)
Калькулятор
Как пользоваться
- Введите площадь дома и число комнат.
- Задайте число точек: розетки (от 4 на комнату), выключатели (1–2 на комнату), светильники.
- Укажите длину кабельных трасс отдельно по группам.
- Выберите комплектацию щита: число автоматов, УЗО.
- Задайте цены на материалы и работы.
- Нажмите «Рассчитать» — увидите итоговую смету с разбивкой по категориям.
<!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>