From 3922b8264a1a523661623d7367dd93663c53a941 Mon Sep 17 00:00:00 2001 From: prog1764 Date: Tue, 4 Aug 2026 20:44:53 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=20=C2=AB=D0=BD=D0=B5=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=C2=BB=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D1=82=D0=B5=D1=80=D0=B8=D0=B5=D0=B2=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В окне ПП 127 у каждого показателя теперь 5 вариантов: пусто, «не применим», 3 категория, 2 категория, 1 категория. «Не применим» не влияет на расчёт категории, но сохраняется в список показателей как «Показатель N. ... — не применим». --- dokogen/ui.py | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/dokogen/ui.py b/dokogen/ui.py index b1cb1fc..f8c6963 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -1899,9 +1899,9 @@ class DokoGenApp: # Текст показателя lbl_name = ttk.Label(row, text=name, wraplength=640, justify=tk.LEFT) lbl_name.pack(side=tk.LEFT) - # Выбор значения (категория) + # Выбор значения (категория) + вариант «не применим» var = tk.StringVar(value='') - options = [''] + options = ['', 'не применим'] for cat in ('III', 'II', 'I'): v = values.get(cat, '') if v: @@ -1933,7 +1933,11 @@ class DokoGenApp: result_lbl.pack(anchor=tk.W, pady=(6, 0)) def _selected(): - """Список выбранных: [(num, name, категория, значение)] — только применимые показатели.""" + """Список выбранных: [(num, name, категория, значение)] — только применимые показатели. + + «не применим» возвращается как ('—', 'не применим') и не влияет на категорию, + но сохраняется в список показателей. + """ out = [] for num, name, values, var, applicable_here in rows: if not applicable_here: @@ -1941,6 +1945,9 @@ class DokoGenApp: s = var.get().strip() if not s: continue + if s == 'не применим': + out.append((num, name, '—', 'не применим')) + continue cat = s.split(' ')[0] # III/II/I val = s.split(': ', 1)[1] if ': ' in s else '' out.append((num, name, cat, val)) @@ -1959,27 +1966,33 @@ class DokoGenApp: def _calc(): selected = _selected() - if not selected: + # «не применим» не влияет на категорию — считаем только реально выбранные категории + chosen = [x for x in selected if x[2] != '—'] + if not chosen: if applicable is not None and not any(a for _, _, _, _, a in rows): result_lbl.config(text="Категория значимости: без категории (для этой сферы нет применимых показателей)") else: result_lbl.config(text="Категория значимости: — (ничего не выбрано)") return - cat = _calc_category(selected) - result_lbl.config(text=f"Категория значимости: {cat} (выбрано показателей: {len(selected)})") + cat = _calc_category(chosen) + result_lbl.config(text=f"Категория значимости: {cat} (выбрано показателей: {len(chosen)})") def _save(): selected = _selected() - # Заполняем список показателей + # Заполняем список показателей (включая «не применим») lines = [] for num, name, cat, val in selected: - lines.append(f"Показатель {num}. {name} — {cat} категория: {val}") + if cat == '—': + lines.append(f"Показатель {num}. {name} — не применим") + else: + lines.append(f"Показатель {num}. {name} — {cat} категория: {val}") if hasattr(self, 'is_criteria_values_listbox'): self.is_criteria_values_listbox.delete(0, tk.END) for line in lines: self.is_criteria_values_listbox.insert(tk.END, line) - # Категория значимости - cat = _calc_category(selected) + # Категория значимости — только по реально выбранным категориям + chosen = [x for x in selected if x[2] != '—'] + cat = _calc_category(chosen) if hasattr(self, 'is_category_var'): self.is_category_var.set(cat) # Обоснование: если поле пустое — сформируем автоматически @@ -1988,7 +2001,7 @@ class DokoGenApp: f"Категория значимости объекта КИИ определена в соответствии с Правилами категорирования " f"объектов критической информационной инфраструктуры РФ (ПП РФ от 08.02.2019 № 127). " f"Объект отнесён к {cat} категории значимости. Основания: " - + "; ".join(f"показатель {num} ({cat} категория)" for num, _, cat, _ in selected) + "." + + "; ".join(f"показатель {num} ({c} категория)" for num, _, c, _ in chosen) + "." ) if not j: j = auto_just @@ -1997,7 +2010,7 @@ class DokoGenApp: for line in j.split('\n'): if line.strip(): self.is_criteria_justification_listbox.insert(tk.END, line.strip()) - self.log(f"📋 Критерии значимости (ПП 127) сохранены: категория {cat}, показателей: {len(selected)}") + self.log(f"📋 Критерии значимости (ПП 127) сохранены: категория {cat}, показателей: {len(chosen)}") dialog.destroy() btn_frame = ttk.Frame(body)