feat: вариант «не применим» для показателей критериев значимости
В окне ПП 127 у каждого показателя теперь 5 вариантов: пусто, «не применим», 3 категория, 2 категория, 1 категория. «Не применим» не влияет на расчёт категории, но сохраняется в список показателей как «Показатель N. ... — не применим».
This commit is contained in:
+24
-11
@@ -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:
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user