<?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/trubnye-doski-raschet-tcen</id>
  <link href="https://www.pandoraburo.ru/trubnye-doski-raschet-tcen.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;Трубные доски — изготовление под заказ | ООО Арсенал-Деталь&lt;/title&gt;
&lt;meta name="description" content="Изготовление трубных досок и трубных решеток для кожухотрубчатых теплообменников. Сверление отверстий, резка, обработка кромок. Сталь 3, 20, 45, 09Г2С, 40Х, 65Г, броня С500, AISI 304/316/321, 12Х18Н10Т. Расчёт стоимости онлайн."&gt;
&lt;meta name="keywords" content="трубные доски, трубная доска, трубные решетки, трубная решетка теплообменника, изготовление трубных досок, трубная доска теплообменника, резка трубных досок, сверление отверстий трубных досок, отверстия в трубной доске, трубная доска кожухотрубчатого теплообменника, изготовление трубных решеток, трубная доска под развальцовку, развальцовка труб в трубной доске, теплообменник трубная доска, трубная доска цена, купить трубную доску, трубная доска из нержавейки, трубная доска из стали, трубная доска чертеж, трубная доска размеры, изготовление теплообменников, трубная доска из стали 20, трубная доска 09Г2С, трубная доска 12Х18Н10Т, трубная доска AISI 304, трубная доска AISI 316, трубная доска из брони С500, заказать трубную доску, производство трубных досок"&gt;
&lt;style&gt;
  :root{
    --gold:#FFD700;--gold-light:#FFE55C;--gold-deep:#B8860B;
    --bg:#0a0a0a;--muted:#9a8040;--border:rgba(212,175,55,.35);
    --green:#7dff7d;--green-dark:#3aa03a;--orange:#FF8C00;
    --red:#ff8a7a;--highlight:#ff6b35;
  }
  *{box-sizing:border-box;margin:0;padding:0}
  body{background:#050505;color:#e8e8e8;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;padding:20px 14px 180px;line-height:1.5;}
  .wrap{max-width:1400px;margin:0 auto}

  .header{background:radial-gradient(120% 120% at 20% 0%,rgba(255,215,0,.25),transparent 55%),linear-gradient(135deg,#1a1408,#0a0a0a);border:2px solid var(--gold);border-radius:14px;padding:28px 24px;text-align:center;margin-bottom:16px;box-shadow:0 0 40px rgba(255,215,0,.25),0 6px 22px rgba(0,0,0,.6);}
  .tag{display:inline-block;background:var(--highlight);color:#fff;font-size:10px;font-weight:800;letter-spacing:2px;padding:4px 14px;border-radius:999px;margin-bottom:14px;box-shadow:0 0 16px rgba(255,107,53,.7);}
  .header h1{font-size:28px;font-weight:900;letter-spacing:3px;color:var(--gold);text-transform:uppercase;margin-bottom:12px;text-shadow:0 0 10px rgba(255,215,0,.95),0 0 25px rgba(255,199,0,.8);animation:goldPulse 3s ease-in-out infinite;}
  @keyframes goldPulse{0%,100%{text-shadow:0 0 10px rgba(255,215,0,.95),0 0 25px rgba(255,199,0,.8);}50%{text-shadow:0 0 15px rgba(255,215,0,1),0 0 35px rgba(255,199,0,.95);}}
  .line{width:80px;height:3px;background:var(--gold);margin:0 auto 12px;border-radius:2px;box-shadow:0 0 15px var(--gold);}
  .header p{color:var(--gold-light);font-size:14px;opacity:.95;}
  .company-info{background:rgba(255,215,0,.05);border:1px solid var(--border);border-radius:8px;padding:12px;margin-top:12px;font-size:12px;color:var(--gold-light);}
  .company-info b{color:var(--gold);}

  .discount-banner{
    background:linear-gradient(135deg,rgba(125,255,125,.12),rgba(10,10,10,.9));
    border:3px solid var(--green);border-radius:16px;
    padding:24px 26px;margin-bottom:16px;
    text-align:center;position:relative;
    box-shadow:0 0 40px rgba(125,255,125,.2);
    transition:all .4s;
  }
  .discount-banner.active{
    background:linear-gradient(135deg,rgba(125,255,125,.25),rgba(10,10,10,.9));
    box-shadow:0 0 60px rgba(125,255,125,.5),inset 0 0 30px rgba(125,255,125,.15);
    animation:discountActive 1.5s ease-in-out infinite;
  }
  @keyframes discountActive{
    0%,100%{box-shadow:0 0 60px rgba(125,255,125,.5),inset 0 0 30px rgba(125,255,125,.15);}
    50%{box-shadow:0 0 80px rgba(125,255,125,.8),inset 0 0 40px rgba(125,255,125,.25);}
  }
  .discount-banner::before{
    content:'? СКИДКА ОТ ОБЪЁМА ЗАКАЗА ?';
    position:absolute;top:-14px;left:50%;transform:translateX(-50%);
    background:#0a0a0a;color:var(--green);
    padding:4px 22px;border:2px solid var(--green);border-radius:999px;
    font-size:12px;font-weight:900;letter-spacing:3px;
    text-shadow:0 0 15px rgba(125,255,125,1);
    white-space:nowrap;box-shadow:0 0 20px rgba(125,255,125,.6);
  }
  .discount-banner h3{
    color:var(--green);font-size:20px;font-weight:900;
    letter-spacing:1.5px;text-transform:uppercase;
    margin-bottom:12px;
    text-shadow:0 0 15px rgba(125,255,125,.7);
  }
  .discount-banner p{
    color:#c8e8c8;font-size:14px;
    margin-bottom:16px;line-height:1.6;
  }
  .discount-banner p b{color:#fff;}

  .progress-wrap{
    max-width:800px;margin:0 auto 16px;
    background:#0a0a0a;border:2px solid var(--green);
    border-radius:999px;height:40px;position:relative;overflow:hidden;
  }
  .progress-fill{
    height:100%;background:linear-gradient(90deg,#3aa03a,#7dff7d,#3aa03a);
    background-size:200% 100%;
    width:0%;transition:width .5s ease-out;
    animation:progressShine 2s linear infinite;
    border-radius:999px;
    box-shadow:0 0 20px rgba(125,255,125,.7);
  }
  @keyframes progressShine{0%{background-position:200% 0;}100%{background-position:-200% 0;}}
  .progress-label{
    position:absolute;inset:0;
    display:flex;align-items:center;justify-content:center;
    color:#fff;font-size:13px;font-weight:900;
    text-shadow:0 1px 3px rgba(0,0,0,.9);
    z-index:2;letter-spacing:.5px;text-align:center;padding:0 12px;
  }
  .progress-label b{color:var(--gold);font-size:14px;}

  .discount-stats{
    display:grid;grid-template-columns:repeat(4,1fr);
    gap:12px;max-width:1000px;margin:0 auto;
  }
  @media(max-width:800px){.discount-stats{grid-template-columns:repeat(2,1fr);}}
  @media(max-width:450px){.discount-stats{grid-template-columns:1fr;}}
  .discount-stat{
    background:rgba(0,0,0,.5);border:1px solid var(--green);
    border-radius:10px;padding:12px;
    display:flex;flex-direction:column;gap:4px;text-align:center;
  }
  .discount-stat .lbl{
    font-size:9px;font-weight:800;text-transform:uppercase;
    letter-spacing:1.2px;color:var(--green);opacity:.8;
  }
  .discount-stat .val{
    font-size:18px;font-weight:900;color:var(--green);
    font-variant-numeric:tabular-nums;
  }
  .discount-stat .val.new{color:var(--gold-light);font-size:20px;}

  .ticker-block{display:flex;align-items:stretch;background:var(--bg);border:1px solid var(--gold);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(--gold-light);font-weight:700;}
  .ticker-dot{color:var(--gold);font-size:10px;}
  @keyframes tickerScroll{0%{transform:translateX(0);}100%{transform:translateX(-50%);}}

  .calc-block{background:var(--bg);border:1px solid var(--gold);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(--border);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(--gold);border-radius:9px;font-size:14px;background:var(--bg);color:var(--gold-light);outline:none;transition:.15s;font-family:inherit;font-variant-numeric:tabular-nums;}
  .field input:focus,.field select:focus{border-color:var(--gold-light);box-shadow:0 0 0 3px rgba(255,215,0,.2);}
  .field-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;}
  @media(max-width:800px){.field-row{grid-template-columns:1fr;}}
  .field-row-2{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
  @media(max-width:800px){.field-row-2{grid-template-columns:1fr;}}

  .input-clear-wrap{position:relative;display:flex;align-items:center;}
  .input-clear-wrap input{width:100%;padding-right:38px;}
  .clear-btn{
    position:absolute;right:6px;top:50%;transform:translateY(-50%);
    width:26px;height:26px;border-radius:6px;
    background:transparent;border:1px solid var(--gold);
    color:var(--gold);font-size:12px;line-height:1;
    cursor:pointer;display:flex;align-items:center;justify-content:center;
    transition:.15s;font-family:inherit;padding:0;
  }
  .clear-btn:hover{background:var(--gold);color:#0a0a0a;}

  .auto-calc{background:rgba(255,215,0,.08);border:1px dashed var(--gold);border-radius:9px;padding:12px 14px;margin-bottom:14px;display:grid;grid-template-columns:repeat(4,1fr);gap:10px;}
  @media(max-width:700px){.auto-calc{grid-template-columns:1fr 1fr;}}
  @media(max-width:450px){.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(--gold-light);font-variant-numeric:tabular-nums;}

  .result-block{background:var(--bg);border:1px solid var(--gold);border-radius:12px;padding:20px;margin-bottom:14px;position:relative;transition:all .3s;}
  .result-block.collapsed{padding:0;overflow:hidden;}
  .result-block.collapsed .result-body{display:none;}
  .result-toggle{position:absolute;top:10px;right:14px;background:transparent;border:1px solid var(--gold);color:var(--gold);width:28px;height:28px;border-radius:6px;cursor:pointer;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;transition:.15s;}
  .result-toggle:hover{background:var(--gold);color:#0a0a0a;}
  .result-block.collapsed .result-toggle{transform:rotate(180deg);}
  .result-collapsed-bar{display:none;align-items:center;gap:12px;padding:14px 18px;cursor:pointer;}
  .result-block.collapsed .result-collapsed-bar{display:flex;}
  .result-collapsed-bar .lbl{font-size:11px;color:var(--gold);text-transform:uppercase;font-weight:800;letter-spacing:1px;}
  .result-collapsed-bar .val{font-size:22px;font-weight:900;color:var(--gold-light);font-variant-numeric:tabular-nums;}

  .result-main{text-align:center;padding:16px 0 20px;border-bottom:1px solid rgba(255,215,0,.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(--gold-light);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(255,215,0,.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(--gold-light);line-height:1.1;font-variant-numeric:tabular-nums;}
  .result-value.small{font-size:15px;}
  .result-value.green{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(--gold-light);}
  .promo-btn.danger{border-color:var(--red);color:var(--red);}
  .promo-btn.danger:hover{background:var(--red);color:#fff;}

  .pricing-info{background:rgba(46,204,113,.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(--gold-light);}

  .cta{text-align:center;background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:28px 20px;margin-top:16px;}
  .cta-text{font-size:16px;font-weight:600;color:var(--gold);margin-bottom:16px;}
  .cta-btn{display:inline-block;background:var(--gold);color:#0a0a0a;text-decoration:none;padding:16px 40px;font-size:20px;font-weight:800;letter-spacing:1px;border-radius:999px;transition:.25s;margin:0 6px;}
  .cta-btn:hover{background:var(--gold-light);transform:scale(1.03);}
  .cta-mail{display:inline-block;color:var(--gold);text-decoration:none;padding:16px 30px;font-size:16px;font-weight:700;border:1px solid var(--gold);border-radius:999px;transition:.25s;margin:0 6px;}
  .cta-mail:hover{background:var(--gold);color:#0a0a0a;}
  .manager{margin-top:16px;font-size:13px;color:var(--muted);}

  .sticky-bar{position:fixed;left:0;right:0;bottom:0;background:linear-gradient(180deg,rgba(10,10,10,.95),#0a0a0a);border-top:3px solid var(--gold);box-shadow:0 -10px 40px rgba(255,215,0,.25),0 -4px 15px rgba(0,0,0,.8);padding:14px 20px;z-index:1000;transform:translateY(110%);transition:transform .35s cubic-bezier(.34,1.56,.64,1);backdrop-filter:blur(8px);}
  .sticky-bar.show{transform:translateY(0);}
  .sticky-bar.discount-active{border-top-color:var(--green);box-shadow:0 -10px 40px rgba(125,255,125,.4),0 -4px 15px rgba(0,0,0,.8);}
  .sticky-bar::before{content:'';position:absolute;top:-3px;left:0;right:0;height:3px;background:linear-gradient(90deg,transparent,var(--gold),var(--orange),var(--gold),transparent);background-size:200% 100%;animation:barShine 3s linear infinite;}
  .sticky-bar.discount-active::before{background:linear-gradient(90deg,transparent,var(--green),#3aa03a,var(--green),transparent);background-size:200% 100%;}
  @keyframes barShine{0%{background-position:200% 0;}100%{background-position:-200% 0;}}
  .sticky-inner{max-width:1400px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
  .sticky-info{display:flex;gap:16px;align-items:center;flex-wrap:wrap;flex:1;}
  .sticky-stat{display:flex;flex-direction:column;gap:2px;padding:6px 14px;border-left:2px solid var(--gold);}
  .sticky-stat:first-child{border-left:none;padding-left:0;}
  .sticky-stat .lbl{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:1.2px;color:var(--gold);opacity:.7;margin:0;}
  .sticky-stat .val{font-size:18px;font-weight:900;color:var(--gold-light);line-height:1;font-variant-numeric:tabular-nums;}
  .sticky-stat .val.big{font-size:26px;color:var(--gold);text-shadow:0 0 15px rgba(255,215,0,.7);animation:totalPulse 1.5s ease-in-out infinite;}
  @keyframes totalPulse{0%,100%{text-shadow:0 0 15px rgba(255,215,0,.7);}50%{text-shadow:0 0 25px rgba(255,215,0,1),0 0 40px rgba(255,140,0,.6);}}
  .sticky-bar.discount-active .sticky-stat{border-color:var(--green);}
  .sticky-bar.discount-active .sticky-stat .lbl{color:var(--green);}
  .sticky-bar.discount-active .sticky-stat .val{color:#c8ffb8;}
  .sticky-bar.discount-active .sticky-stat .val.big{color:var(--green);text-shadow:0 0 15px rgba(125,255,125,.8);animation:totalPulseGreen 1.5s ease-in-out infinite;}
  @keyframes totalPulseGreen{0%,100%{text-shadow:0 0 15px rgba(125,255,125,.8);}50%{text-shadow:0 0 25px rgba(125,255,125,1),0 0 40px rgba(58,160,58,.8);}}
  .sticky-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;}
  .sticky-btn{display:inline-flex;align-items:center;gap:6px;padding:12px 22px;border-radius:999px;border:2px solid var(--gold);background:transparent;color:var(--gold);font-size:14px;font-weight:900;cursor:pointer;transition:.2s;font-family:inherit;letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;}
  .sticky-btn:hover{background:var(--gold);color:#0a0a0a;transform:scale(1.03);}
  .sticky-btn.primary{background:linear-gradient(135deg,#FFD700,#FF8C00);color:#0a0a0a;border-color:#FFD700;box-shadow:0 0 20px rgba(255,215,0,.5);}
  .sticky-btn.primary:hover{transform:scale(1.05);box-shadow:0 0 30px rgba(255,215,0,.8);}
  .sticky-bar.discount-active .sticky-btn.primary{background:linear-gradient(135deg,#7dff7d,#3aa03a);color:#0a0a0a;border-color:#7dff7d;box-shadow:0 0 25px rgba(125,255,125,.7);}
  .sticky-btn.icon{padding:12px 14px;min-width:auto;font-size:16px;line-height:1;}
  .sticky-btn.hide{border-color:var(--red);color:var(--red);}
  .sticky-btn.hide:hover{background:var(--red);color:#fff;}

  @media(max-width:900px){
    .sticky-inner{flex-direction:column;gap:10px;}
    .sticky-info{justify-content:center;width:100%;}
    .sticky-actions{width:100%;justify-content:center;}
    .sticky-stat{padding:4px 10px;}
    .sticky-stat .val{font-size:15px;}
    .sticky-stat .val.big{font-size:20px;}
    .sticky-btn{padding:10px 16px;font-size:12px;}
  }
  @media(max-width:500px){
    body{padding-bottom:220px;}
    .sticky-info{gap:8px;}
    .sticky-stat{padding:2px 8px;}
    .sticky-stat .val{font-size:13px;}
    .sticky-stat .val.big{font-size:17px;}
    .sticky-stat .lbl{font-size:8px;}
  }

  ::-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,#FFE55C,#FFD700,#FF8C00);border:1px solid #FFD700;border-radius:9px;box-shadow:0 0 10px rgba(255,215,0,.9);}

  .seo-hidden{position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;overflow:hidden;opacity:0;pointer-events:none;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="wrap"&gt;

  &lt;div class="header"&gt;
    &lt;div class="tag"&gt;⚠️ ИЗГОТОВЛЕНИЕ ПОД ЗАКАЗ · ТРУБНЫЕ ДОСКИ&lt;/div&gt;
    &lt;h1&gt;Трубные доски&lt;/h1&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;p&gt;Трубные решётки для кожухотрубчатых теплообменников · Сверление, обработка кромок, развальцовка&lt;/p&gt;
    &lt;div class="company-info"&gt;
      &lt;b&gt;ООО «Арсенал-Деталь»&lt;/b&gt; · ИНН 6670215323 / КПП 667001001 · ОГРН 1086670018445&lt;br /&gt;
      Телефон: &lt;b&gt;8 992-017-49-73&lt;/b&gt; · E-mail: &lt;b&gt;bronestali@inbox.ru&lt;/b&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="discount-banner" id="discountBanner"&gt;
    &lt;h3&gt;? Скидка от объёма заказа ?&lt;/h3&gt;
    &lt;p&gt;Чем больше отверстий и деталей в заказе — тем ниже цена за единицу. Скидка применяется &lt;b&gt;автоматически ко всему заказу&lt;/b&gt;.&lt;/p&gt;
    &lt;div class="progress-wrap"&gt;
      &lt;div class="progress-fill" id="progressFill" style="width:0%"&gt;&lt;/div&gt;
      &lt;div class="progress-label" id="progressLabel"&gt;Задайте параметры — узнаете свою скидку&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="discount-stats"&gt;
      &lt;div class="discount-stat"&gt;&lt;div class="lbl"&gt;Отверстий всего&lt;/div&gt;&lt;div class="val" id="discQty"&gt;0 шт&lt;/div&gt;&lt;/div&gt;
      &lt;div class="discount-stat"&gt;&lt;div class="lbl"&gt;Следующий порог&lt;/div&gt;&lt;div class="val" id="discNext"&gt;1000 шт (−5%)&lt;/div&gt;&lt;/div&gt;
      &lt;div class="discount-stat"&gt;&lt;div class="lbl"&gt;Ваша скидка&lt;/div&gt;&lt;div class="val new" id="discRate"&gt;0%&lt;/div&gt;&lt;/div&gt;
      &lt;div class="discount-stat"&gt;&lt;div class="lbl"&gt;Цена за отверстие&lt;/div&gt;&lt;div class="val new" id="discPrice"&gt;—&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="ticker-block"&gt;
    &lt;div class="ticker-label"&gt;НАШИ ВОЗМОЖНОСТИ&lt;/div&gt;
    &lt;div class="ticker-viewport"&gt;
      &lt;div class="ticker-track"&gt;
        &lt;span class="ticker-item"&gt;Сталь 3: &lt;b&gt;от 212 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Сталь 20: &lt;b&gt;от 200 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;09Г2С: &lt;b&gt;от 188 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Броня С500: &lt;b&gt;от 1 625 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;12Х18Н10Т: &lt;b&gt;от 950 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;AISI 316: &lt;b&gt;от 1 300 ₽/кг&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Скидка от 1000 отв.: &lt;b&gt;−5%&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Скидка от 3000 отв.: &lt;b&gt;−10%&lt;/b&gt;&lt;/span&gt;
        &lt;span class="ticker-dot"&gt;◆&lt;/span&gt;
        &lt;span class="ticker-item"&gt;Скидка от 6000 отв.: &lt;b&gt;−15%&lt;/b&gt;&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="calc-block"&gt;
    &lt;div class="calc-title"&gt;Параметры трубной доски&lt;/div&gt;

    &lt;div class="field-row-2"&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Материал трубной доски&lt;/label&gt;
        &lt;select id="material" onchange="onMaterialChange()"&gt;&lt;/select&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Форма доски&lt;/label&gt;
        &lt;select id="shape" onchange="onShapeChange()"&gt;
          &lt;option value="round"&gt;Круглая&lt;/option&gt;
          &lt;option value="rect"&gt;Прямоугольная&lt;/option&gt;
        &lt;/select&gt;
      &lt;/div&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="5" max="200" step="1" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Цена материала, ₽/кг&lt;/label&gt;
        &lt;div class="input-clear-wrap"&gt;
          &lt;input type="number" id="matPrice" value="875" min="0" step="5" /&gt;
          &lt;button type="button" class="clear-btn" onclick="clearMatPrice()" title="Очистить"&gt;✕&lt;/button&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Плотность, кг/м³&lt;/label&gt;
        &lt;input type="number" id="density" value="7900" min="100" step="50" /&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="field-row" id="roundRow"&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Наружный диаметр, мм&lt;/label&gt;
        &lt;input type="number" id="outerDiameter" value="600" min="50" max="3000" step="10" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;&amp;nbsp;&lt;/label&gt;
        &lt;div style="font-size:12px;color:var(--gold);opacity:.7;line-height:1.4;padding-top:6px;"&gt;Для круглых трубных досок&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;&amp;nbsp;&lt;/label&gt;
        &lt;div style="font-size:12px;color:var(--gold);opacity:.7;line-height:1.4;padding-top:6px;"&gt;Можно указать чертёж&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="field-row" id="rectRow" style="display:none;"&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Длина, мм&lt;/label&gt;
        &lt;input type="number" id="length" value="605" min="50" max="3000" step="5" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Ширина, мм&lt;/label&gt;
        &lt;input type="number" id="width" value="545" min="50" max="3000" step="5" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;&amp;nbsp;&lt;/label&gt;
        &lt;div style="font-size:12px;color:var(--gold);opacity:.7;line-height:1.4;padding-top:6px;"&gt;Для прямоугольных&lt;/div&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="holesCount" value="396" min="1" max="10000" step="1" /&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Диаметр отверстий, мм&lt;/label&gt;
        &lt;input type="number" id="holeDiameter" value="16.3" min="1" max="200" step="0.1" /&gt;
      &lt;/div&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&gt;

    &lt;div class="field-row"&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;Коэфф. сложности&lt;/label&gt;
        &lt;input type="number" id="complexity" value="1.3" 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;select id="mount"&gt;
          &lt;option value="1.0"&gt;Развальцовка&lt;/option&gt;
          &lt;option value="1.15"&gt;Сварка + развальцовка&lt;/option&gt;
          &lt;option value="1.25"&gt;Сварка&lt;/option&gt;
        &lt;/select&gt;
      &lt;/div&gt;
      &lt;div class="field"&gt;
        &lt;label&gt;&amp;nbsp;&lt;/label&gt;
        &lt;div style="font-size:12px;color:var(--gold);opacity:.7;line-height:1.4;padding-top:6px;"&gt;Скидка от объёма применяется автоматически&lt;/div&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;Масса 1 доски&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="autoCutLen"&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="autoHoles"&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="autoRate"&gt;0 ₽&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="calc-block"&gt;
    &lt;div class="calc-title"&gt;Сетка ставок для выбранного материала&lt;/div&gt;
    &lt;div class="price-table"&gt;
      &lt;div class="price-table-title" id="priceTableTitle"&gt;? Ставки за метр обработки · AISI 304&lt;/div&gt;
      &lt;div class="price-grid" id="priceGrid"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="result-block" id="resultBlock"&gt;
    &lt;button class="result-toggle" onclick="toggleResult()" title="Свернуть/развернуть"&gt;▲&lt;/button&gt;
    &lt;div class="result-collapsed-bar" onclick="toggleResult()"&gt;
      &lt;span class="lbl"&gt;Итого с НДС 22%:&lt;/span&gt;
      &lt;span class="val" id="rCollapsedTotal"&gt;0 ₽&lt;/span&gt;
      &lt;span style="color:var(--gold);opacity:.7;font-size:12px;"&gt;· нажмите, чтобы развернуть&lt;/span&gt;
    &lt;/div&gt;
    &lt;div class="result-body"&gt;
      &lt;div class="calc-title"&gt;Результат расчёта&lt;/div&gt;

      &lt;div class="result-main"&gt;
        &lt;div class="result-main-label"&gt;Стоимость изготовления (с НДС 22%)&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 green" id="rDiscount"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
        &lt;div class="result-item"&gt;&lt;div class="result-label"&gt;За 1 деталь (с НДС)&lt;/div&gt;&lt;div class="result-value small" id="rPerPart"&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; — поковка/лист из выбранной марки.&lt;br /&gt;
          2. &lt;b&gt;Резка контура&lt;/b&gt; — по вашим габаритам.&lt;br /&gt;
          3. &lt;b&gt;Сверление отверстий&lt;/b&gt; — под трубы с нужным допуском.&lt;br /&gt;
          4. &lt;b&gt;Обработка кромок&lt;/b&gt; — фаски, зенковка под развальцовку.&lt;br /&gt;
          5. &lt;b&gt;Контроль&lt;/b&gt; — замеры, маркировка, паспорт.&lt;br /&gt;
          6. &lt;b&gt;НДС 22%&lt;/b&gt; — включён в итог.
        &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 danger" onclick="resetAll()"&gt;✕ Сбросить&lt;/button&gt;
        &lt;button class="promo-btn" onclick="hideStickyBar()" style="border-color:var(--red);color:var(--red);"&gt;▼ Скрыть панель&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="cta"&gt;
    &lt;p class="cta-text"&gt;Изготовим трубные доски и решётки по вашим чертежам: сталь, нержавейка, броня, титан&lt;/p&gt;
    &lt;a href="tel:+79920174973" class="cta-btn"&gt;8 (992) 017-49-73&lt;/a&gt;
    &lt;a href="mailto:bronestali@inbox.ru?subject=Запрос%20на%20трубную%20доску" class="cta-mail"&gt;✉ bronestali@inbox.ru&lt;/a&gt;
    &lt;p class="manager"&gt;Менеджер: Лариса · ООО «Арсенал-Деталь»&lt;/p&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;div class="sticky-bar" id="stickyBar"&gt;
  &lt;div class="sticky-inner"&gt;
    &lt;div class="sticky-info"&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Отверстий&lt;/div&gt;
        &lt;div class="val" id="barQty"&gt;0 шт&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Деталей&lt;/div&gt;
        &lt;div class="val" id="barCount"&gt;0&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl"&gt;Масса&lt;/div&gt;
        &lt;div class="val" id="barWeight"&gt;0 кг&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl" id="barRateLabel"&gt;Скидка&lt;/div&gt;
        &lt;div class="val" id="barRate"&gt;0%&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="sticky-stat"&gt;
        &lt;div class="lbl" id="barTotalLabel"&gt;Итого с НДС 22%&lt;/div&gt;
        &lt;div class="val big" id="barTotal"&gt;0 ₽&lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="sticky-actions"&gt;
      &lt;button class="sticky-btn primary" onclick="downloadCSV()"&gt;⬇ Скачать расчёт&lt;/button&gt;
      &lt;button class="sticky-btn" onclick="sendByEmail()"&gt;? На e-mail&lt;/button&gt;
      &lt;button class="sticky-btn hide" onclick="hideStickyBar()" title="Скрыть панель"&gt;✕&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="seo-hidden" aria-hidden="true"&gt;
  Трубные доски, трубная доска, трубные решетки, трубная решетка теплообменника,
  изготовление трубных досок, трубная доска теплообменника, резка трубных досок,
  сверление отверстий трубных досок, отверстия в трубной доске,
  трубная доска кожухотрубчатого теплообменника, изготовление трубных решеток,
  трубная доска под развальцовку, развальцовка труб в трубной доске,
  теплообменник трубная доска, трубная доска цена, купить трубную доску,
  трубная доска из нержавейки, трубная доска из стали, трубная доска чертеж,
  трубная доска размеры, изготовление теплообменников, трубная решетка кожухотрубчатого
  теплообменника, трубная доска из титана, трубная доска под сварку,
  трубная доска под вальцовку, обработка трубных досок, мехобработка трубных досок,
  сверловка трубных досок, отверстия под трубы теплообменника, трубная доска ГОСТ,
  трубная доска по чертежу, заказать трубную доску, производство трубных досок,
  трубные доски для теплообменников, трубные решетки теплообменных аппаратов,
  трубная доска из стали 20, трубная доска 09Г2С, трубная доска 12Х18Н10Т,
  трубная доска AISI 304, трубная доска AISI 316, трубная доска AISI 321,
  трубная доска из стали 3, трубная доска из стали 45, трубная доска из 40Х,
  трубная доска из 65Г, трубная доска из брони С500, трубная доска из броневой стали,
  трубная решетка из нержавейки, трубная решетка из углеродистой стали,
  трубная доска для кожухотрубчатого теплообменника, изготовление трубной решетки
  по чертежу, трубная доска с отверстиями под трубы, разметка трубной доски,
  сверление трубной доски, обработка отверстий трубной доски, зенковка трубной доски,
  фаска трубной доски, трубная доска под трубы 16х3, трубная доска под трубы 25х2,
  трубная доска теплообменника цена, трубная доска купить, трубная доска на заказ
&lt;/div&gt;

&lt;script&gt;
/* ============================================================
   ТРУБНЫЕ ДОСКИ · КАЛЬКУЛЯТОР ДЛЯ КЛИЕНТА
   НДС 22% · Скидка от объёма · Внутренний множитель себестоимости
   ============================================================ */

var HIDDEN_MULT = 2.5; // внутренний множитель, не отображается клиенту

var PROJECT = {
  vat: 22,

  baseRates: [
    {thickness:5,  rate:250},
    {thickness:8,  rate:400},
    {thickness:10, rate:545},
    {thickness:12, rate:680},
    {thickness:16, rate:950},
    {thickness:20, rate:1370},
    {thickness:25, rate:1750},
    {thickness:30, rate:2150},
    {thickness:40, rate:2900},
    {thickness:50, rate:3650},
    {thickness:60, rate:4400},
    {thickness:80, rate:5800},
    {thickness:100,rate:7200},
    {thickness:150,rate:10800},
    {thickness:200,rate:14400}
  ],

  materials: [
    // Углеродистые
    {key:'st3',       name:'Сталь 3 (Ст3сп, Ст3пс)',              price:85,   density:7850, mult:1.00},
    {key:'st20',      name:'Сталь 20 (углеродистая)',              price:80,   density:7850, mult:1.05},
    {key:'st45',      name:'Сталь 45 (углеродистая)',              price:95,   density:7850, mult:1.10},
    // Низколегированные
    {key:'09g2s',     name:'Сталь 09Г2С (низколегированная)',      price:75,   density:7850, mult:1.15},
    // Легированные
    {key:'40x',       name:'Сталь 40Х (легированная)',             price:110,  density:7850, mult:1.20},
    {key:'65g',       name:'Сталь 65Г (пружинная)',                price:130,  density:7850, mult:1.25},
    // Высокопрочная броня
    {key:'c500',      name:'Броня С500 (высокопрочная)',           price:650,  density:7850, mult:1.40},
    // Нержавеющие
    {key:'ss304',     name:'AISI 304 (08Х18Н10)',                  price:350,  density:7900, mult:1.50},
    {key:'ss316',     name:'AISI 316 (10Х17Н13М2)',                price:520,  density:8000, mult:1.65},
    {key:'ss321',     name:'AISI 321 / 12Х18Н10Т',                 price:380,  density:7900, mult:1.55}
  ],

  discounts: [
    {qty: 1000,  pct: 5},
    {qty: 3000,  pct: 10},
    {qty: 6000,  pct: 15}
  ],

  phone: '8 (992) 017-49-73',
  phoneHref: '+79920174973',
  email: 'bronestali@inbox.ru',
  manager: 'Менеджер: Лариса · ООО «Арсенал-Деталь»'
};

function fmt(n){ return Math.round(n).toLocaleString('ru-RU'); }
function fmt2(n){ return n.toLocaleString('ru-RU', {maximumFractionDigits:2}); }
function num(id){ var el=document.getElementById(id); if(!el) return 0; var v=parseFloat(el.value); return isNaN(v)?0:v; }
function getMaterial(key){ return PROJECT.materials.find(function(m){return m.key===key;}) || PROJECT.materials[0]; }

function ratesFor(mat){
  return PROJECT.baseRates.map(function(p){
    return {thickness:p.thickness, rate: Math.round(p.rate * mat.mult * HIDDEN_MULT)};
  });
}

function getRate(thickness, ratesArray){
  if (thickness &lt;= ratesArray[0].thickness) return ratesArray[0].rate;
  var last = ratesArray[ratesArray.length-1];
  if (thickness &gt;= last.thickness) return last.rate;
  for (var i=0;i&lt;ratesArray.length-1;i++){
    if (thickness &gt;= ratesArray[i].thickness &amp;&amp; thickness &lt;= ratesArray[i+1].thickness){
      var t1=ratesArray[i].thickness, t2=ratesArray[i+1].thickness;
      var r1=ratesArray[i].rate,     r2=ratesArray[i+1].rate;
      return r1 + (r2-r1)*(thickness-t1)/(t2-t1);
    }
  }
  return last.rate;
}

function getDiscountPct(totalHoles){
  var pct = 0;
  PROJECT.discounts.forEach(function(d){
    if (totalHoles &gt;= d.qty) pct = d.pct;
  });
  return pct;
}
function getNextThreshold(totalHoles){
  for (var i=0;i&lt;PROJECT.discounts.length;i++){
    if (totalHoles &lt; PROJECT.discounts[i].qty) return PROJECT.discounts[i];
  }
  return null;
}

function renderMaterialSelect(){
  var sel = document.getElementById('material');
  sel.innerHTML = PROJECT.materials.map(function(m){
    var priceStr = m.price &gt; 0 ? ' · ' + fmt(m.price * HIDDEN_MULT) + ' ₽/кг' : '';
    return '&lt;option value="'+m.key+'"&gt;'+m.name + priceStr + '&lt;/option&gt;';
  }).join('');
}

var state = {
  result: null,
  userInteracted: false,
  manuallyHidden: false
};

function renderPriceTable(){
  var grid = document.getElementById('priceGrid');
  var mat = getMaterial(document.getElementById('material').value);
  var rates = ratesFor(mat);
  document.getElementById('priceTableTitle').textContent = '? Ставки за метр обработки · ' + mat.name;
  grid.innerHTML = rates.map(function(p){
    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 onMaterialChange(){
  state.userInteracted = true;
  state.manuallyHidden = false;
  var mat = getMaterial(document.getElementById('material').value);
  document.getElementById('matPrice').value = mat.price * HIDDEN_MULT;
  document.getElementById('density').value = mat.density;
  renderPriceTable();
  calculate();
}

function onShapeChange(){
  var shape = document.getElementById('shape').value;
  document.getElementById('roundRow').style.display = shape === 'round' ? '' : 'none';
  document.getElementById('rectRow').style.display = shape === 'rect' ? '' : 'none';
  state.userInteracted = true;
  state.manuallyHidden = false;
  calculate();
}

function clearMatPrice(){
  document.getElementById('matPrice').value = '';
  calculate();
}

function calculate(){
  var mat = getMaterial(document.getElementById('material').value);
  var matPrice = num('matPrice') * HIDDEN_MULT;
  var density = num('density') || 7850;
  var thickness = num('thickness');
  var holesCount = num('holesCount');
  var holeDiameter = num('holeDiameter');
  var qty = Math.max(1, num('qty'));
  var complexity = num('complexity') || 1;
  var mount = parseFloat(document.getElementById('mount').value) || 1;
  var shape = document.getElementById('shape').value;

  var area = 0, perimeter = 0;
  if (shape === 'round'){
    var d = num('outerDiameter') / 1000;
    area = Math.PI * d * d / 4;
    perimeter = Math.PI * d;
  } else {
    var L = num('length') / 1000;
    var W = num('width') / 1000;
    area = L * W;
    perimeter = 2 * (L + W);
  }

  if (thickness &lt;= 0 || area &lt;= 0 || holesCount &lt;= 0 || holeDiameter &lt;= 0){
    document.getElementById('autoWeight').textContent = '0 кг';
    document.getElementById('autoCutLen').textContent = '0 м';
    document.getElementById('autoHoles').textContent = '0 шт';
    document.getElementById('autoRate').textContent = '0 ₽';
    document.getElementById('rPrice').textContent = '0';
    document.getElementById('rCollapsedTotal').textContent = '0 ₽';
    document.getElementById('rMatCost').textContent = '0 ₽';
    document.getElementById('rCutCost').textContent = '0 ₽';
    document.getElementById('rDiscount').textContent = '0 ₽';
    document.getElementById('rPerPart').textContent = '0 ₽';
    document.getElementById('rNote').textContent = '—';
    state.result = null;
    updateDiscountBanner();
    updateStickyBar();
    return;
  }

  var weightPerPart = area * thickness * (density / 1000);
  var matCostPerPart = weightPerPart * matPrice;

  var holeCutLen = holesCount * Math.PI * holeDiameter / 1000;
  var totalCutLen = perimeter + holeCutLen;

  var baseRate = getRate(thickness, ratesFor(mat));
  var totalHoles = holesCount * qty;
  var discPct = getDiscountPct(totalHoles);
  var rateWithDiscount = baseRate * (1 - discPct/100);

  var cutCostNoVat = totalCutLen * rateWithDiscount * complexity * mount * qty;
  var cutCostWithVat = cutCostNoVat * (1 + PROJECT.vat/100);

  var cutCostFullNoVat = totalCutLen * baseRate * complexity * mount * qty;
  var discountAmount = cutCostFullNoVat - cutCostNoVat;

  var materialTotal = matCostPerPart * qty;
  var totalWithVat = (materialTotal + cutCostNoVat) * (1 + PROJECT.vat/100);
  var totalNoVat = materialTotal + cutCostNoVat;

  var pricePerHole = totalWithVat / totalHoles;

  document.getElementById('autoWeight').textContent = fmt2(weightPerPart) + ' кг';
  document.getElementById('autoCutLen').textContent = fmt2(totalCutLen) + ' м';
  document.getElementById('autoHoles').textContent = fmt(totalHoles) + ' шт';
  document.getElementById('autoRate').textContent = fmt(pricePerHole) + ' ₽';

  document.getElementById('rPrice').textContent = fmt(totalWithVat);
  document.getElementById('rCollapsedTotal').textContent = fmt(totalWithVat) + ' ₽';
  document.getElementById('rMatCost').textContent = fmt(materialTotal) + ' ₽';
  document.getElementById('rCutCost').textContent = fmt(cutCostNoVat) + ' ₽';
  document.getElementById('rDiscount').textContent = discPct &gt; 0 ? '−' + fmt(discountAmount * (1 + PROJECT.vat/100)) + ' ₽' : '—';
  document.getElementById('rPerPart').textContent = fmt(totalWithVat / qty) + ' ₽';

  document.getElementById('rNote').textContent =
    'Материал: ' + mat.name + ' · Толщина: ' + thickness + ' мм · Отверстий: ' + holesCount + ' шт · Скидка: ' + discPct + '%';

  state.result = {
    material: mat.name,
    materialKey: mat.key,
    thickness: thickness,
    holesCount: holesCount,
    holeDiameter: holeDiameter,
    qty: qty,
    complexity: complexity,
    weight: weightPerPart,
    matCost: materialTotal,
    baseRate: baseRate,
    rateWithDiscount: rateWithDiscount,
    discountPct: discPct,
    discountAmount: discountAmount,
    cutCostNoVat: cutCostNoVat,
    cutCostWithVat: cutCostWithVat,
    totalNoVat: totalNoVat,
    totalWithVat: totalWithVat,
    totalHoles: totalHoles,
    pricePerHole: pricePerHole,
    shape: shape
  };

  updateStickyBar();
  updateDiscountBanner();
}

function toggleResult(){
  document.getElementById('resultBlock').classList.toggle('collapsed');
}

function updateDiscountBanner(){
  var holesCount = num('holesCount');
  var qty = Math.max(1, num('qty'));
  var totalHoles = holesCount * qty;
  var discPct = getDiscountPct(totalHoles);
  var next = getNextThreshold(totalHoles);
  var maxThreshold = PROJECT.discounts[PROJECT.discounts.length-1].qty;
  var progressPct = Math.min(100, (totalHoles / maxThreshold) * 100);

  var banner = document.getElementById('discountBanner');
  if (banner){
    if (discPct &gt; 0) banner.classList.add('active');
    else banner.classList.remove('active');
  }

  var fill = document.getElementById('progressFill');
  if (fill) fill.style.width = progressPct.toFixed(1)+'%';

  var lbl = document.getElementById('progressLabel');
  if (lbl){
    if (totalHoles === 0){
      lbl.innerHTML = 'Задайте параметры — узнаете свою скидку';
    } else if (!next){
      lbl.innerHTML = '? &lt;b&gt;МАКСИМАЛЬНАЯ СКИДКА '+discPct+'%&lt;/b&gt; применена ко всему заказу';
    } else {
      lbl.innerHTML = 'Набрано: &lt;b&gt;'+fmt(totalHoles)+' отв.&lt;/b&gt; · до скидки '+next.pct+'% осталось '+fmt(next.qty-totalHoles)+' отв.';
    }
  }

  var q = document.getElementById('discQty');
  if (q) q.textContent = fmt(totalHoles)+' шт';

  var nxt = document.getElementById('discNext');
  if (nxt) nxt.textContent = next ? fmt(next.qty)+' шт (−'+next.pct+'%)' : 'Максимум ✓';

  var rate = document.getElementById('discRate');
  if (rate) rate.textContent = discPct+'%';

  var priceEl = document.getElementById('discPrice');
  if (priceEl){
    if (!state.result || totalHoles === 0){
      priceEl.textContent = '—';
    } else {
      priceEl.textContent = fmt(state.result.pricePerHole)+' ₽';
    }
  }
}

function updateStickyBar(){
  var bar = document.getElementById('stickyBar');
  if (!state.userInteracted || state.manuallyHidden || !state.result){
    bar.classList.remove('show');
    return;
  }

  var r = state.result;
  document.getElementById('barQty').textContent = fmt(r.totalHoles)+' шт';
  document.getElementById('barCount').textContent = r.qty;
  document.getElementById('barWeight').textContent = fmt2(r.weight * r.qty)+' кг';
  document.getElementById('barRate').textContent = r.discountPct &gt; 0 ? '−'+r.discountPct+'%' : '0%';
  document.getElementById('barRateLabel').textContent = r.discountPct &gt; 0 ? '? Скидка' : 'Скидка';
  document.getElementById('barTotal').textContent = fmt(r.totalWithVat)+' ₽';
  document.getElementById('barTotalLabel').textContent = r.discountPct &gt; 0 ? 'Итого со скидкой' : 'Итого с НДС 22%';

  bar.classList.add('show');
  if (r.discountPct &gt; 0) bar.classList.add('discount-active');
  else bar.classList.remove('discount-active');
}

function hideStickyBar(){
  state.manuallyHidden = true;
  document.getElementById('stickyBar').classList.remove('show');
}

function resetAll(){
  if (!confirm('Сбросить все параметры?')) return;
  state.userInteracted = false;
  state.manuallyHidden = false;
  document.getElementById('material').value = 'ss304';
  var mat = getMaterial('ss304');
  document.getElementById('matPrice').value = mat.price * HIDDEN_MULT;
  document.getElementById('density').value = mat.density;
  document.getElementById('shape').value = 'round';
  document.getElementById('thickness').value = 20;
  document.getElementById('outerDiameter').value = 600;
  document.getElementById('length').value = 605;
  document.getElementById('width').value = 545;
  document.getElementById('holesCount').value = 396;
  document.getElementById('holeDiameter').value = 16.3;
  document.getElementById('qty').value = 1;
  document.getElementById('complexity').value = 1.3;
  document.getElementById('mount').value = '1.0';
  document.getElementById('resultBlock').classList.remove('collapsed');
  onShapeChange();
  renderPriceTable();
  calculate();
  document.getElementById('stickyBar').classList.remove('show');
}

function downloadBlob(blob, filename){
  var url = URL.createObjectURL(blob);
  var a = document.createElement('a');
  a.href = url; a.download = filename;
  document.body.appendChild(a); a.click(); a.remove();
  setTimeout(function(){URL.revokeObjectURL(url);},500);
}
function today(){
  var d=new Date(), p=function(n){return String(n).padStart(2,'0');};
  return d.getFullYear()+'-'+p(d.getMonth()+1)+'-'+p(d.getDate());
}

function downloadCSV(){
  if (!state.result) return;
  var r = state.result;
  var header = ['Параметр','Значение'];
  var body = [
    ['Материал', r.material],
    ['Толщина доски', r.thickness + ' мм'],
    ['Форма', r.shape === 'round' ? 'круглая' : 'прямоугольная'],
    ['Количество отверстий', r.holesCount + ' шт'],
    ['Диаметр отверстий', r.holeDiameter + ' мм'],
    ['Количество деталей', r.qty + ' шт'],
    ['Всего отверстий', r.totalHoles + ' шт'],
    ['Коэфф. сложности', r.complexity + '×'],
    ['Масса 1 доски', r.weight.toFixed(2) + ' кг'],
    ['Металл (справочно)', Math.round(r.matCost) + ' ₽'],
    ['Обработка (без НДС)', Math.round(r.cutCostNoVat) + ' ₽'],
    ['Скидка от объёма', r.discountPct + '%'],
    ['Цена за отверстие', Math.round(r.pricePerHole) + ' ₽'],
    ['ИТОГО с НДС 22%', Math.round(r.totalWithVat) + ' ₽'],
    ['За 1 деталь (с НДС)', Math.round(r.totalWithVat / r.qty) + ' ₽']
  ];
  var esc = function(v){return '"'+String(v).replace(/"/g,'""')+'"';};
  var csv = [header].concat(body).map(function(row){return row.map(esc).join(';');}).join('\r\n');
  downloadBlob(new Blob(['\uFEFF'+csv],{type:'text/csv;charset=utf-8;'}), 'trubnaya_doska_'+r.materialKey+'_'+today()+'.csv');
}

function downloadExcel(){
  if (!state.result) return;
  var r = state.result;
  var header = ['Параметр','Значение'];
  var body = [
    ['Материал', r.material],
    ['Толщина доски', r.thickness + ' мм'],
    ['Форма', r.shape === 'round' ? 'круглая' : 'прямоугольная'],
    ['Количество отверстий', r.holesCount + ' шт'],
    ['Диаметр отверстий', r.holeDiameter + ' мм'],
    ['Количество деталей', r.qty + ' шт'],
    ['Всего отверстий', r.totalHoles + ' шт'],
    ['Коэфф. сложности', r.complexity + '×'],
    ['Масса 1 доски', r.weight.toFixed(2) + ' кг'],
    ['Металл (справочно)', Math.round(r.matCost) + ' ₽'],
    ['Обработка (без НДС)', Math.round(r.cutCostNoVat) + ' ₽'],
    ['Скидка от объёма', r.discountPct + '%'],
    ['Цена за отверстие', Math.round(r.pricePerHole) + ' ₽'],
    ['ИТОГО с НДС 22%', Math.round(r.totalWithVat) + ' ₽'],
    ['За 1 деталь (с НДС)', Math.round(r.totalWithVat / r.qty) + ' ₽']
  ];
  var esc = function(v){return String(v==null?'':v).replace(/&amp;/g,'&amp;amp;').replace(/&lt;/g,'&amp;lt;').replace(/&gt;/g,'&amp;gt;');};
  var table = '&lt;table border="1" cellspacing="0" cellpadding="4"&gt;'+
    '&lt;thead style="background:#000;color:#ffd700;"&gt;&lt;tr&gt;'+header.map(function(h){return '&lt;th&gt;'+esc(h)+'&lt;/th&gt;';}).join('')+'&lt;/tr&gt;&lt;/thead&gt;'+
    '&lt;tbody&gt;'+body.map(function(row){return '&lt;tr&gt;'+row.map(function(c){return '&lt;td&gt;'+esc(c)+'&lt;/td&gt;';}).join('')+'&lt;/tr&gt;';}).join('')+'&lt;/tbody&gt;&lt;/table&gt;';
  var 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;Расчёт трубной доски — '+today()+'&lt;/h2&gt;'+
    '&lt;p&gt;ООО «Арсенал-Деталь» · 8 (992) 017-49-73&lt;/p&gt;'+
    table+'&lt;/body&gt;&lt;/html&gt;';
  downloadBlob(new Blob(['\uFEFF'+html],{type:'application/vnd.ms-excel;charset=utf-8;'}), 'trubnaya_doska_'+r.materialKey+'_'+today()+'.xls');
}

function sendByEmail(){
  if (!state.result) return;
  var r = state.result;
  var lines = ['Здравствуйте!','','Прошу подготовить КП на изготовление трубной доски:',''];
  lines.push('Материал: '+r.material);
  lines.push('Толщина: '+r.thickness+' мм');
  lines.push('Форма: '+(r.shape === 'round' ? 'круглая' : 'прямоугольная'));
  lines.push('Отверстий: '+r.holesCount+' шт × Ø'+r.holeDiameter+' мм');
  lines.push('Количество деталей: '+r.qty+' шт');
  lines.push('Всего отверстий: '+r.totalHoles+' шт');
  lines.push('Сложность: '+r.complexity+'×');
  lines.push('');
  lines.push('ИТОГО с НДС 22%: '+Math.round(r.totalWithVat)+' ₽');
  lines.push('За 1 деталь: '+Math.round(r.totalWithVat / r.qty)+' ₽');
  lines.push('Цена за отверстие: '+Math.round(r.pricePerHole)+' ₽');
  lines.push('');
  lines.push('С уважением,');
  var subject = encodeURIComponent('Запрос КП — трубная доска ' + r.material);
  var body = encodeURIComponent(lines.join('\n'));
  window.location.href = 'mailto:'+PROJECT.email+'?subject='+subject+'&amp;body='+body;
}

document.getElementById('material').addEventListener('change', onMaterialChange);
document.getElementById('shape').addEventListener('change', onShapeChange);

['matPrice','density','thickness','outerDiameter','length','width','holesCount','holeDiameter','qty','complexity','mount'].forEach(function(id){
  var el = document.getElementById(id);
  if (!el) return;
  el.addEventListener('input', function(){
    state.userInteracted = true;
    state.manuallyHidden = false;
    calculate();
  });
  el.addEventListener('change', function(){
    state.userInteracted = true;
    state.manuallyHidden = false;
    calculate();
  });
});

renderMaterialSelect();
document.getElementById('material').value = 'ss304';
var startMat = getMaterial('ss304');
document.getElementById('matPrice').value = startMat.price * HIDDEN_MULT;
document.getElementById('density').value = startMat.density;
renderPriceTable();
calculate();
document.getElementById('stickyBar').classList.remove('show');
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-10-15T08:50:28Z</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>
