<?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/rezervuary</id>
  <link href="https://www.pandoraburo.ru/rezervuary.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.0"&gt;
&lt;title&gt;Резервуары 5-6 м³ · Прайс + Запрос + Счёт&lt;/title&gt;
&lt;style&gt;
  :root{--gold:#FFD700;--gold-light:#FFE55C;--bg:#0a0a0a;--muted:#9a8040;--border:rgba(212,175,55,.35);--green:#7dff7d;--red:#ff8a7a;--cyan:#6ee8e4;}
  *{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;line-height:1.5;}
  .wrap{max-width:1900px;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(--gold);color:#0a0a0a;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,215,0,.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),0 0 45px rgba(255,170,0,.6);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),0 0 45px rgba(255,170,0,.6);}50%{text-shadow:0 0 15px rgba(255,215,0,1),0 0 35px rgba(255,199,0,.95),0 0 60px rgba(255,170,0,.8);}}
  .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;}

  /* СТАТИСТИКА */
  .stats{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:16px;}
  @media(max-width:1200px){.stats{grid-template-columns:repeat(3,1fr);}}
  @media(max-width:600px){.stats{grid-template-columns:repeat(2,1fr);}}
  .stat{background:var(--bg);border:1px solid var(--gold);border-radius:12px;padding:14px;text-align:center;}
  .lbl{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--gold);opacity:.7;margin-bottom:6px;}
  .val{font-size:18px;font-weight:800;color:var(--gold-light);line-height:1.1;}
  .val.green{color:var(--green);}
  .val.red{color:var(--red);}
  .val.sm{font-size:14px;}

  /* ТУЛБАР */
  .toolbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px;}
  .btn{display:inline-flex;align-items:center;gap:6px;padding:10px 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;}
  .btn:hover{background:var(--gold);color:#0a0a0a;}
  .btn.primary{background:var(--gold);color:#0a0a0a;}
  .btn.green{background:linear-gradient(135deg,#7dff7d,#3aa03a);color:#0a0a0a;border-color:#7dff7d;}
  .btn.cyan{background:linear-gradient(135deg,#6ee8e4,#3aa0a0);color:#0a0a0a;border-color:#6ee8e4;font-weight:900;}
  .btn.red{background:transparent;color:var(--red);border-color:var(--red);}
  .btn.red:hover{background:var(--red);color:#0a0a0a;}

  /* ФИЛЬТР */
  .filter{background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:16px;margin-bottom:16px;}
  .filter-row{display:grid;grid-template-columns:2fr auto auto;gap:12px;align-items:center;}
  @media(max-width:700px){.filter-row{grid-template-columns:1fr;}}
  .search{width:100%;padding:12px 14px;border:1px solid var(--gold);border-radius:9px;font-size:14px;background:#0a0a0a;color:var(--gold-light);outline:none;font-family:inherit;font-weight:600;}
  .search::placeholder{color:rgba(212,175,55,.4);}
  .counter{color:var(--gold);font-size:13px;white-space:nowrap;padding:12px 14px;border:1px solid var(--gold);border-radius:9px;background:#0a0a0a;font-weight:700;}
  .cat-select{padding:12px 14px;border:1px solid var(--gold);border-radius:9px;background:#0a0a0a;color:var(--gold-light);font-size:13px;font-family:inherit;outline:none;cursor:pointer;font-weight:700;}

  /* ТАБЛИЦА */
  .table-block{background:var(--bg);border:1px solid var(--gold);border-radius:14px;padding:20px;margin-bottom:16px;}
  .block-title{color:var(--gold);font-size:12px;font-weight:800;letter-spacing:2px;text-align:center;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border);text-transform:uppercase;text-shadow:0 0 12px rgba(255,215,0,.6);}
  .table-wrap{overflow:auto;max-height:70vh;border-radius:8px;border:1px solid var(--gold);}
  table{width:100%;table-layout:auto;border-collapse:collapse;background:#0a0a0a;font-size:12px;}
  th,td{padding:7px 5px;text-align:left;border-bottom:1px solid rgba(212,175,55,.2);vertical-align:middle;color:var(--gold);background:transparent;white-space:nowrap;}
  th{position:sticky;top:0;z-index:2;background:#0a0a0a;color:var(--gold);font-weight:800;text-transform:uppercase;font-size:10px;letter-spacing:1px;border-bottom:1px solid var(--gold);cursor:pointer;user-select:none;}
  th:hover{background:#1a1408;}
  th.sortable::after{content:' ⇅';opacity:.5;margin-left:4px;font-size:9px;}
  th.asc::after{content:' ▲';opacity:1;color:var(--gold-light);}
  th.desc::after{content:' ▼';opacity:1;color:var(--gold-light);}
  th.num,td.num{text-align:right;font-variant-numeric:tabular-nums;}
  tbody tr{transition:background .15s;}
  tbody tr:hover{background:#1a1408;}
  td.article{font-family:'Courier New',monospace;font-size:11px;color:var(--gold-light);}
  td b{color:#fff;}
  td.margin-pos{color:var(--green);font-weight:800;}
  td.margin-neg{color:var(--red);font-weight:800;}
  input.cell{
    width:100%;padding:5px 6px;border:1px solid var(--border);border-radius:6px;
    background:#0a0a0a;color:var(--gold-light);
    font-size:11px;font-weight:700;text-align:right;
    font-family:inherit;outline:none;font-variant-numeric:tabular-nums;
  }
  input.cell:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(255,215,0,.2);}
  input.cell.filled-supp{border-color:rgba(110,232,228,.6);color:var(--cyan);}
  input.cell.filled-our{border-color:rgba(125,255,125,.6);color:var(--green);}
  input.cell.empty{border-color:rgba(255,138,122,.35);}
  .badge{display:inline-block;padding:2px 6px;border-radius:10px;font-size:9px;font-weight:800;text-transform:uppercase;background:rgba(212,175,55,.15);color:var(--gold-light);border:1px solid rgba(212,175,55,.5);white-space:nowrap;}
  .badge.sup{background:rgba(110,232,228,.15);color:var(--cyan);border-color:rgba(110,232,228,.5);}
  .badge.steel{background:rgba(255,215,0,.15);color:var(--gold);border-color:rgba(255,215,0,.5);}
  .badge.coat{background:rgba(125,255,125,.15);color:var(--green);border-color:rgba(125,255,125,.5);}

  /* КАЛЬКУЛЯТОР ПАРТИИ */
  .repair-block{background:linear-gradient(135deg,rgba(110,232,228,.08),rgba(10,10,10,.95));border:3px solid var(--cyan);border-radius:16px;padding:22px;margin-bottom:16px;position:relative;box-shadow:0 0 30px rgba(110,232,228,.2);}
  .repair-block::before{content:'? КАЛЬКУЛЯТОР ПАРТИИ РЕЗЕРВУАРОВ';position:absolute;top:-14px;left:50%;transform:translateX(-50%);background:#0a0a0a;color:var(--cyan);padding:4px 22px;border:2px solid var(--cyan);border-radius:999px;font-size:12px;font-weight:900;letter-spacing:3px;text-shadow:0 0 15px rgba(110,232,228,1);white-space:nowrap;}
  .repair-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;}
  @media(max-width:900px){.repair-grid{grid-template-columns:repeat(2,1fr);}}
  @media(max-width:500px){.repair-grid{grid-template-columns:1fr;}}
  .repair-check{display:flex;align-items:center;gap:8px;padding:10px 12px;background:rgba(0,0,0,.5);border:1px solid var(--cyan);border-radius:8px;cursor:pointer;font-size:13px;font-weight:600;color:var(--cyan);transition:.15s;}
  .repair-check:hover{background:rgba(110,232,228,.1);}
  .repair-check input{width:16px;height:16px;accent-color:var(--cyan);cursor:pointer;}
  .repair-total{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;padding-top:14px;border-top:2px solid var(--cyan);}
  @media(max-width:900px){.repair-total{grid-template-columns:repeat(2,1fr);}}
  .repair-stat{background:rgba(0,0,0,.5);border:1px solid var(--cyan);border-radius:10px;padding:12px;text-align:center;}
  .repair-stat .lbl{color:var(--cyan);font-size:10px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;margin-bottom:6px;}
  .repair-stat .val{font-size:20px;font-weight:900;color:var(--cyan);}

  /* МОДАЛЬНОЕ ОКНО */
  .modal{position:fixed;inset:0;background:rgba(0,0,0,.85);z-index:1000;display:none;align-items:center;justify-content:center;padding:20px;backdrop-filter:blur(4px);}
  .modal.active{display:flex;}
  .modal-content{background:#0a0a0a;border:3px solid var(--gold);border-radius:16px;max-width:900px;width:100%;max-height:90vh;overflow:auto;padding:26px;box-shadow:0 0 60px rgba(255,215,0,.4);}
  .modal-title{color:var(--gold);font-size:20px;font-weight:900;text-transform:uppercase;letter-spacing:2px;margin-bottom:16px;text-align:center;text-shadow:0 0 15px rgba(255,215,0,.7);}
  .modal-body{color:#e8e8e8;font-size:13px;line-height:1.6;}
  .modal-body pre{background:#050505;border:1px solid var(--border);border-radius:8px;padding:16px;white-space:pre-wrap;font-family:'Courier New',monospace;font-size:12px;color:var(--cyan);max-height:400px;overflow:auto;}
  .modal-actions{display:flex;gap:10px;justify-content:center;margin-top:16px;flex-wrap:wrap;}

  .footnote{display:flex;flex-wrap:wrap;gap:20px;margin-top:14px;padding-top:12px;border-top:1px solid var(--gold);}
  .fn{color:var(--gold);font-size:12px;position:relative;padding-left:14px;opacity:.9;}
  .fn::before{content:"◆";position:absolute;left:0;color:var(--gold);font-size:8px;top:4px;}

  .wrap ::-webkit-scrollbar{width:14px;height:14px;}
  .wrap ::-webkit-scrollbar-track{background:#050505;border:1px solid #2a2210;border-radius:9px;}
  .wrap ::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#FFE55C,#FFD700,#FF8C00);border-radius:9px;border:1px solid #FFD700;}

  @media print{body{background:#fff;color:#000;padding:0;}.header{background:#000 !important;color:#FFD700 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact;}.header h1{color:#FFD700 !important;}.tag{background:#FFD700 !important;color:#000 !important;}.line{background:#FFD700 !important;}.stats,.table-block,.repair-block{background:#fff !important;border-color:#666 !important;}.toolbar,.filter,.modal{display:none !important;}.stat,.repair-stat{background:#fff !important;border-color:#999 !important;}.lbl,.repair-stat .lbl{color:#000 !important;}.val,.repair-stat .val{color:#000 !important;}.block-title{color:#000 !important;}th{background:#000 !important;color:#FFD700 !important;-webkit-print-color-adjust:exact;print-color-adjust:exact;}td{color:#000 !important;border-color:#ccc !important;}input{background:#fff !important;color:#000 !important;border-color:#ccc !important;}}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="wrap"&gt;

  &lt;div class="header"&gt;
    &lt;div class="tag"&gt;ВНУТРЕННИЙ ПРАЙС · СТАЛЬНЫЕ РЕЗЕРВУАРЫ 5-6 М³&lt;/div&gt;
    &lt;h1&gt;Резервуары 5-6 м³ · Прайс + Запрос + Счёт&lt;/h1&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;p&gt;Цена поставщика · Наша цена · Маржа · Калькулятор партии · Запросы · Счета&lt;/p&gt;
  &lt;/div&gt;

  
  &lt;div class="stats"&gt;
    &lt;div class="stat"&gt;&lt;div class="lbl"&gt;Всего позиций&lt;/div&gt;&lt;div class="val" id="statTotal"&gt;—&lt;/div&gt;&lt;/div&gt;
    &lt;div class="stat"&gt;&lt;div class="lbl"&gt;С ценой поставщика&lt;/div&gt;&lt;div class="val" id="statSupp"&gt;—&lt;/div&gt;&lt;/div&gt;
    &lt;div class="stat"&gt;&lt;div class="lbl"&gt;С нашей ценой&lt;/div&gt;&lt;div class="val green" id="statOur"&gt;—&lt;/div&gt;&lt;/div&gt;
    &lt;div class="stat"&gt;&lt;div class="lbl"&gt;Сумма закупки&lt;/div&gt;&lt;div class="val sm" id="statSumSupp"&gt;—&lt;/div&gt;&lt;/div&gt;
    &lt;div class="stat"&gt;&lt;div class="lbl"&gt;Сумма продажи&lt;/div&gt;&lt;div class="val sm green" id="statSumOur"&gt;—&lt;/div&gt;&lt;/div&gt;
    &lt;div class="stat"&gt;&lt;div class="lbl"&gt;Общая маржа&lt;/div&gt;&lt;div class="val green" id="statMargin"&gt;—&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;

  
  &lt;div class="toolbar"&gt;
    &lt;button class="btn cyan" onclick="openRequestModal()"&gt;? Сформировать запрос&lt;/button&gt;
    &lt;button class="btn green" onclick="openInvoiceModal()"&gt;? Сформировать счёт&lt;/button&gt;
    &lt;button class="btn primary" onclick="dlCSV()"&gt;⬇ CSV&lt;/button&gt;
    &lt;button class="btn primary" onclick="dlExcel()"&gt;⬇ Excel&lt;/button&gt;
    &lt;button class="btn" onclick="saveLocal()"&gt;? Сохранить&lt;/button&gt;
    &lt;button class="btn" onclick="loadLocal()"&gt;? Загрузить&lt;/button&gt;
    &lt;button class="btn" onclick="window.print()"&gt;? Печать&lt;/button&gt;
    &lt;button class="btn red" onclick="resetAll()"&gt;✕ Сброс&lt;/button&gt;
  &lt;/div&gt;

  
  &lt;div class="repair-block"&gt;
    &lt;div style="color:#6ee8e4;font-size:13px;text-align:center;margin-bottom:16px;font-weight:600"&gt;
      Отметьте категории резервуаров — увидите стоимость партии по типу исполнения
    &lt;/div&gt;
    &lt;div class="repair-grid"&gt;
      &lt;label class="repair-check"&gt;&lt;input type="checkbox" class="repair-cb" data-cat="Наземные РГСН" onchange="calcRepair()" /&gt; ? Наземные РГСН&lt;/label&gt;
      &lt;label class="repair-check"&gt;&lt;input type="checkbox" class="repair-cb" data-cat="Подземные РГСП" onchange="calcRepair()" /&gt; ? Подземные РГСП&lt;/label&gt;
      &lt;label class="repair-check"&gt;&lt;input type="checkbox" class="repair-cb" data-cat="Утепленные" onchange="calcRepair()" /&gt; ? Утепленные (ППУ)&lt;/label&gt;
      &lt;label class="repair-check"&gt;&lt;input type="checkbox" class="repair-cb" data-cat="Нержавейка" onchange="calcRepair()" /&gt; ✨ Нержавеющая сталь&lt;/label&gt;
    &lt;/div&gt;
    &lt;div class="repair-total"&gt;
      &lt;div class="repair-stat"&gt;&lt;div class="lbl"&gt;Позиций в партии&lt;/div&gt;&lt;div class="val" id="repPositions"&gt;0&lt;/div&gt;&lt;/div&gt;
      &lt;div class="repair-stat"&gt;&lt;div class="lbl"&gt;Сумма закупки&lt;/div&gt;&lt;div class="val" id="repCost"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="repair-stat"&gt;&lt;div class="lbl"&gt;Сумма продажи&lt;/div&gt;&lt;div class="val" id="repSale"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
      &lt;div class="repair-stat"&gt;&lt;div class="lbl"&gt;? Маржа партии&lt;/div&gt;&lt;div class="val" id="repMargin"&gt;0 ₽&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  
  &lt;div class="filter"&gt;
    &lt;div class="filter-row"&gt;
      &lt;input class="search" type="text" id="search" placeholder="? Поиск: № · модель · поставщик · сталь · покрытие…" /&gt;
      &lt;div class="counter" id="counter"&gt;Найдено: 0&lt;/div&gt;
      &lt;select class="cat-select" id="fCat" onchange="render()"&gt;&lt;option value="all"&gt;Все категории&lt;/option&gt;&lt;/select&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  
  &lt;div class="table-block"&gt;
    &lt;div class="block-title"&gt;Сводная таблица · Стальные резервуары 5-6 м³&lt;/div&gt;
    &lt;div class="table-wrap"&gt;
      &lt;table id="tbl"&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th class="num sortable" data-key="num"&gt;№&lt;/th&gt;
            &lt;th class="sortable" data-key="cat"&gt;Категория&lt;/th&gt;
            &lt;th class="sortable" data-key="supplier"&gt;Поставщик&lt;/th&gt;
            &lt;th class="sortable" data-key="model"&gt;Модель&lt;/th&gt;
            &lt;th class="num sortable" data-key="volume"&gt;Объём, м³&lt;/th&gt;
            &lt;th class="sortable" data-key="steel"&gt;Марка стали&lt;/th&gt;
            &lt;th class="num sortable" data-key="wallThickness"&gt;Стенка, мм&lt;/th&gt;
            &lt;th class="num sortable" data-key="bottomThickness"&gt;Днище, мм&lt;/th&gt;
            &lt;th class="sortable" data-key="coating"&gt;Внутр. покрытие&lt;/th&gt;
            &lt;th class="sortable" data-key="externalCoating"&gt;Внешн. покрытие&lt;/th&gt;
            &lt;th class="sortable" data-key="includes"&gt;Комплектация&lt;/th&gt;
            &lt;th class="num sortable" data-key="qty"&gt;Кол-во&lt;/th&gt;
            &lt;th class="sortable" data-key="leadTime"&gt;Срок&lt;/th&gt;
            &lt;th class="num"&gt;Цена поставщика, ₽&lt;/th&gt;
            &lt;th class="num"&gt;Наша цена, ₽&lt;/th&gt;
            &lt;th class="num sortable" data-key="margin"&gt;Маржа, ₽&lt;/th&gt;
            &lt;th class="num sortable" data-key="marginPct"&gt;Маржа, %&lt;/th&gt;
            &lt;th&gt;Примечание&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody id="tbody"&gt;&lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
    &lt;div class="footnote"&gt;
      &lt;div class="fn"&gt;Цена поставщика — закупка (голубой цвет)&lt;/div&gt;
      &lt;div class="fn"&gt;Наша цена — продажа (зелёный цвет)&lt;/div&gt;
      &lt;div class="fn"&gt;Маржа считается автоматически&lt;/div&gt;
      &lt;div class="fn"&gt;Кнопка «Сохранить» — данные в браузере&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;


&lt;div class="modal" id="modal"&gt;
  &lt;div class="modal-content"&gt;
    &lt;div class="modal-title" id="modalTitle"&gt;Запрос&lt;/div&gt;
    &lt;div class="modal-body" id="modalBody"&gt;&lt;/div&gt;
    &lt;div class="modal-actions"&gt;
      &lt;button class="btn primary" onclick="copyModal()"&gt;? Скопировать&lt;/button&gt;
      &lt;button class="btn" onclick="closeModal()"&gt;✕ Закрыть&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
/* ==================== ДАННЫЕ ==================== */
var data=[
  // НАЗЕМНЫЕ РГСН
  {num:1,cat:'Наземные РГСН',supplier:'БЗЕ (Березовский)',model:'РГСН-5',volume:5,steel:'09Г2С',wallThickness:4,bottomThickness:5,coating:'Эпоксидное (пищевое)',externalCoating:'Грунт ГФ-021 + ПФ-115',includes:'Люк ДУ-500, 2 патрубка ДУ-80, опоры',qty:1,leadTime:'14 дней',delivery:'Самовывоз Березовский',note:'Паспорт сосуда, сертификат на сталь',priceSupp:276000,priceOur:0},
  {num:2,cat:'Наземные РГСН',supplier:'БЗЕ (Березовский)',model:'РГСН-6',volume:6,steel:'09Г2С',wallThickness:4,bottomThickness:5,coating:'Эпоксидное (пищевое)',externalCoating:'Грунт ГФ-021 + ПФ-115',includes:'Люк ДУ-500, 2 патрубка ДУ-80, опоры, лестница',qty:1,leadTime:'14 дней',delivery:'Самовывоз Березовский',note:'Паспорт сосуда, сертификат на сталь',priceSupp:295000,priceOur:0},
  {num:3,cat:'Наземные РГСН',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСН-5',volume:5,steel:'Ст3сп',wallThickness:4,bottomThickness:5,coating:'Без покрытия (техвода)',externalCoating:'Грунт ГФ-021',includes:'Люк ДУ-500, патрубки ДУ-80, опоры',qty:1,leadTime:'10 дней',delivery:'до терминала Екб',note:'Бюджетный вариант для тех. воды',priceSupp:220000,priceOur:0},
  {num:4,cat:'Наземные РГСН',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСН-6',volume:6,steel:'Ст3сп',wallThickness:4,bottomThickness:5,coating:'Без покрытия (техвода)',externalCoating:'Грунт ГФ-021',includes:'Люк ДУ-500, патрубки ДУ-80, опоры',qty:1,leadTime:'10 дней',delivery:'до терминала Екб',note:'Бюджетный вариант для тех. воды',priceSupp:238000,priceOur:0},
  {num:5,cat:'Наземные РГСН',supplier:'Спецнефтемаш (Челябинск)',model:'РГСН-5',volume:5,steel:'09Г2С',wallThickness:4,bottomThickness:5,coating:'Пищевая эмаль',externalCoating:'Грунт + эмаль ПФ-115',includes:'Люк ДУ-500, 2 патрубка, опоры',qty:1,leadTime:'21 день',delivery:'до объекта Челябинск',note:'Для питьевой воды, гарантия 24 мес.',priceSupp:285000,priceOur:0},
  {num:6,cat:'Наземные РГСН',supplier:'НормаКомплект (Челябинск)',model:'РГСН-5',volume:5,steel:'09Г2С',wallThickness:5,bottomThickness:6,coating:'Эпоксидное',externalCoating:'Грунт + эмаль',includes:'Люк ДУ-500, патрубки, опоры',qty:1,leadTime:'14 дней',delivery:'до терминала Челябинск',note:'Усиленная стенка 5 мм',priceSupp:310000,priceOur:0},

  // ПОДЗЕМНЫЕ РГСП
  {num:7,cat:'Подземные РГСП',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСП-5',volume:5,steel:'09Г2С',wallThickness:5,bottomThickness:6,coating:'Без покрытия',externalCoating:'Битумно-резиновая мастика',includes:'Люк ДУ-600, патрубки, кольца жесткости',qty:1,leadTime:'21 день',delivery:'до терминала Екб',note:'Усиленная конструкция для грунта',priceSupp:310000,priceOur:0},
  {num:8,cat:'Подземные РГСП',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСП-6',volume:6,steel:'09Г2С',wallThickness:5,bottomThickness:6,coating:'Без покрытия',externalCoating:'Битумно-резиновая мастика',includes:'Люк ДУ-600, патрубки, кольца жесткости',qty:1,leadTime:'21 день',delivery:'до терминала Екб',note:'Усиленная конструкция для грунта',priceSupp:340000,priceOur:0},
  {num:9,cat:'Подземные РГСП',supplier:'БЗЕ (Березовский)',model:'РГСП-5',volume:5,steel:'09Г2С',wallThickness:5,bottomThickness:6,coating:'Эпоксидное (пищевое)',externalCoating:'Битумная мастика + защита',includes:'Люк ДУ-600, патрубки, кольца, горловина',qty:1,leadTime:'25 дней',delivery:'Самовывоз Березовский',note:'Для питьевой воды, подземная установка',priceSupp:365000,priceOur:0},
  {num:10,cat:'Подземные РГСП',supplier:'Спецнефтемаш (Челябинск)',model:'РГСП-6',volume:6,steel:'09Г2С',wallThickness:6,bottomThickness:8,coating:'Без покрытия',externalCoating:'Усиленная битумная изоляция',includes:'Люк ДУ-600, патрубки, кольца жесткости',qty:1,leadTime:'30 дней',delivery:'до объекта Челябинск',note:'Максимальная защита от грунта',priceSupp:395000,priceOur:0},

  // УТЕПЛЕННЫЕ
  {num:11,cat:'Утепленные',supplier:'БЗЕ (Березовский)',model:'РГСН-5У',volume:5,steel:'09Г2С',wallThickness:4,bottomThickness:5,coating:'Грунт ГФ-021',externalCoating:'ППУ 50мм + оцинковка 0.7мм',includes:'Люк ДУ-500, патрубки, опоры, лестница',qty:1,leadTime:'30 дней',delivery:'Самовывоз Березовский',note:'Зимняя эксплуатация до -40°C',priceSupp:380000,priceOur:0},
  {num:12,cat:'Утепленные',supplier:'БЗЕ (Березовский)',model:'РГСН-6У',volume:6,steel:'09Г2С',wallThickness:4,bottomThickness:5,coating:'Грунт ГФ-021',externalCoating:'ППУ 50мм + оцинковка 0.7мм',includes:'Люк ДУ-500, патрубки, опоры, лестница',qty:1,leadTime:'30 дней',delivery:'Самовывоз Березовский',note:'Зимняя эксплуатация до -40°C',priceSupp:410000,priceOur:0},
  {num:13,cat:'Утепленные',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСН-5У',volume:5,steel:'Ст3сп',wallThickness:4,bottomThickness:5,coating:'Грунт',externalCoating:'ППУ 50мм + оцинковка',includes:'Люк, патрубки, опоры',qty:1,leadTime:'25 дней',delivery:'до терминала Екб',note:'Эконом-вариант с утеплением',priceSupp:345000,priceOur:0},
  {num:14,cat:'Утепленные',supplier:'Спецнефтемаш (Челябинск)',model:'РГСН-6У',volume:6,steel:'09Г2С',wallThickness:5,bottomThickness:6,coating:'Эпоксидное',externalCoating:'ППУ 80мм + оцинковка 0.8мм',includes:'Люк ДУ-500, патрубки, опоры, лестница',qty:1,leadTime:'35 дней',delivery:'до объекта Челябинск',note:'Усиленное утепление для севера',priceSupp:465000,priceOur:0},

  // НЕРЖАВЕЙКА
  {num:15,cat:'Нержавейка',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСН-5Н',volume:5,steel:'12Х18Н10Т (AISI 321)',wallThickness:3,bottomThickness:4,coating:'Без покрытия (нержавейка)',externalCoating:'Без покрытия (нержавейка)',includes:'Люк ДУ-500, патрубки, опоры',qty:1,leadTime:'30 дней',delivery:'до терминала Екб',note:'Для пищевой промышленности, питьевой воды',priceSupp:485000,priceOur:0},
  {num:16,cat:'Нержавейка',supplier:'ЗРК-1 (Екатеринбург)',model:'РГСН-6Н',volume:6,steel:'08Х18Н10 (AISI 304)',wallThickness:3,bottomThickness:4,coating:'Без покрытия (нержавейка)',externalCoating:'Без покрытия (нержавейка)',includes:'Люк ДУ-500, патрубки, опоры',qty:1,leadTime:'30 дней',delivery:'до терминала Екб',note:'Для пищевой промышленности, питьевой воды',priceSupp:520000,priceOur:0},
  {num:17,cat:'Нержавейка',supplier:'НормаКомплект (Челябинск)',model:'РГСН-5Н',volume:5,steel:'12Х18Н10Т (AISI 321)',wallThickness:3,bottomThickness:4,coating:'Без покрытия (нержавейка)',externalCoating:'Без покрытия (нержавейка)',includes:'Люк ДУ-500, патрубки, опоры',qty:1,leadTime:'35 дней',delivery:'до терминала Челябинск',note:'Для пищевой промышленности',priceSupp:495000,priceOur:0}
];

/* Предзаполненные цены (поставщик / наша) */
var pricesSupp={};
var pricesOur={};
data.forEach(function(r){pricesSupp[r.num]=r.priceSupp;});

var state={search:'',cat:'all',sort:{key:'num',dir:1}};

function fmt(n){return Math.round(n).toLocaleString('ru-RU');}

/* ==================== РАСЧЁТ ==================== */
function calcMargins(r){
  var supp=pricesSupp[r.num]||0;
  var our=pricesOur[r.num]||0;
  var margin=(supp&gt;0&amp;&amp;our&gt;0)?our-supp:0;
  var marginPct=(supp&gt;0&amp;&amp;our&gt;0)?((our-supp)/supp*100):0;
  return {supp:supp, our:our, margin:margin, marginPct:marginPct};
}

/* ==================== ФИЛЬТРАЦИЯ ==================== */
function getFiltered(){
  var rows=data.slice();
  if(state.cat!=='all') rows=rows.filter(function(r){return r.cat===state.cat;});
  if(state.search){
    var q=state.search.trim().toLowerCase();
    rows=rows.filter(function(r){
      return String(r.num).indexOf(q)!==-1 ||
             (r.model||'').toLowerCase().indexOf(q)!==-1 ||
             (r.supplier||'').toLowerCase().indexOf(q)!==-1 ||
             (r.steel||'').toLowerCase().indexOf(q)!==-1 ||
             (r.coating||'').toLowerCase().indexOf(q)!==-1 ||
             (r.externalCoating||'').toLowerCase().indexOf(q)!==-1;
    });
  }
  if(state.sort.key){
    var k=state.sort.key,d=state.sort.dir;
    rows.sort(function(a,b){
      var va,vb;
      if(k==='margin'||k==='marginPct'){
        va=calcMargins(a)[k];vb=calcMargins(b)[k];
      } else {
        va=a[k];vb=b[k];
      }
      if(typeof va==='number'&amp;&amp;typeof vb==='number') return (va-vb)*d;
      return String(va).localeCompare(String(vb),'ru')*d;
    });
  }
  return rows;
}

/* ==================== СТАТИСТИКА ==================== */
function updateStats(){
  document.getElementById('statTotal').textContent=data.length;
  var filledSupp=0,filledOur=0,sumSupp=0,sumOur=0,marginSum=0;
  data.forEach(function(r){
    var m=calcMargins(r);
    if(m.supp&gt;0) filledSupp++;
    if(m.our&gt;0) filledOur++;
    sumSupp+=m.supp*r.qty;
    sumOur+=m.our*r.qty;
    marginSum+=(m.our-m.supp)*r.qty;
  });
  document.getElementById('statSupp').textContent=filledSupp;
  document.getElementById('statOur').textContent=filledOur;
  document.getElementById('statSumSupp').textContent=sumSupp&gt;0?fmt(sumSupp)+' ₽':'—';
  document.getElementById('statSumOur').textContent=sumOur&gt;0?fmt(sumOur)+' ₽':'—';
  document.getElementById('statMargin').textContent=marginSum!==0?fmt(marginSum)+' ₽':'—';
}

/* ==================== РЕНДЕР ==================== */
function render(){
  var rows=getFiltered();
  var tbody=document.getElementById('tbody');
  tbody.innerHTML='';
  if(!rows.length){
    tbody.innerHTML='&lt;tr&gt;&lt;td colspan="18" style="text-align:center;padding:40px;opacity:.6"&gt;Ничего не найдено&lt;/td&gt;&lt;/tr&gt;';
    document.getElementById('counter').textContent='Найдено: 0';
    updateStats();calcRepair();return;
  }
  rows.forEach(function(r){
    var m=calcMargins(r);
    var suppCls=pricesSupp[r.num]&gt;0?'filled-supp':'empty';
    var ourCls=pricesOur[r.num]&gt;0?'filled-our':'empty';
    var marginCls=m.margin&gt;0?'margin-pos':(m.margin&lt;0?'margin-neg':'');
    var tr=document.createElement('tr');
    tr.innerHTML=
      '&lt;td class="num"&gt;'+r.num+'&lt;/td&gt;'+
      '&lt;td&gt;&lt;span class="badge"&gt;'+r.cat+'&lt;/span&gt;&lt;/td&gt;'+
      '&lt;td&gt;&lt;span class="badge sup"&gt;'+r.supplier+'&lt;/span&gt;&lt;/td&gt;'+
      '&lt;td&gt;&lt;b&gt;'+r.model+'&lt;/b&gt;&lt;/td&gt;'+
      '&lt;td class="num"&gt;'+r.volume+'&lt;/td&gt;'+
      '&lt;td&gt;&lt;span class="badge steel"&gt;'+r.steel+'&lt;/span&gt;&lt;/td&gt;'+
      '&lt;td class="num"&gt;'+r.wallThickness+'&lt;/td&gt;'+
      '&lt;td class="num"&gt;'+r.bottomThickness+'&lt;/td&gt;'+
      '&lt;td&gt;&lt;span class="badge coat"&gt;'+r.coating+'&lt;/span&gt;&lt;/td&gt;'+
      '&lt;td style="font-size:11px"&gt;'+r.externalCoating+'&lt;/td&gt;'+
      '&lt;td style="font-size:11px"&gt;'+r.includes+'&lt;/td&gt;'+
      '&lt;td class="num"&gt;'+r.qty+'&lt;/td&gt;'+
      '&lt;td style="font-size:11px"&gt;'+r.leadTime+'&lt;/td&gt;'+
      '&lt;td&gt;&lt;input type="number" class="cell '+suppCls+'" data-num="'+r.num+'" data-field="supp" value="'+(pricesSupp[r.num]||'')+'" placeholder="—" min="0" step="1000"&gt;&lt;/td&gt;'+
      '&lt;td&gt;&lt;input type="number" class="cell '+ourCls+'" data-num="'+r.num+'" data-field="our" value="'+(pricesOur[r.num]||'')+'" placeholder="—" min="0" step="1000"&gt;&lt;/td&gt;'+
      '&lt;td class="num '+marginCls+'"&gt;'+(m.margin!==0?fmt(m.margin):'—')+'&lt;/td&gt;'+
      '&lt;td class="num '+marginCls+'"&gt;'+(m.marginPct!==0?Math.round(m.marginPct)+'%':'—')+'&lt;/td&gt;'+
      '&lt;td style="font-size:11px;color:#9a8040"&gt;'+r.note+'&lt;/td&gt;';
    tbody.appendChild(tr);
  });
  document.getElementById('counter').textContent='Найдено: '+rows.length;
  updateStats();
  calcRepair();
  bindInputs();
}

function bindInputs(){
  document.querySelectorAll('input.cell').forEach(function(inp){
    inp.addEventListener('input',function(){
      var n=parseInt(this.dataset.num,10);
      var f=this.dataset.field;
      var v=parseFloat(this.value);
      var obj=f==='supp'?pricesSupp:pricesOur;
      if(isNaN(v)||v&lt;=0){
        delete obj[n];
        this.classList.remove('filled-supp','filled-our');
        this.classList.add('empty');
      } else {
        obj[n]=v;
        this.classList.remove('empty');
        this.classList.add(f==='supp'?'filled-supp':'filled-our');
      }
      updateStats();calcRepair();updateRowMargin(n);
    });
  });
}

function updateRowMargin(n){
  var r=data.find(function(x){return x.num===n;});
  if(!r) return;
  var m=calcMargins(r);
  var rows=document.querySelectorAll('#tbody tr');
  rows.forEach(function(tr){
    var firstCell=tr.querySelector('td');
    if(!firstCell) return;
    if(parseInt(firstCell.textContent,10)===n){
      var cells=tr.querySelectorAll('td');
      var mc=cells[15],mp=cells[16];
      mc.textContent=m.margin!==0?fmt(m.margin):'—';
      mp.textContent=m.marginPct!==0?Math.round(m.marginPct)+'%':'—';
      mc.className='num '+(m.margin&gt;0?'margin-pos':(m.margin&lt;0?'margin-neg':''));
      mp.className='num '+(m.margin&gt;0?'margin-pos':(m.margin&lt;0?'margin-neg':''));
    }
  });
}

/* ==================== КАТЕГОРИИ ==================== */
function renderCatSelect(){
  var cats=[],seen={};
  data.forEach(function(r){
    if(!seen[r.cat]){seen[r.cat]=1;cats.push(r.cat);}
  });
  cats.sort();
  var sel=document.getElementById('fCat');
  sel.innerHTML='&lt;option value="all"&gt;Все категории&lt;/option&gt;'+cats.map(function(c){
    return '&lt;option value="'+c+'"'+(state.cat===c?' selected':'')+'&gt;'+c+'&lt;/option&gt;';
  }).join('');
}

/* ==================== КАЛЬКУЛЯТОР ПАРТИИ ==================== */
function calcRepair(){
  var checkedCats={};
  document.querySelectorAll('.repair-cb:checked').forEach(function(cb){
    checkedCats[cb.dataset.cat]=1;
  });
  var posCount=0,sumCost=0,sumSale=0,sumMargin=0;
  data.forEach(function(r){
    if(!checkedCats[r.cat]) return;
    posCount++;
    var m=calcMargins(r);
    sumCost+=m.supp*r.qty;
    sumSale+=m.our*r.qty;
    sumMargin+=(m.our-m.supp)*r.qty;
  });
  document.getElementById('repPositions').textContent=posCount;
  document.getElementById('repCost').textContent=sumCost&gt;0?fmt(sumCost)+' ₽':'0 ₽';
  document.getElementById('repSale').textContent=sumSale&gt;0?fmt(sumSale)+' ₽':'0 ₽';
  document.getElementById('repMargin').textContent=sumMargin!==0?fmt(sumMargin)+' ₽':'0 ₽';
}

/* ==================== МОДАЛЬНЫЕ ОКНА ==================== */
function openModal(title,body){
  document.getElementById('modalTitle').textContent=title;
  document.getElementById('modalBody').innerHTML='&lt;pre&gt;'+body+'&lt;/pre&gt;';
  document.getElementById('modal').classList.add('active');
}
function closeModal(){
  document.getElementById('modal').classList.remove('active');
}
function copyModal(){
  var txt=document.querySelector('#modalBody pre').textContent;
  if(navigator.clipboard&amp;&amp;navigator.clipboard.writeText){
    navigator.clipboard.writeText(txt).then(function(){alert('Скопировано!');});
  } else {
    alert('Не удалось скопировать');
  }
}

/* ==================== ЗАПРОС ПРОИЗВОДИТЕЛЮ ==================== */
function openRequestModal(){
  var rows=data.slice();
  var text='Добрый день!\n\n'+
    'ООО «Арсенал-Деталь» (г. Екатеринбург) занимается поставками емкостного оборудования.\n\n'+
    'Прошу предоставить актуальные цены, наличие (или срок изготовления) и технические характеристики на стальные резервуары объемом 5-6 м³.\n\n'+
    'Перечень позиций:\n\n'+
    '№  |  Модель  |  Объём  |  Марка стали  |  Стенка/Днище  |  Покрытие  |  Кол-во\n'+
    '─────────────────────────────────────────────────────────────────────────────\n';
  rows.forEach(function(r){
    text+=(r.num+'  |  '+r.model+'  |  '+r.volume+' м³  |  '+r.steel+'  |  '+r.wallThickness+'/'+r.bottomThickness+' мм  |  '+r.coating+'  |  '+r.qty+' шт\n');
  });
  text+='\nПрошу указать:\n'+
    '• Стоимость по каждой позиции (с НДС)\n'+
    '• Срок изготовления или отгрузки\n'+
    '• Условия оплаты (предоплата / отсрочка)\n'+
    '• Условия доставки в Екатеринбург\n'+
    '• Гарантию на изделия\n'+
    '• Наличие паспортов сосудов и сертификатов на сталь\n\n'+
    'С уважением,\n'+
    'ООО «Арсенал-Деталь»\n'+
    'Тел: 8 902 873-36-90\n'+
    'E-mail: arsenal-detal@list.ru';
  openModal('? ЗАПРОС ПРОИЗВОДИТЕЛЮ',text);
}

/* ==================== СЧЁТ КЛИЕНТУ ==================== */
function openInvoiceModal(){
  var rows=data.filter(function(r){return pricesOur[r.num]&gt;0;});
  if(!rows.length){alert('Сначала заполните «Нашу цену» хотя бы по одной позиции.');return;}
  var text='КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ\n'+
    'ООО «Арсенал-Деталь» · 8 902 873-36-90\n'+
    'Дата: '+new Date().toLocaleDateString('ru-RU')+'\n\n'+
    'Стальные резервуары 5-6 м³\n\n'+
    '№  |  Модель  |  Объём  |  Сталь  |  Стенка/Днище  |  Покрытие  |  Цена, ₽  |  Кол-во  |  Сумма, ₽\n'+
    '─────────────────────────────────────────────────────────────────────────────────────\n';
  var total=0;
  rows.forEach(function(r){
    var sum=pricesOur[r.num]*r.qty;
    total+=sum;
    text+=(r.num+'  |  '+r.model+'  |  '+r.volume+' м³  |  '+r.steel+'  |  '+r.wallThickness+'/'+r.bottomThickness+' мм  |  '+r.coating+'  |  '+fmt(pricesOur[r.num])+'  |  '+r.qty+'  |  '+fmt(sum)+'\n');
  });
  text+='\n═══════════════════════════════════════════════════════════════════════\n';
  text+='ИТОГО: '+fmt(total)+' ₽ (с НДС 22%)\n';
  text+='═══════════════════════════════════════════════════════════════════════\n\n';
  text+='Условия оплаты: 50% предоплата, 50% по факту готовности.\n'+
    'Срок изготовления: уточняется (10-35 дней в зависимости от модели).\n'+
    'Доставка: ТК до терминала или до объекта.\n'+
    'Гарантия: 12-24 месяца (в зависимости от типа резервуара).\n\n'+
    'Менеджер: Ольга · 8 902 873-36-90';
  openModal('? СЧЁТ КЛИЕНТУ',text);
}

/* ==================== СОХРАНЕНИЕ ==================== */
function saveLocal(){
  try{
    localStorage.setItem('reservoirs_supp',JSON.stringify(pricesSupp));
    localStorage.setItem('reservoirs_our',JSON.stringify(pricesOur));
    alert('Сохранено: '+Object.keys(pricesSupp).length+' закупка, '+Object.keys(pricesOur).length+' продажа.');
  }catch(e){alert('Ошибка: '+e.message);}
}

function loadLocal(){
  try{
    var s=localStorage.getItem('reservoirs_supp');
    var o=localStorage.getItem('reservoirs_our');
    if(!s&amp;&amp;!o){alert('Нет сохранённых данных.');return;}
    if(s) pricesSupp=JSON.parse(s);
    if(o) pricesOur=JSON.parse(o);
    render();
    alert('Загружено.');
  }catch(e){alert('Ошибка: '+e.message);}
}

function resetAll(){
  if(!confirm('Сбросить все цены?')) return;
  pricesSupp={};
  pricesOur={};
  data.forEach(function(r){pricesSupp[r.num]=r.priceSupp;});
  render();
}

/* ==================== ЭКСПОРТ ==================== */
function dlCSV(){
  var rows=getFiltered();
  var header=['№','Категория','Поставщик','Модель','Объём м³','Марка стали','Стенка мм','Днище мм','Внутр. покрытие','Внешн. покрытие','Комплектация','Кол-во','Срок','Цена поставщика,₽','Наша цена,₽','Маржа,₽','Маржа,%','Примечание'];
  var body=rows.map(function(r){
    var m=calcMargins(r);
    return [r.num,r.cat,r.supplier,r.model,r.volume,r.steel,r.wallThickness,r.bottomThickness,r.coating,r.externalCoating,r.includes,r.qty,r.leadTime,
            m.supp||'',m.our||'',m.margin||'',m.marginPct?Math.round(m.marginPct):'',r.note];
  });
  var esc=function(v){return '"'+String(v==null?'':v).replace(/"/g,'""')+'"';};
  var csv=[header].concat(body).map(function(r){return r.map(esc).join(';');}).join('\r\n');
  dlBlob(new Blob(['\uFEFF'+csv],{type:'text/csv;charset=utf-8;'}),'Reservoirs_prices_'+today()+'.csv');
}

function dlExcel(){
  var rows=getFiltered();
  var header=['№','Категория','Поставщик','Модель','Объём м³','Марка стали','Стенка мм','Днище мм','Внутр. покрытие','Внешн. покрытие','Комплектация','Кол-во','Срок','Цена поставщика,₽','Наша цена,₽','Маржа,₽','Маржа,%','Примечание'];
  var body=rows.map(function(r){
    var m=calcMargins(r);
    return [r.num,r.cat,r.supplier,r.model,r.volume,r.steel,r.wallThickness,r.bottomThickness,r.coating,r.externalCoating,r.includes,r.qty,r.leadTime,
            m.supp||'',m.our||'',m.margin||'',m.marginPct?Math.round(m.marginPct):'',r.note];
  });
  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(r){return '&lt;tr&gt;'+r.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:11px;}&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;h2&gt;Прайс — Резервуары 5-6 м³ · '+today()+'&lt;/h2&gt;'+table+'&lt;p&gt;&lt;i&gt;ООО «Арсенал Деталь» · 8 902 873-36-90&lt;/i&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;';
  dlBlob(new Blob(['\uFEFF'+html],{type:'application/vnd.ms-excel;charset=utf-8;'}),'Reservoirs_prices_'+today()+'.xls');
}

function dlBlob(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());
}

/* ==================== СОБЫТИЯ ==================== */
document.addEventListener('DOMContentLoaded',function(){
  document.getElementById('search').addEventListener('input',function(e){state.search=e.target.value;render();});
  document.getElementById('fCat').addEventListener('change',function(e){state.cat=e.target.value;render();});
  document.querySelectorAll('#tbl th.sortable').forEach(function(th){
    th.addEventListener('click',function(){
      var k=th.dataset.key;
      if(state.sort.key===k) state.sort.dir*=-1;
      else state.sort={key:k,dir:-1};
      render();
    });
  });
  document.getElementById('modal').addEventListener('click',function(e){
    if(e.target===this) closeModal();
  });
  renderCatSelect();
  render();
});
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-10-12T05:31:23Z</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>
