<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/raschet-rezki-ploskikh-detaley-gidroabrazivom</id>
  <link href="https://www.pandoraburo.ru/raschet-rezki-ploskikh-detaley-gidroabrazivom.xml" rel="self"/>
  <title>Расчет резки плоских деталей Гидроабразивом</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
&lt;title&gt;Калькулятор гидроабразивной резки С500 — Арсенал-Деталь&lt;/title&gt;
&lt;style&gt;
  :root {
    --bg: #0a0a0a; --bg2: #111111; --line: #d4af37; --gold: #d4af37;
    --goldB: #f0d060; --red: #e74c3c; --green: #2ecc71; --highlight: #ff6b35;
  }
  * { box-sizing: border-box; margin: 0; padding: 0; }
  body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: var(--bg); color: var(--gold); line-height: 1.5; padding: 20px 14px;
  }
  .wrap { max-width: 1400px; margin: 0 auto; }

  .ticker-block {
    display: flex; align-items: stretch; background: var(--bg);
    border: 1px solid var(--line); border-radius: 8px; overflow: hidden;
    margin-bottom: 14px; height: 44px;
  }
  .ticker-label {
    background: var(--gold); color: #0a0a0a; font-weight: 800; font-size: 12px;
    letter-spacing: 1.5px; padding: 0 16px; display: flex; align-items: center; white-space: nowrap;
  }
  .ticker-viewport { flex: 1; overflow: hidden; position: relative; }
  .ticker-track {
    display: inline-flex; align-items: center; height: 100%; white-space: nowrap;
    animation: tickerScroll 40s linear infinite; padding-left: 20px;
  }
  .ticker-item { color: var(--gold); font-size: 13px; padding: 0 10px; letter-spacing: .3px; }
  .ticker-item b { color: var(--goldB); font-weight: 700; }
  .ticker-dot { color: var(--gold); font-size: 10px; }
  @keyframes tickerScroll { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }

  header {
    background: var(--bg); border: 1px solid var(--line); border-radius: 12px;
    padding: 30px 25px; text-align: center; margin-bottom: 14px;
  }
  .banner-line {
    display: inline-block; background: var(--highlight); color: #fff;
    font-size: 11px; font-weight: 800; letter-spacing: 2px; padding: 4px 14px;
    border-radius: 999px; margin-bottom: 14px;
  }
  header h1 {
    margin: 0 0 12px 0; font-size: 28px; color: var(--gold);
    text-transform: uppercase; letter-spacing: 3px; font-weight: 800;
  }
  header p { margin: 0; color: var(--gold); font-size: 15px; opacity: .9; }

  .calc-block {
    background: var(--bg); border: 1px solid var(--line); border-radius: 12px;
    padding: 20px; margin-bottom: 14px;
  }
  .calc-title {
    color: var(--gold); font-size: 12px; font-weight: 800; letter-spacing: 2px;
    text-transform: uppercase; padding-bottom: 12px; margin-bottom: 16px;
    border-bottom: 1px solid var(--line); text-align: center;
  }

  .price-table {
    background: rgba(255,107,53,.08); border: 1px solid var(--highlight); border-radius: 10px;
    padding: 14px; margin-bottom: 16px;
  }
  .price-table-title {
    color: var(--highlight); font-size: 11px; font-weight: 800;
    text-transform: uppercase; letter-spacing: 1px; margin-bottom: 10px; text-align: center;
  }
  .price-grid {
    display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px;
  }
  @media (max-width: 900px) { .price-grid { grid-template-columns: repeat(3, 1fr); } }
  @media (max-width: 500px) { .price-grid { grid-template-columns: repeat(2, 1fr); } }
  .price-cell {
    background: rgba(0,0,0,.6); border: 1px solid rgba(255,107,53,.4);
    border-radius: 6px; padding: 8px; text-align: center;
  }
  .price-cell .thick { font-size: 11px; color: var(--gold); opacity: .7; }
  .price-cell .rate { font-size: 15px; font-weight: 800; color: var(--highlight); }

  .field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
  .field label {
    font-size: 11px; font-weight: 700; color: var(--gold);
    text-transform: uppercase; letter-spacing: 1px; opacity: .8;
  }
  .field input, .field select {
    padding: 12px 14px; border: 1px solid var(--line); border-radius: 9px;
    font-size: 14px; background: var(--bg); color: var(--gold);
    outline: none; transition: .15s; font-family: inherit; font-variant-numeric: tabular-nums;
  }
  .field input:focus, .field select:focus {
    border-color: var(--goldB); box-shadow: 0 0 0 3px rgba(212,175,55,.2);
  }
  .field-row { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
  @media (max-width: 800px) { .field-row { grid-template-columns: 1fr; } }

  .auto-calc {
    background: rgba(212,175,55,.08); border: 1px dashed var(--gold);
    border-radius: 9px; padding: 12px 14px; margin-bottom: 14px;
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;
  }
  @media (max-width: 700px) { .auto-calc { grid-template-columns: 1fr; } }
  .auto-item { text-align: center; }
  .auto-label { font-size: 10px; color: var(--gold); opacity: .7; text-transform: uppercase; font-weight: 700; }
  .auto-value { font-size: 18px; font-weight: 800; color: var(--goldB); font-variant-numeric: tabular-nums; }

  .result-block {
    background: var(--bg); border: 1px solid var(--line); border-radius: 12px; padding: 20px; margin-bottom: 14px;
  }
  .result-main {
    text-align: center; padding: 16px 0 20px; border-bottom: 1px solid rgba(212,175,55,.3); margin-bottom: 16px;
  }
  .result-main-label {
    font-size: 11px; font-weight: 800; letter-spacing: 2px;
    text-transform: uppercase; color: var(--gold); opacity: .8; margin-bottom: 8px;
  }
  .result-main-value {
    font-size: 48px; font-weight: 800; color: var(--goldB);
    line-height: 1; font-variant-numeric: tabular-nums; margin-bottom: 6px;
  }
  .result-main-unit { font-size: 16px; color: var(--gold); opacity: .8; }
  .result-main-note { font-size: 12px; color: var(--gold); opacity: .7; margin-top: 8px; }

  .result-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 16px;
  }
  @media (max-width: 900px) { .result-grid { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 500px) { .result-grid { grid-template-columns: 1fr; } }
  .result-item {
    background: #0a0a0a; border: 1px solid rgba(212,175,55,.3); border-radius: 9px; padding: 12px; text-align: center;
  }
  .result-label {
    font-size: 10px; font-weight: 700; letter-spacing: 1px;
    text-transform: uppercase; color: var(--gold); opacity: .7; margin-bottom: 6px;
  }
  .result-value { font-size: 18px; font-weight: 800; color: var(--goldB); line-height: 1.1; font-variant-numeric: tabular-nums; }
  .result-value.small { font-size: 15px; }
  .result-value.profit { color: var(--green); }

  .actions { display: flex; gap: 10px; flex-wrap: wrap; }
  .promo-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 6px;
    padding: 12px 16px; border-radius: 9px; border: 1px solid var(--gold);
    background: transparent; color: var(--gold); font-size: 13px; font-weight: 700;
    cursor: pointer; transition: .15s; font-family: inherit; letter-spacing: .3px; flex: 1; min-width: 140px;
  }
  .promo-btn:hover { background: var(--gold); color: #0a0a0a; }
  .promo-btn.primary { background: var(--gold); color: #0a0a0a; }
  .promo-btn.primary:hover { background: var(--goldB); }

  .pricing-info {
    background: rgba(46, 204, 113, 0.08); border: 1px solid var(--green);
    border-radius: 10px; padding: 14px 18px; margin-top: 14px; text-align: center;
  }
  .pricing-info-title {
    font-size: 12px; font-weight: 800; color: var(--green);
    text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px;
  }
  .pricing-info-text { font-size: 13px; color: var(--gold); opacity: .85; line-height: 1.6; }
  .pricing-info-text b { color: var(--goldB); }

  ::-webkit-scrollbar { width: 14px; height: 14px; }
  ::-webkit-scrollbar-track { background: #050505; border: 1px solid #2a2210; border-radius: 9px; }
  ::-webkit-scrollbar-thumb {
    background: linear-gradient(180deg, #ffd700 0%, #ff8c00 50%, #ffd700 100%);
    border: 1px solid #ffd700; border-radius: 9px; box-shadow: 0 0 10px rgba(255,215,0,.6);
  }

  @media print {
    body { background: #fff; color: #000; padding: 0; }
    .ticker-block, .promo-btn { display: none !important; }
    .calc-block, .result-block { background: #fff !important; border: 1px solid #999 !important; }
    .field input, .field select { background: #fff !important; color: #000 !important; border-color: #999 !important; }
    .result-main-value, .result-value { color: #000 !important; }
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="wrap"&gt;

  &lt;div class="ticker-block"&gt;
    &lt;div class="ticker-label"&gt;ФИНАЛЬНЫЕ СТАВКИ С500&lt;/div&gt;
    &lt;div class="ticker-viewport"&gt;
      &lt;div class="ticker-track"&gt;
        &lt;span class="ticker-item"&gt;Броня С500: &lt;b&gt;425 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ГАР 20 мм С500: &lt;b&gt;2 240 ₽/м&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;ГАР 50 мм С500: &lt;b&gt;8 120 ₽/м&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;header&gt;
    &lt;div class="banner-line"&gt;⚠️ СПЕЦИАЛИЗИРОВАННЫЙ РАСЧЁТ&lt;/div&gt;
    &lt;h1&gt;Гидроабразивная резка С500&lt;/h1&gt;
    &lt;p&gt;Раскрой листов брони 6–50 мм · Финальные ставки с учётом твёрдости&lt;/p&gt;
  &lt;/header&gt;

  &lt;div class="calc-block"&gt;
    &lt;div class="calc-title"&gt;Финальная сетка тарифов для С500 (с коэфф. 1.4)&lt;/div&gt;
    &lt;div class="price-table"&gt;
      &lt;div class="price-table-title"&gt;? Ставки за метр реза · Броня С500&lt;/div&gt;
      &lt;div class="price-grid" id="priceGrid"&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="calc-title"&gt;Параметры заготовки и реза&lt;/div&gt;

    &lt;div class="field"&gt;
      &lt;label&gt;Материал&lt;/label&gt;
      &lt;select id="material"&gt;
        &lt;option value="c500" selected="selected"&gt;Броня С500 · 425 ₽/кг (Финальные ставки)&lt;/option&gt;
        &lt;option value="09g2s"&gt;Сталь 09Г2С · 125 ₽/кг (Базовые ставки)&lt;/option&gt;
      &lt;/select&gt;
    &lt;/div&gt;

    &lt;div class="field-row"&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Толщина листа (S), мм&lt;/label&gt;
        &lt;input type="number" id="thickness" value="20" min="6" max="50" step="1" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Площадь заготовки, м²&lt;/label&gt;
        &lt;input type="number" id="area" value="1.0" min="0.01" max="100" step="0.01" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Общая длина реза, м.п.&lt;/label&gt;
        &lt;input type="number" id="cutLength" value="5.0" min="0.1" max="1000" step="0.1" /&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="field-row"&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Количество деталей, шт&lt;/label&gt;
        &lt;input type="number" id="qty" value="1" min="1" max="1000" step="1" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Коэфф. сложности контура&lt;/label&gt;
        &lt;input type="number" id="complexity" value="1.0" min="1.0" max="2.0" step="0.1" /&gt;
        &lt;div style="font-size:10px; color:var(--gold); opacity:0.6; margin-top:4px;"&gt;1.0 = прямые линии, 1.3 = много отверстий/кривых&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Рентабельность, %&lt;/label&gt;
        &lt;input type="number" id="margin" value="45" min="0" max="200" step="1" /&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="auto-calc"&gt;
      &lt;div class="auto-item"&gt;
        &lt;div class="auto-label"&gt;Масса заготовки&lt;/div&gt;
        &lt;div class="auto-value" id="autoWeight"&gt;0 кг&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="auto-item"&gt;
        &lt;div class="auto-label"&gt;Стоимость металла&lt;/div&gt;
        &lt;div class="auto-value" id="autoMatCost"&gt;0 ₽&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="auto-item"&gt;
        &lt;div class="auto-label"&gt;Ставка резки&lt;/div&gt;
        &lt;div class="auto-value" id="autoCutRate"&gt;0 ₽/м&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="result-block"&gt;
    &lt;div class="calc-title"&gt;Результат расчёта&lt;/div&gt;

    &lt;div class="result-main"&gt;
      &lt;div class="result-main-label"&gt;Цена продажи за 1 деталь (с НДС 20%)&lt;/div&gt;
      &lt;div class="result-main-value" id="rPrice"&gt;0&lt;/div&gt;
      &lt;div class="result-main-unit"&gt;рублей&lt;/div&gt;
      &lt;div class="result-main-note" id="rNote"&gt;—&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="result-grid"&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Материал&lt;/div&gt;&lt;div class="result-value small" id="rMatCost"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Гидроабразивная резка&lt;/div&gt;&lt;div class="result-value small" id="rCutCost"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Полная себест. (без НДС)&lt;/div&gt;&lt;div class="result-value small" id="rCost"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;Прибыль (без НДС)&lt;/div&gt;&lt;div class="result-value small profit" id="rProfit"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="pricing-info"&gt;
      &lt;div class="pricing-info-title"&gt;? Логика расчёта&lt;/div&gt;
      &lt;div class="pricing-info-text"&gt;
        1. &lt;b&gt;Ставка резки&lt;/b&gt; берётся из финальной сетки С500 (с уже применённым коэффициентом 1.4 к базовым тарифам).&lt;br /&gt;
        2. &lt;b&gt;Интерполяция:&lt;/b&gt; если толщина не совпадает с шагом сетки (например, 18 мм), ставка рассчитывается линейно между соседними точками.&lt;br /&gt;
        3. &lt;b&gt;Себестоимость&lt;/b&gt; включает металл, резку и 15% накладных расходов (подготовка, контроль, амортизация).
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="actions"&gt;
      &lt;button class="promo-btn primary" onclick="downloadCSV()"&gt;⬇ CSV&lt;/button&gt;
      &lt;button class="promo-btn primary" onclick="downloadExcel()"&gt;⬇ Excel&lt;/button&gt;
      &lt;button class="promo-btn" onclick="window.print()"&gt;? Печать&lt;/button&gt;
      &lt;button class="promo-btn" onclick="resetAll()"&gt;✕ Сброс&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;script&gt;
/* ==================== ДАННЫЕ ==================== */
const MATERIALS = [
  {key:'c500',   name:'Броня С500',    price:425, density:7850},
  {key:'09g2s',  name:'Сталь 09Г2С',   price:125, density:7850}
];

// ВАША СЕТКА базовых тарифов (обычная сталь)
const BASE_RATES = [
  { thickness: 6,  rate: 400 },
  { thickness: 8,  rate: 550 },
  { thickness: 10, rate: 700 },
  { thickness: 12, rate: 850 },
  { thickness: 16, rate: 1200 },
  { thickness: 20, rate: 1600 },
  { thickness: 25, rate: 2200 },
  { thickness: 30, rate: 2800 },
  { thickness: 40, rate: 4200 },
  { thickness: 50, rate: 5800 }
];

// ФИНАЛЬНАЯ СЕТКА для С500 (Базовая × 1.4)
const C500_RATES = BASE_RATES.map(p =&gt; ({
  thickness: p.thickness,
  rate: Math.round(p.rate * 1.4)
}));

/* ==================== УТИЛИТЫ ==================== */
const fmt = n =&gt; (n === null || n === undefined || isNaN(n)) ? '0' : n.toLocaleString('ru-RU', {maximumFractionDigits: 0});
const fmt2 = n =&gt; (n === null || n === undefined || isNaN(n)) ? '0' : n.toLocaleString('ru-RU', {maximumFractionDigits: 2});
const num = id =&gt; { const el = document.getElementById(id); if (!el) return 0; const v = parseFloat(el.value); return isNaN(v) ? 0 : v; };
const getMaterial = key =&gt; MATERIALS.find(m =&gt; m.key === key) || MATERIALS[0];

// Линейная интерполяция по сетке
function getRate(thickness, ratesArray) {
  if (thickness &lt;= ratesArray[0].thickness) return ratesArray[0].rate;
  if (thickness &gt;= ratesArray[ratesArray.length - 1].thickness) return ratesArray[ratesArray.length - 1].rate;
  for (let i = 0; i &lt; ratesArray.length - 1; i++) {
    if (thickness &gt;= ratesArray[i].thickness &amp;&amp; thickness &lt;= ratesArray[i+1].thickness) {
      const t1 = ratesArray[i].thickness;
      const t2 = ratesArray[i+1].thickness;
      const r1 = ratesArray[i].rate;
      const r2 = ratesArray[i+1].rate;
      return r1 + (r2 - r1) * (thickness - t1) / (t2 - t1);
    }
  }
  return ratesArray[ratesArray.length - 1].rate;
}

/* ==================== РЕНДЕР ТАБЛИЦЫ ЦЕН ==================== */
function renderPriceTable() {
  const grid = document.getElementById('priceGrid');
  grid.innerHTML = C500_RATES.map(p =&gt; {
    return `&lt;div class="price-cell"&gt;
      &lt;div class="thick"&gt;${p.thickness} мм&lt;/div&gt;
      &lt;div class="rate"&gt;${fmt(p.rate)} ₽/м&lt;/div&gt;
    &lt;/div&gt;`;
  }).join('');
}

/* ==================== РАСЧЁТ ==================== */
function calculate() {
  const mat = getMaterial(document.getElementById('material').value);
  const thickness = num('thickness');
  const area = num('area');
  const cutLength = num('cutLength');
  const qty = Math.max(1, num('qty'));
  const complexity = num('complexity');
  const marginPct = num('margin');

  if (thickness &lt;= 0 || area &lt;= 0 || cutLength &lt;= 0) {
    document.getElementById('rPrice').textContent = '0';
    return;
  }

  // Выбираем нужную сетку в зависимости от материала
  const ratesArray = mat.key === 'c500' ? C500_RATES : BASE_RATES;
  
  // 1. Масса и стоимость металла
  const weightPerPart = area * thickness * (mat.density / 1000); 
  const matCostPerPart = weightPerPart * mat.price;

  // 2. Стоимость резки (финальная ставка из сетки × сложность)
  const currentRatePerM = getRate(thickness, ratesArray);
  const cutCostPerPart = cutLength * currentRatePerM * complexity;

  // 3. Себестоимость и цена
  const directCostPerPart = matCostPerPart + cutCostPerPart;
  const overheadPerPart = directCostPerPart * 0.15;
  const totalCostPerPart = directCostPerPart + overheadPerPart;

  const profitPerPart = totalCostPerPart * (marginPct / 100);
  const priceNoVatPerPart = totalCostPerPart + profitPerPart;
  const priceVatPerPart = priceNoVatPerPart * 1.20;

  // 4. Вывод
  document.getElementById('autoWeight').textContent = fmt2(weightPerPart) + ' кг';
  document.getElementById('autoMatCost').textContent = fmt(matCostPerPart) + ' ₽';
  document.getElementById('autoCutRate').textContent = fmt(currentRatePerM) + ' ₽/м';
  
  document.getElementById('rPrice').textContent = fmt(priceVatPerPart);
  document.getElementById('rMatCost').textContent = fmt(matCostPerPart) + ' ₽';
  document.getElementById('rCutCost').textContent = fmt(cutCostPerPart) + ' ₽';
  document.getElementById('rCost').textContent = fmt(totalCostPerPart) + ' ₽';
  document.getElementById('rProfit').textContent = fmt(profitPerPart) + ' ₽';
  
  document.getElementById('rNote').textContent = 
    `Ставка: ${fmt(currentRatePerM)} ₽/м · Сложность: ${complexity}× · Рент.: ${marginPct}%`;

  state.result = {
    material: mat.name, thickness: thickness, area: area, cutLength: cutLength,
    weight: weightPerPart, matCost: matCostPerPart, cutCost: cutCostPerPart,
    currentRate: currentRatePerM,
    cost: totalCostPerPart, profit: profitPerPart, price: priceVatPerPart, margin: marginPct, qty: qty
  };
}

/* ==================== СОБЫТИЯ ==================== */
document.getElementById('material').addEventListener('change', calculate);
['thickness', 'area', 'cutLength', 'qty', 'complexity', 'margin'].forEach(id =&gt; {
  document.getElementById(id).addEventListener('input', calculate);
});

/* ==================== СБРОС ==================== */
function resetAll() {
  document.getElementById('material').value = 'c500';
  document.getElementById('thickness').value = 20;
  document.getElementById('area').value = 1.0;
  document.getElementById('cutLength').value = 5.0;
  document.getElementById('qty').value = 1;
  document.getElementById('complexity').value = 1.0;
  document.getElementById('margin').value = 45;
  calculate();
}

/* ==================== ЭКСПОРТ ==================== */
function downloadBlob(blob, filename) {
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url; a.download = filename;
  document.body.appendChild(a); a.click(); a.remove();
  setTimeout(() =&gt; URL.revokeObjectURL(url), 500);
}
function today() { const d = new Date(), p = n =&gt; String(n).padStart(2,'0'); return `${d.getFullYear()}-${p(d.getMonth()+1)}-${p(d.getDate())}`; }

function downloadCSV() {
  if (!state.result) return;
  const r = state.result;
  const header = ['Параметр','Значение'];
  const body = [
    ['Материал', r.material],
    ['Толщина листа', r.thickness + ' мм'],
    ['Площадь заготовки', r.area + ' м²'],
    ['Длина реза', r.cutLength + ' м.п.'],
    ['Ставка ГАР (С500)', Math.round(r.currentRate) + ' ₽/м'],
    ['Масса 1 детали', r.weight.toFixed(2) + ' кг'],
    ['Стоимость металла', Math.round(r.matCost) + ' ₽'],
    ['Стоимость резки', Math.round(r.cutCost) + ' ₽'],
    ['Полная себестоимость (без НДС)', Math.round(r.cost) + ' ₽'],
    ['Рентабельность', r.margin + '%'],
    ['Цена продажи 1 шт (с НДС 20%)', Math.round(r.price) + ' ₽']
  ];
  const esc = v =&gt; `"${String(v).replace(/"/g,'""')}"`;
  const csv = [header, ...body].map(row =&gt; row.map(esc).join(';')).join('\r\n');
  downloadBlob(new Blob(['\uFEFF' + csv], {type:'text/csv;charset=utf-8;'}), 'gar_c500_' + today() + '.csv');
}

function downloadExcel() {
  if (!state.result) return;
  const r = state.result;
  const header = ['Параметр','Значение'];
  const body = [
    ['Материал', r.material], ['Толщина листа', r.thickness + ' мм'],
    ['Площадь заготовки', r.area + ' м²'], ['Длина реза', r.cutLength + ' м.п.'],
    ['Ставка ГАР (С500)', Math.round(r.currentRate) + ' ₽/м'],
    ['Масса 1 детали', r.weight.toFixed(2) + ' кг'],
    ['Стоимость металла', Math.round(r.matCost) + ' ₽'],
    ['Стоимость резки', Math.round(r.cutCost) + ' ₽'],
    ['Полная себестоимость (без НДС)', Math.round(r.cost) + ' ₽'],
    ['Рентабельность', r.margin + '%'],
    ['Цена продажи 1 шт (с НДС 20%)', Math.round(r.price) + ' ₽']
  ];
  const esc = v =&gt; String(v ?? '').replace(/&amp;/g,'&amp;amp;').replace(/&lt;/g,'&amp;lt;').replace(/&gt;/g,'&amp;gt;');
  const table = `&lt;table border="1" cellspacing="0" cellpadding="4"&gt;
    &lt;thead style="background:#000;color:#ffd700;"&gt;&lt;tr&gt;${header.map(h=&gt;`&lt;th&gt;${esc(h)}&lt;/th&gt;`).join('')}&lt;/tr&gt;&lt;/thead&gt;
    &lt;tbody&gt;${body.map(row=&gt;`&lt;tr&gt;${row.map(c=&gt;`&lt;td&gt;${esc(c)}&lt;/td&gt;`).join('')}&lt;/tr&gt;`).join('')}&lt;/tbody&gt;&lt;/table&gt;`;
  const html = `&lt;html xmlns:x="urn:schemas-microsoft-com:office:excel"&gt;&lt;head&gt;&lt;meta charset="UTF-8"&gt;
    &lt;style&gt;td,th{font-family:Arial;font-size:12px;}&lt;/style&gt;&lt;/head&gt;
    &lt;body&gt;&lt;h2&gt;Расчёт гидроабразивной резки С500 — ${today()}&lt;/h2&gt;
    &lt;p&gt;ООО «Арсенал-Деталь» · 8 (992) 017-49-73&lt;/p&gt;
    &lt;p&gt;&lt;b&gt;Финальная сетка С500:&lt;/b&gt; 6мм=560, 10мм=980, 20мм=2240, 30мм=3920, 50мм=8120 ₽/м&lt;/p&gt;
    ${table}
    &lt;/body&gt;&lt;/html&gt;`;
  downloadBlob(new Blob(['\uFEFF' + html], {type:'application/vnd.ms-excel;charset=utf-8;'}), 'gar_c500_' + today() + '.xls');
}

/* ==================== СТАРТ ==================== */
let state = { result: null };
renderPriceTable();
calculate();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-10-12T10:12:03Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/07/26436cc3c611f19d9efcd8c4a10874/-/0c723f71762611f1b3964aaba1665535.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
