<?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/razbor-dlya-metallotorgovtcev-i-potrebiteley</id>
  <link href="https://www.pandoraburo.ru/razbor-dlya-metallotorgovtcev-i-potrebiteley.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;Разбор запроса — структура технического задания&lt;/title&gt;
&lt;style&gt;
  #rzApp, #rzApp *{box-sizing:border-box !important;
    font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif !important;
    -webkit-font-smoothing:antialiased}
  #rzApp{
    --bg:#0f1216; --panel:#171b20; --panel-2:#1e242b;
    --text:#e7ecf2; --muted:#8b949e; --border:#2a323c;
    --green:#3fb950; --yellow:#d29922; --red:#da3633;
    --accent:#4493f8; --accent-2:#79b8ff;
    background:var(--bg) !important; color:var(--text) !important;
    font-size:15px !important; line-height:1.55 !important;
    padding:28px 18px 80px !important; border-radius:12px;
    text-align:left !important;
  }
  #rzApp .wrap{max-width:980px;margin:0 auto}
  #rzApp h1,#rzApp h2,#rzApp h3{margin:0;color:var(--text) !important;
    letter-spacing:-0.01em;font-weight:600}
  #rzApp p{margin:0}
  #rzApp .screen{display:none}
  #rzApp .screen.active{display:block}

  #rzApp .hero{padding:24px 0 22px;border-bottom:1px solid var(--border);margin-bottom:24px}
  #rzApp .hero h1{font-size:28px;margin-bottom:10px}
  #rzApp .hero p{color:var(--muted);max-width:720px;margin-bottom:10px}
  #rzApp .hero .quiet{font-size:13px;color:var(--muted);opacity:.85}

  #rzApp button.primary{
    background:var(--accent) !important; color:#fff !important;
    border:none !important; padding:14px 28px !important;
    border-radius:8px !important; font:inherit !important;
    font-weight:700 !important; font-size:15px !important;
    cursor:pointer; transition:opacity .15s;
  }
  #rzApp button.primary:hover{opacity:.9}
  #rzApp button.primary:disabled{background:#2a323c !important;
    color:#6e7681 !important; cursor:not-allowed}
  #rzApp button.ghost{
    background:transparent !important; color:var(--muted) !important;
    border:1px solid var(--border) !important; padding:13px 20px !important;
    border-radius:8px !important; font:inherit !important;
    font-weight:600 !important; font-size:14px !important; cursor:pointer;
  }
  #rzApp button.ghost:hover{color:var(--text) !important;border-color:var(--muted) !important}

  #rzApp .progress-shell{margin:0 0 24px}
  #rzApp .progress-info{display:flex;justify-content:space-between;
    font-size:13px;color:var(--muted);margin-bottom:10px;gap:12px;flex-wrap:wrap}
  #rzApp .progress-info strong{color:var(--text)}
  #rzApp .progress-track{height:5px;background:var(--panel-2);
    border-radius:3px;overflow:hidden}
  #rzApp .progress-fill{height:100%;width:0;
    background:linear-gradient(90deg,var(--accent),var(--accent-2));
    transition:width .3s;border-radius:3px}
  #rzApp .draft-note{font-size:12px;color:var(--muted);margin-top:8px;
    font-style:italic;opacity:.85;transition:opacity .4s}
  #rzApp .draft-note.hidden{opacity:0}

  #rzApp .indices{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:24px}
  #rzApp .idx{background:var(--panel);border:1px solid var(--border);
    border-radius:10px;padding:16px 18px}
  #rzApp .idx .lbl{font-size:11px;color:var(--muted);
    text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px}
  #rzApp .idx .val{font-size:26px;font-weight:600;color:var(--text)}
  #rzApp .idx .hint{font-size:12px;color:var(--muted);margin-top:4px}

  #rzApp .block{background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:22px 22px 6px;margin-bottom:16px}
  #rzApp .block-head{display:flex;justify-content:space-between;
    align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:6px}
  #rzApp .block-head h2{font-size:16px}
  #rzApp .block-head .weight{font-size:12px;color:var(--muted);
    background:var(--panel-2);border:1px solid var(--border);
    padding:3px 10px;border-radius:20px}
  #rzApp .block-desc{font-size:13px;color:var(--muted);margin-bottom:16px}
  #rzApp .q{padding:14px 0;border-top:1px solid var(--border)}
  #rzApp .q:first-of-type{border-top:none}
  #rzApp .q-label{font-size:14px;margin-bottom:10px;display:block;
    color:var(--text);line-height:1.5}
  #rzApp .q-label .num{color:var(--muted);margin-right:6px;
    font-variant-numeric:tabular-nums;font-weight:600}
  #rzApp .q-hint{font-size:12px;color:var(--muted);margin-top:-4px;
    margin-bottom:10px;font-style:italic}
  #rzApp .q-fields{display:grid;grid-template-columns:1fr 220px;gap:10px}
  @media (max-width:640px){#rzApp .q-fields{grid-template-columns:1fr};
    #rzApp .indices{grid-template-columns:1fr}}
  #rzApp .q textarea,#rzApp .q select,#rzApp .field input{
    width:100%;background:var(--panel-2) !important;border:1px solid var(--border);
    color:var(--text) !important;padding:11px 13px;border-radius:8px;
    font:inherit !important;outline:none;font-size:14px;
  }
  #rzApp .q textarea:focus,#rzApp .q select:focus,#rzApp .field input:focus{
    border-color:var(--accent)}
  #rzApp .q textarea{resize:vertical;min-height:44px}
  #rzApp .q select{appearance:none;padding-right:34px;cursor:pointer;
    background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),
      linear-gradient(135deg,var(--muted) 50%,transparent 50%);
    background-position:calc(100% - 19px) 50%,calc(100% - 14px) 50%;
    background-size:5px 5px,5px 5px;background-repeat:no-repeat}
  #rzApp .q select.s-doc{border-color:var(--green)}
  #rzApp .q select.s-open{border-color:var(--yellow)}
  #rzApp .q select.s-verbal{border-color:var(--yellow)}
  #rzApp .q select.s-guess{border-color:var(--red)}

  #rzApp .consent{background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:22px;margin-bottom:16px}
  #rzApp .consent h2{font-size:16px;margin-bottom:12px}
  #rzApp .consent .disclaimer{font-size:13px;color:var(--muted);
    background:var(--panel-2);border-left:3px solid var(--accent);
    padding:12px 16px;border-radius:6px;margin-bottom:14px;line-height:1.65}
  #rzApp .consent label{display:flex;gap:10px;align-items:flex-start;
    font-size:13px;cursor:pointer;color:var(--text);line-height:1.6}
  #rzApp .consent input[type=checkbox]{margin-top:3px;accent-color:var(--accent);
    width:16px;height:16px;flex-shrink:0;cursor:pointer}

  #rzApp .info-box{background:var(--panel);border:1px solid var(--border);
    border-radius:12px;padding:22px;margin-bottom:16px}
  #rzApp .info-box h2{font-size:16px;margin-bottom:14px}
  #rzApp .field{margin-bottom:12px}
  #rzApp .field label{display:block;font-size:13px;color:var(--muted);margin-bottom:6px}

  #rzApp .actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:18px}

  #rzApp .report{background:var(--panel);border:1px solid var(--accent);
    border-radius:12px;padding:26px;margin-top:20px}
  #rzApp .report h2{font-size:19px;margin-bottom:16px}
  #rzApp .report h3{font-size:12px;margin:22px 0 10px;color:var(--muted);
    text-transform:uppercase;letter-spacing:.08em;font-weight:600}
  #rzApp .report .row{display:flex;justify-content:space-between;padding:9px 0;
    border-bottom:1px solid var(--border);font-size:14px;gap:12px}
  #rzApp .report .row:last-child{border-bottom:none}
  #rzApp .report .row span:first-child{color:var(--muted)}
  #rzApp .report .row strong{color:var(--text)}
  #rzApp .lights{display:flex;flex-direction:column;gap:6px;font-size:13px}
  #rzApp .light{display:flex;justify-content:space-between;gap:12px;
    padding:10px 12px;border:1px solid var(--border);border-radius:8px;
    background:var(--panel-2)}
  #rzApp .light .dot{width:10px;height:10px;border-radius:50%;
    display:inline-block;margin-right:8px}
  #rzApp .dot.g{background:var(--green)}
  #rzApp .dot.y{background:var(--yellow)}
  #rzApp .dot.r{background:var(--red)}
  #rzApp .list{margin:0;padding-left:20px;font-size:13px;color:var(--text);line-height:1.7}
  #rzApp .list li{margin-bottom:8px}
  #rzApp .note{font-size:13px;color:var(--text);background:var(--panel-2);
    padding:12px 16px;border-radius:8px;margin-bottom:10px;line-height:1.65;
    border-left:3px solid var(--accent-2)}
  #rzApp .discl{font-size:12px;color:var(--muted);background:var(--panel-2);
    border-left:3px solid var(--accent);padding:12px 16px;border-radius:6px;
    margin-top:20px;line-height:1.65}

  #rzApp .hp-field{position:absolute;left:-9999px;top:auto}
  #rzApp footer{color:var(--muted);font-size:12px;text-align:center;
    margin-top:40px;padding-top:20px;border-top:1px solid var(--border)}

  @media (max-width:640px){
    #rzApp{padding:18px 12px 60px !important}
    #rzApp .hero h1{font-size:24px}
    #rzApp .q textarea{min-height:80px;font-size:16px !important}
    #rzApp .q select{font-size:16px !important;padding:13px 13px}
    #rzApp .field input{font-size:16px !important}
    #rzApp button.primary{width:100%;padding:15px 22px !important}
    #rzApp .actions{flex-direction:column;align-items:stretch}
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div id="rzApp"&gt;
  &lt;div class="wrap"&gt;

    &lt;section class="screen active" id="rzIntro"&gt;
      &lt;div class="hero"&gt;
        &lt;h1&gt;Разбор запроса&lt;/h1&gt;
        &lt;p&gt;Это не консультация и не подбор материала. Это структурирование вашего запроса:
        мы задаём вопросы, вы отвечаете фактами, на выходе вы получаете техническое
        задание и карту противоречий — то, чего вы не спросили у себя сами.&lt;/p&gt;
        &lt;p class="quiet"&gt;30 вопросов. Займёт 15–20 минут. Для каждого факта укажите
        источник — документ, открытые данные, слова, предположение.&lt;/p&gt;
      &lt;/div&gt;
      &lt;button type="button" class="primary" id="rzStart"&gt;Начать разбор&lt;/button&gt;
    &lt;/section&gt;

    &lt;section class="screen" id="rzForm"&gt;
      &lt;div class="progress-shell"&gt;
        &lt;div class="progress-info"&gt;
          &lt;span&gt;Отвечено: &lt;strong id="rzFilled"&gt;0&lt;/strong&gt; из &lt;strong id="rzTotal"&gt;30&lt;/strong&gt;&lt;/span&gt;
          &lt;span id="rzTime"&gt;Осталось примерно 15 минут&lt;/span&gt;
        &lt;/div&gt;
        &lt;div class="progress-track"&gt;&lt;div class="progress-fill" id="rzProgress"&gt;&lt;/div&gt;&lt;/div&gt;
        &lt;div class="draft-note" id="rzDraftNote"&gt;Ваши ответы сохраняются автоматически&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="indices"&gt;
        &lt;div class="idx"&gt;
          &lt;div class="lbl"&gt;Индекс полноты&lt;/div&gt;
          &lt;div class="val" id="rzCompleteness"&gt;0%&lt;/div&gt;
          &lt;div class="hint" id="rzCompletenessHint"&gt;Сколько критичных полей заполнено&lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="idx"&gt;
          &lt;div class="lbl"&gt;Индекс достоверности&lt;/div&gt;
          &lt;div class="val" id="rzReliability"&gt;0%&lt;/div&gt;
          &lt;div class="hint" id="rzReliabilityHint"&gt;Чем подтверждены факты&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;form id="rzFormEl" autocomplete="off" novalidate="novalidate"&gt;
        &lt;div class="hp-field"&gt;
          &lt;label&gt;Не заполняйте &lt;input type="text" id="rzHp" tabindex="-1" /&gt;&lt;/label&gt;
        &lt;/div&gt;

        &lt;div id="rzBlocks"&gt;&lt;/div&gt;

        &lt;section class="consent"&gt;
          &lt;h2&gt;Дисклеймер&lt;/h2&gt;
          &lt;div class="disclaimer"&gt;
            Услуга является аналитической обработкой и структурированием информации,
            предоставленной Заказчиком. Не является инженерной, юридической или
            коммерческой консультацией. Исполнитель не даёт рекомендаций по выбору
            материала, марки или поставщика. Ответственность за решения лежит на Заказчике.
          &lt;/div&gt;
          &lt;label&gt;
            &lt;input type="checkbox" id="rzConsent" /&gt;
            &lt;span&gt;Я ознакомлен с дисклеймером. Я понимаю, что получаю структурированное
            описание своего запроса, а не совет по выбору продукции.&lt;/span&gt;
          &lt;/label&gt;
        &lt;/section&gt;

        &lt;section class="info-box"&gt;
          &lt;h2&gt;Данные для связи&lt;/h2&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Название проекта / запроса *&lt;/label&gt;
            &lt;input type="text" id="rzProject" placeholder="Например: Броня для защитной панели" /&gt;
          &lt;/div&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Ваше имя *&lt;/label&gt;
            &lt;input type="text" id="rzName" placeholder="Иван Иванов" /&gt;
          &lt;/div&gt;
          &lt;div class="field"&gt;
            &lt;label&gt;Email для ответа *&lt;/label&gt;
            &lt;input type="email" id="rzEmail" placeholder="you@company.ru" /&gt;
          &lt;/div&gt;
        &lt;/section&gt;

        &lt;div class="actions"&gt;
          &lt;button type="submit" class="primary" id="rzSubmit" disabled="disabled"&gt;Сформировать разбор&lt;/button&gt;
          &lt;button type="button" class="ghost" id="rzReset"&gt;Очистить&lt;/button&gt;
        &lt;/div&gt;
      &lt;/form&gt;

      &lt;div class="report" id="rzReport" style="display:none"&gt;&lt;/div&gt;
    &lt;/section&gt;

    &lt;footer&gt;
      Разбор запроса · © &lt;span id="rzYear"&gt;&lt;/span&gt;
    &lt;/footer&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
(function(){
  "use strict";

  var STORAGE_KEY = "razbor_zaprosa_draft_v1";
  var RECIPIENT_EMAIL = "setipandorra@internet.ru";
  var START_TIME = Date.now();

  var SOURCES = {
    doc:    { label:"Документ",         score:1.0, cls:"s-doc" },
    open:   { label:"Открытые данные",  score:0.6, cls:"s-open" },
    verbal: { label:"Устное заявление", score:0.5, cls:"s-verbal" },
    guess:  { label:"Предположение",    score:0.2, cls:"s-guess" },
    none:   { label:"Нет данных",       score:0.0, cls:"" }
  };

  // ============================================================
  // КАТАЛОГ ВОПРОСОВ
  // ============================================================
  var SCENARIO = {
    id:"RZ", title:"Разбор запроса",
    blocks: [
      {
        title:"Слой 1. Задача и контекст",
        weight:25,
        desc:"Что защищаем, от чего, где стоит, какие нагрузки.",
        questions:[
          { text:"Где будет использоваться изделие? Опишите условия эксплуатации.",
            hint:"Помещение, улица, вода, грунт, техника, стационарная установка." },
          { text:"От чего защищает? Перечислите все типы воздействия.",
            hint:"Пуля, осколок, взрыв, дрон, износ, коррозия, температура, химия, радиация." },
          { text:"Какая нагрузка: статическая, ударная, циклическая, температурная?",
            hint:"Опишите характер нагрузки и её частоту." },
          { text:"Как долго должно служить? Есть ли требования по ресурсу?",
            hint:"Месяцы, годы, определённое количество циклов." },
          { text:"Конечная деталь — каких габаритов? Это лист или готовая деталь?",
            hint:"Укажите размеры, массу, форму, будут ли дальнейшие операции." }
        ]
      },
      {
        title:"Слой 2. Свойства материала",
        weight:25,
        desc:"Какие характеристики критичны, какие взаимозаменяемы.",
        questions:[
          { text:"Твёрдость — критична? Есть ли требования по HB/HRC?",
            hint:"Если не знаете точно — укажите, что видели в документации." },
          { text:"Предел прочности — важен или второстепенен?",
            hint:"МПа или кгс/мм², если известно." },
          { text:"Класс защиты — какой требуется? По какому стандарту?",
            hint:"ГОСТ Р 51112-97, STANAG, иной. Если не знаете — так и напишите." },
          { text:"Износ — есть ли абразивный или иной тип износа?",
            hint:"Песок, абразив, трение, удар струи." },
          { text:"Химический состав — задан точно или допускаются аналоги?",
            hint:"Конкретные элементы, ограничения по содержанию." },
          { text:"Марка стали — обязательна конкретная или можно предложить замену?",
            hint:"Если указана — какая; если нет — какие соображения." }
        ]
      },
      {
        title:"Слой 3. Технология обработки и соединения",
        weight:25,
        desc:"Гнуть, варить, резать, штамповать — или садить на болты и крепёж.",
        questions:[
          { text:"Гнуть — деталь будет гнуться? Радиусы, углы, пластичность?",
            hint:"Гибка на вальцах, прессе, вручную." },
          { text:"Штамповка — есть ли операция штамповки? Холодная или горячая?",
            hint:"Штамповка требует пластичных марок." },
          { text:"Резка — как режется материал: плазма, лазер, гидроабразив, механически?",
            hint:"Способ резки влияет на выбор марки и толщины." },
          { text:"Сварка — деталь варится? Насколько критична свариваемость?",
            hint:"Если можно без сварки — откроются более твёрдые марки." },
          { text:"Соединение на болты / винты / заклёпки — рассматривали?",
            hint:"Болты, заклёпки, винты, класс прочности крепежа." },
          { text:"Другие способы соединения: фланцы, штифты, замки, пайка, клей?",
            hint:"Комбинированные и нестандартные решения." },
          { text:"Термообработка — нужна закалка, отпуск, нормализация?",
            hint:"Или материал поставляется в исходном состоянии." },
          { text:"Покрытие — требуется ли защита от коррозии? Какая?",
            hint:"Грунт, краска, цинк, хром, никель, порошок." }
        ]
      },
      {
        title:"Слой 4. Документы и испытания",
        weight:15,
        desc:"Что обязательно по бумагам: ГОСТ, ТУ, сертификат, протокол.",
        questions:[
          { text:"ГОСТ обязателен или допускается ТУ?",
            hint:"Если ГОСТ не нужен — это может ускорить и удешевить поставку." },
          { text:"Сертификат — требуется ли? Какой именно?",
            hint:"Соответствия, пожарный, военный, отраслевой." },
          { text:"Протокол испытаний — обязателен или достаточно паспорта?",
            hint:"Кто проводит испытания, по какой методике." },
          { text:"Паспорт изделия — нужен ли, и по какой форме?",
            hint:"Стандартная или своя форма." }
        ]
      },
      {
        title:"Слой 5. Ограничения и решения",
        weight:10,
        desc:"Толщина, бюджет, сроки, объём, кто решает.",
        questions:[
          { text:"Толщина — задана точно или можно варьировать? Допуски?",
            hint:"Минимум, максимум, допуски по ГОСТ или ТУ." },
          { text:"Ржавчина — критична или допустима? Нужно ли покрытие?",
            hint:"Обычная атмосфера, морская среда, химия." },
          { text:"Бюджет — выделен конкретный или обсуждается?",
            hint:"Если можно — диапазон или ограничение сверху." },
          { text:"Сроки — жёсткие или гибкие? Объём — разовый или регулярный?",
            hint:"Разовая партия или постоянные поставки." },
          { text:"Кто принимает решение — инженер, снабженец, собственник?",
            hint:"Кто подписывает, кто влияет." },
          { text:"Альтернативы — рассматривались ли другие материалы или решения?",
            hint:"Может быть, есть более дешёвый или быстрый путь." }
        ]
      }
    ]
  };

  // ============================================================
  // ДВИЖОК
  // ============================================================
  var app = document.getElementById("rzApp");
  var introScreen = app.querySelector("#rzIntro");
  var formScreen  = app.querySelector("#rzForm");
  var startBtn = app.querySelector("#rzStart");
  var form = app.querySelector("#rzFormEl");
  var blocksContainer = app.querySelector("#rzBlocks");
  var filledEl = app.querySelector("#rzFilled");
  var totalEl = app.querySelector("#rzTotal");
  var progressFill = app.querySelector("#rzProgress");
  var timeEl = app.querySelector("#rzTime");
  var draftNote = app.querySelector("#rzDraftNote");
  var completenessEl = app.querySelector("#rzCompleteness");
  var completenessHint = app.querySelector("#rzCompletenessHint");
  var reliabilityEl = app.querySelector("#rzReliability");
  var reliabilityHint = app.querySelector("#rzReliabilityHint");
  var submitBtn = app.querySelector("#rzSubmit");
  var resetBtn = app.querySelector("#rzReset");
  var consent = app.querySelector("#rzConsent");
  var project = app.querySelector("#rzProject");
  var clientName = app.querySelector("#rzName");
  var clientEmail = app.querySelector("#rzEmail");
  var hpField = app.querySelector("#rzHp");
  var reportBox = app.querySelector("#rzReport");
  var yearEl = app.querySelector("#rzYear");

  yearEl.textContent = new Date().getFullYear();

  var allAreas = [];
  var allSources = [];
  var draftTimer = null;

  function showScreen(el){
    [introScreen, formScreen].forEach(function(s){
      s.classList.toggle("active", s === el);
    });
    window.scrollTo({ top:0, behavior:"smooth" });
  }

  function buildForm(){
    blocksContainer.innerHTML = "";
    var total = 0;

    SCENARIO.blocks.forEach(function(block, bi){
      var sec = document.createElement("section");
      sec.className = "block";
      sec.setAttribute("data-weight", block.weight);

      var html = '&lt;div class="block-head"&gt;&lt;h2&gt;' + block.title + '&lt;/h2&gt;'
               + '&lt;span class="weight"&gt;Вес: ' + block.weight + '%&lt;/span&gt;&lt;/div&gt;'
               + '&lt;p class="block-desc"&gt;' + block.desc + '&lt;/p&gt;';

      block.questions.forEach(function(q, qi){
        var qnum = (bi+1) + "." + (qi+1);
        total++;
        html += '&lt;div class="q"&gt;'
             +  '&lt;label class="q-label"&gt;&lt;span class="num"&gt;' + qnum + '&lt;/span&gt;' + q.text + '&lt;/label&gt;'
             +  (q.hint ? '&lt;div class="q-hint"&gt;' + q.hint + '&lt;/div&gt;' : '')
             +  '&lt;div class="q-fields"&gt;'
             +  '&lt;textarea data-q="' + qnum + '" placeholder="Опишите факты..."&gt;&lt;/textarea&gt;'
             +  '&lt;select class="source" data-q="' + qnum + '"&gt;'
             +  '&lt;option value=""&gt;— источник —&lt;/option&gt;';
        Object.keys(SOURCES).forEach(function(k){
          html += '&lt;option value="' + k + '"&gt;' + SOURCES[k].label + '&lt;/option&gt;';
        });
        html += '&lt;/select&gt;&lt;/div&gt;&lt;/div&gt;';
      });

      sec.innerHTML = html;
      blocksContainer.appendChild(sec);
    });

    allAreas = Array.prototype.slice.call(blocksContainer.querySelectorAll("textarea[data-q]"));
    allSources = Array.prototype.slice.call(blocksContainer.querySelectorAll("select.source"));
    totalEl.textContent = total;

    allAreas.forEach(function(a){
      a.addEventListener("input", function(){ updateUI(); saveDraft(); });
    });
    allSources.forEach(function(s){
      s.addEventListener("change", function(){
        applySourceColor(s);
        updateUI();
        saveDraft();
      });
    });
  }

  function applySourceColor(select){
    Object.keys(SOURCES).forEach(function(k){ select.classList.remove(SOURCES[k].cls); });
    if (SOURCES[select.value] &amp;&amp; SOURCES[select.value].cls) {
      select.classList.add(SOURCES[select.value].cls);
    }
  }

  function saveDraft(){
    try {
      var data = { answers:{}, sources:{} };
      allAreas.forEach(function(a){ data.answers[a.getAttribute("data-q")] = a.value; });
      allSources.forEach(function(s){ data.sources[s.getAttribute("data-q")] = s.value; });
      localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
      showDraftNote();
    } catch(e){}
  }

  function loadDraft(){
    try {
      var raw = localStorage.getItem(STORAGE_KEY);
      if (!raw) return;
      var data = JSON.parse(raw);
      var loaded = 0;
      if (data.answers) {
        allAreas.forEach(function(a){
          var k = a.getAttribute("data-q");
          if (data.answers[k]) { a.value = data.answers[k]; loaded++; }
        });
      }
      if (data.sources) {
        allSources.forEach(function(s){
          var k = s.getAttribute("data-q");
          if (data.sources[k]) { s.value = data.sources[k]; applySourceColor(s); }
        });
      }
      if (loaded &gt; 0) showDraftNote("Черновик восстановлен — можно продолжить");
    } catch(e){}
  }

  function showDraftNote(text){
    if (!draftNote) return;
    if (text) draftNote.textContent = text;
    draftNote.classList.remove("hidden");
    if (draftTimer) clearTimeout(draftTimer);
    draftTimer = setTimeout(function(){ draftNote.classList.add("hidden"); }, 2500);
  }

  function computeIndices(){
    var totalWeight = 0, wFilled = 0, wRel = 0, filled = 0;
    var blocks = Array.prototype.slice.call(blocksContainer.querySelectorAll("section.block"));
    blocks.forEach(function(block){
      var weight = parseFloat(block.getAttribute("data-weight")) || 0;
      totalWeight += weight;
      var areas = Array.prototype.slice.call(block.querySelectorAll("textarea[data-q]"));
      var srcs = Array.prototype.slice.call(block.querySelectorAll("select.source"));
      var n = areas.length || 1;
      var inBlockFilled = 0, inBlockRel = 0;
      areas.forEach(function(a, i){
        var v = (a.value||"").trim();
        var s = srcs[i] ? srcs[i].value : "";
        if (v.length &gt; 0) { filled++; inBlockFilled++; }
        if (v.length &gt; 0 &amp;&amp; s &amp;&amp; SOURCES[s]) inBlockRel += SOURCES[s].score;
      });
      wFilled += (inBlockFilled / n) * weight;
      wRel    += (inBlockRel    / n) * weight;
    });
    return {
      completeness: Math.round(totalWeight &gt; 0 ? (wFilled / totalWeight) * 100 : 0),
      reliability:  Math.round(totalWeight &gt; 0 ? (wRel    / totalWeight) * 100 : 0),
      filled: filled,
      total: allAreas.length
    };
  }

  function updateUI(){
    var idx = computeIndices();
    filledEl.textContent = idx.filled;
    progressFill.style.width = ((idx.filled / (idx.total || 1)) * 100) + "%";
    completenessEl.textContent = idx.completeness + "%";
    reliabilityEl.textContent = idx.reliability + "%";

    if (idx.completeness &gt;= 80) completenessHint.textContent = "Высокая полнота данных";
    else if (idx.completeness &gt;= 60) completenessHint.textContent = "Средняя полнота — возможен разбор";
    else completenessHint.textContent = "Низкая полнота — много пробелов";

    if (idx.reliability &gt;= 70) reliabilityHint.textContent = "Преимущественно документы";
    else if (idx.reliability &gt;= 40) reliabilityHint.textContent = "Смешанные источники";
    else reliabilityHint.textContent = "Много предположений";

    var remaining = Math.max(0, idx.total - idx.filled);
    var minutesLeft = Math.ceil(remaining * 0.5);
    if (minutesLeft &lt;= 0) timeEl.textContent = "Почти готово";
    else if (minutesLeft === 1) timeEl.textContent = "Осталась примерно 1 минута";
    else if (minutesLeft &lt; 5) timeEl.textContent = "Осталось примерно " + minutesLeft + " минуты";
    else timeEl.textContent = "Осталось примерно " + minutesLeft + " минут";

    var contactOk = project.value.trim().length &gt; 0
                 &amp;&amp; clientName.value.trim().length &gt; 0
                 &amp;&amp; /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(clientEmail.value.trim());

    submitBtn.disabled = !(consent.checked &amp;&amp; contactOk &amp;&amp; idx.filled &gt;= 10);
  }

  function computeLights(){
    var result = [];
    var blocks = Array.prototype.slice.call(blocksContainer.querySelectorAll("section.block"));
    blocks.forEach(function(block){
      var title = block.querySelector(".block-head h2").textContent.trim();
      var weight = block.getAttribute("data-weight");
      var areas = Array.prototype.slice.call(block.querySelectorAll("textarea[data-q]"));
      var srcs = Array.prototype.slice.call(block.querySelectorAll("select.source"));
      var n = areas.length || 1;
      var filled = 0, rel = 0;
      areas.forEach(function(a, i){
        var v = (a.value||"").trim();
        var s = srcs[i] ? srcs[i].value : "";
        if (v) filled++;
        if (v &amp;&amp; s &amp;&amp; SOURCES[s]) rel += SOURCES[s].score;
      });
      var fr = filled / n;
      var rr = rel / n;
      var color = "r";
      if (fr &gt;= 0.8 &amp;&amp; rr &gt;= 0.6) color = "g";
      else if (fr &gt;= 0.5 &amp;&amp; rr &gt;= 0.3) color = "y";
      result.push({ title:title, weight:weight, color:color, filled:filled, total:areas.length });
    });
    return result;
  }

  function buildBlindSpots(){
    var out = [];
    var blocks = Array.prototype.slice.call(blocksContainer.querySelectorAll("section.block"));
    blocks.forEach(function(block){
      var title = block.querySelector(".block-head h2").textContent.trim();
      var areas = Array.prototype.slice.call(block.querySelectorAll("textarea[data-q]"));
      var srcs = Array.prototype.slice.call(block.querySelectorAll("select.source"));
      var missing = [];
      areas.forEach(function(a, i){
        var v = (a.value||"").trim();
        var s = srcs[i] ? srcs[i].value : "";
        if (!v || !s || s === "none") {
          var qnum = a.getAttribute("data-q");
          missing.push(qnum);
        }
      });
      if (missing.length) {
        out.push(title + ": нет данных по пунктам " + missing.join(", "));
      }
    });
    return out;
  }

  function buildContradictions(){
    var out = [];
    var blocks = Array.prototype.slice.call(blocksContainer.querySelectorAll("section.block"));
    blocks.forEach(function(block){
      var title = block.querySelector(".block-head h2").textContent.trim();
      var areas = Array.prototype.slice.call(block.querySelectorAll("textarea[data-q]"));
      var srcs = Array.prototype.slice.call(block.querySelectorAll("select.source"));
      areas.forEach(function(a, i){
        var v = (a.value||"").trim().toLowerCase();
        var s = srcs[i] ? srcs[i].value : "";
        if (v &amp;&amp; s === "verbal") {
          if (v.indexOf("точно") !== -1 || v.indexOf("обязательно") !== -1 || v.indexOf("нужно") !== -1) {
            var qnum = a.getAttribute("data-q");
            out.push(title + " (п. " + qnum + "): требование заявлено как жёсткое, но источник — устное заявление, без документального подтверждения.");
          }
        }
      });
    });
    return out;
  }

  function buildQuestionsToAsk(){
    var out = [];
    var blocks = Array.prototype.slice.call(blocksContainer.querySelectorAll("section.block"));
    blocks.forEach(function(block){
      var title = block.querySelector(".block-head h2").textContent.trim();
      var areas = Array.prototype.slice.call(block.querySelectorAll("textarea[data-q]"));
      var srcs = Array.prototype.slice.call(block.querySelectorAll("select.source"));
      areas.forEach(function(a, i){
        var v = (a.value||"").trim();
        var s = srcs[i] ? srcs[i].value : "";
        if (!v || !s || s === "none" || s === "guess") {
          var qnum = a.getAttribute("data-q");
          out.push("Уточнить пункт " + qnum + " (" + title + "): " + a.getAttribute("data-question-text"));
        }
      });
    });
    return out.slice(0, 10); // не более 10 главных
  }

  // сохраняем текст вопроса для отчёта
  function tagQuestions(){
    var blocks = Array.prototype.slice.call(blocksContainer.querySelectorAll("section.block"));
    blocks.forEach(function(block){
      var areas = Array.prototype.slice.call(block.querySelectorAll("textarea[data-q]"));
      areas.forEach(function(a){
        var label = a.closest(".q").querySelector(".q-label");
        var txt = label ? label.textContent.replace(/^\s*\S+\s*/, "").trim() : "";
        a.setAttribute("data-question-text", txt);
      });
    });
  }

  function renderReport(){
    var idx = computeIndices();
    var lights = computeLights();
    var blind = buildBlindSpots();
    var contra = buildContradictions();
    var ask = buildQuestionsToAsk();

    var html = '&lt;h2&gt;Разбор запроса&lt;/h2&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Проект&lt;/span&gt;&lt;strong&gt;' + project.value.trim() + '&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Индекс полноты&lt;/span&gt;&lt;strong&gt;' + idx.completeness + '%&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Индекс достоверности&lt;/span&gt;&lt;strong&gt;' + idx.reliability + '%&lt;/strong&gt;&lt;/div&gt;';
    html += '&lt;div class="row"&gt;&lt;span&gt;Заполнено&lt;/span&gt;&lt;strong&gt;' + idx.filled + ' из ' + idx.total + '&lt;/strong&gt;&lt;/div&gt;';

    html += '&lt;h3&gt;Светофор по слоям&lt;/h3&gt;&lt;div class="lights"&gt;';
    lights.forEach(function(l){
      html += '&lt;div class="light"&gt;&lt;span&gt;&lt;span class="dot ' + l.color + '"&gt;&lt;/span&gt;'
           +  l.title + '&lt;/span&gt;&lt;span&gt;' + l.filled + ' из ' + l.total + '&lt;/span&gt;&lt;/div&gt;';
    });
    html += '&lt;/div&gt;';

    if (blind.length) {
      html += '&lt;h3&gt;Карта слепых зон&lt;/h3&gt;&lt;ul class="list"&gt;';
      blind.forEach(function(b){ html += '&lt;li&gt;' + b + '&lt;/li&gt;'; });
      html += '&lt;/ul&gt;';
    }

    if (contra.length) {
      html += '&lt;h3&gt;Выявленные противоречия&lt;/h3&gt;&lt;ul class="list"&gt;';
      contra.forEach(function(c){ html += '&lt;li&gt;' + c + '&lt;/li&gt;'; });
      html += '&lt;/ul&gt;';
    }

    if (ask.length) {
      html += '&lt;h3&gt;Вопросы, которые стоит задать&lt;/h3&gt;&lt;ul class="list"&gt;';
      ask.forEach(function(q){ html += '&lt;li&gt;' + q + '&lt;/li&gt;'; });
      html += '&lt;/ul&gt;';
    }

    html += '&lt;div class="discl"&gt;'
         +  'Документ является аналитической обработкой и структурированием информации, '
         +  'предоставленной Заказчиком. Не является инженерной, юридической или коммерческой '
         +  'консультацией. Исполнитель не даёт рекомендаций по выбору материала, марки или '
         +  'поставщика. Ответственность за решения лежит на Заказчике.'
         +  '&lt;/div&gt;';

    reportBox.innerHTML = html;
    reportBox.style.display = "block";
  }

  function buildTextReport(){
    var idx = computeIndices();
    var lights = computeLights();
    var blind = buildBlindSpots();
    var contra = buildContradictions();
    var ask = buildQuestionsToAsk();
    var now = new Date();

    var L = [];
    L.push("РАЗБОР ЗАПРОСА");
    L.push("Структура технического задания");
    L.push("================================");
    L.push("Дата: " + now.toLocaleString("ru-RU"));
    L.push("Проект: " + project.value.trim());
    L.push("Заказчик: " + clientName.value.trim());
    L.push("Email: " + clientEmail.value.trim());
    L.push("");
    L.push("ИНДЕКС ПОЛНОТЫ: " + idx.completeness + "%");
    L.push("ИНДЕКС ДОСТОВЕРНОСТИ: " + idx.reliability + "%");
    L.push("Заполнено: " + idx.filled + " из " + idx.total);
    L.push("");
    L.push("СВЕТОФОР ПО СЛОЯМ");
    lights.forEach(function(l){
      var mark = l.color === "g" ? "[зелёный]" : l.color === "y" ? "[жёлтый]" : "[красный]";
      L.push("  " + mark + " " + l.title + " (" + l.filled + "/" + l.total + ")");
    });

    if (blind.length) {
      L.push("");
      L.push("КАРТА СЛЕПЫХ ЗОН");
      blind.forEach(function(b){ L.push("  • " + b); });
    }
    if (contra.length) {
      L.push("");
      L.push("ПРОТИВОРЕЧИЯ");
      contra.forEach(function(c){ L.push("  • " + c); });
    }
    if (ask.length) {
      L.push("");
      L.push("ВОПРОСЫ, КОТОРЫЕ СТОИТ ЗАДАТЬ");
      ask.forEach(function(q){ L.push("  • " + q); });
    }

    L.push("");
    L.push("================================");
    L.push("ДИСКЛЕЙМЕР");
    L.push("Документ является аналитической обработкой и структурированием");
    L.push("информации, предоставленной Заказчиком. Не является инженерной,");
    L.push("юридической или коммерческой консультацией. Исполнитель не даёт");
    L.push("рекомендаций по выбору материала, марки или поставщика.");
    L.push("Ответственность за решения лежит на Заказчике.");
    L.push("");
    L.push("Связаться: " + RECIPIENT_EMAIL);
    return L.join("\n");
  }

  function downloadFile(name, text){
    var blob = new Blob([text], { type:"text/plain;charset=utf-8" });
    var url = URL.createObjectURL(blob);
    var a = document.createElement("a");
    a.href = url; a.download = name;
    document.body.appendChild(a); a.click(); document.body.removeChild(a);
    setTimeout(function(){ URL.revokeObjectURL(url); }, 2000);
  }

  startBtn.addEventListener("click", function(){
    showScreen(formScreen);
  });

  form.addEventListener("submit", function(e){
    e.preventDefault();
    if (hpField.value.trim() !== "") return;
    var idx = computeIndices();
    if (idx.filled &lt; 10) {
      alert("Пожалуйста, ответьте хотя бы на 10 вопросов.");
      return;
    }
    tagQuestions();
    var safe = project.value.trim().replace(/[^\wа-яА-Я0-9\-_]+/g, "_").slice(0, 60) || "razbor";
    downloadFile("razbor_zaprosa_" + safe + "_" + Date.now() + ".txt", buildTextReport());
    renderReport();
    reportBox.scrollIntoView({ behavior:"smooth", block:"start" });
  });

  resetBtn.addEventListener("click", function(){
    if (!confirm("Очистить все ответы?")) return;
    allAreas.forEach(function(a){ a.value = ""; });
    allSources.forEach(function(s){ s.value = ""; applySourceColor(s); });
    consent.checked = false;
    project.value = ""; clientName.value = ""; clientEmail.value = "";
    try { localStorage.removeItem(STORAGE_KEY); } catch(e){}
    reportBox.style.display = "none";
    updateUI();
  });

  [consent, project, clientName, clientEmail].forEach(function(el){
    el.addEventListener("input", updateUI);
    el.addEventListener("change", updateUI);
  });

  buildForm();
  loadDraft();
  updateUI();
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</subtitle>
  <updated>2026-09-22T08:19:14Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/ef/f66878aa6d11f1abb9f7ceed6face4/-/image%20%284%29.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
