From 6852bc634b9951ad7f08371cf37e3fc738fb90e6 Mon Sep 17 00:00:00 2001 From: prog1764 Date: Tue, 4 Aug 2026 20:48:55 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BE=D0=B1=D0=BE=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B5=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BA=D1=80=D0=B8=D1=82=D0=B5=D1=80=D0=B8=D0=B5=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=81=D1=84=D0=B5=D1=80=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dictionaries/criteria_justifications.json: тексты обоснований для сферы здравоохранения (показатели 1-7) — дословно из примера заказчика - окно ПП 127: при выборе «не применим» обоснование из словаря сферы автоматически подставляется в поле «Обоснование» - авто-обоснование при сохранении: категория + выбранные показатели + неприменимые показатели с текстами обоснований; если все показатели неприменимы — «Категория значимости: не присвоена» --- .../dictionaries/criteria_justifications.json | 11 ++++ dokogen/ui.py | 52 ++++++++++++++++--- 2 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 dokogen/dictionaries/criteria_justifications.json diff --git a/dokogen/dictionaries/criteria_justifications.json b/dokogen/dictionaries/criteria_justifications.json new file mode 100644 index 0000000..203ea92 --- /dev/null +++ b/dokogen/dictionaries/criteria_justifications.json @@ -0,0 +1,11 @@ +{ + "Здравоохранение": { + "1": "Рассматриваемый объект КИИ не участвует в обработке информации, необходимой для оказания медицинской помощи, проведения медицинских экспертиз, медицинских осмотров и медицинских освидетельствований, санитарно-противоэпидемических (профилактических) мероприятий и не осуществляет управление, контроль или мониторинг данных бизнес-процессов. Объект является вспомогательной информационной системой, целью которой является автоматизация процессов ведения бухгалтерского учета. Объект не осуществляет мониторинг, контроль или управление другими объектами КИИ, обеспечивающими жизненно важные функции организма. Утрата или иное повреждение объекта КИИ не может повлиять на жизненно важные функции организма.", + "2": "Объект КИИ не относится к объектам обеспечения жизнедеятельности населения, в том числе объектам водоснабжения и канализации, очистки сточных вод, тепло- и электроснабжения, гидротехнических сооружений.", + "3": "Объекты КИИ организации сферы здравоохранения не относятся к объектам транспортной инфраструктуры, и субъект КИИ не имеет в своем составе подразделения транспортной инфраструктуры.", + "4": "Субъект КИИ не является оператором связи, объекты КИИ организации сферы здравоохранения не относятся к объектам транспортной инфраструктуры.", + "5": "Организация сферы здравоохранения является юридическим лицом, обеспечивающим эксплуатацию информационной системы, задействованной в процессе оказания государственной услуги, однако нарушение функционирования информационной системы (рассматриваемого объекта КИИ), не участвующей в обработке информации, необходимой для оказания государственной услуги, не влечет за собой нарушение и (или) прекращение доступа к государственной услуге. Рассматриваемый объект КИИ не участвует в обработке информации, необходимой для оказания государственной услуги.", + "6": "Организация сферы здравоохранения не является органом государственной власти, в связи с этим критерий неприменим.", + "7": "Организация сферы здравоохранения не является субъектом политической сферы деятельности, в связи с этим критерий неприменим." + } +} diff --git a/dokogen/ui.py b/dokogen/ui.py index f8c6963..e9439ed 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -1846,6 +1846,18 @@ class DokoGenApp: except Exception: applicable = None + # Словарь обоснований неприменимости показателей по сферам + # (примеры формулировок; для сфер без записей — пусто) + justifications = {} + try: + _j_path = os.path.join(os.path.dirname(__file__), 'dictionaries', 'criteria_justifications.json') + with open(_j_path, encoding='utf-8') as _f: + justifications = _json.load(_f) + except Exception: + justifications = {} + _sphere_just = self.is_sphere_combo.get() if hasattr(self, 'is_sphere_combo') else '' + _just = justifications.get(_sphere_just, {}) if _sphere_just else {} + dialog = tk.Toplevel(self.root) dialog.title("Показатели критериев значимости (ПП РФ № 127)") dialog.geometry("980x700") @@ -1909,6 +1921,21 @@ class DokoGenApp: combo = ttk.Combobox(row, textvariable=var, state='readonly', width=34, values=options) combo.pack(side=tk.RIGHT, padx=6) + + def _on_pick(_e, _num=num, _var=var, _name=name): + # При выборе «не применим» — автоподстановка обоснования из словаря сферы + if _var.get().strip() == 'не применим' and _num in _just: + txt = _just[_num] + prefix = f"Показатель {_num}. {_name} — не применим." + full = prefix + " " + txt + cur = justify_txt.get('1.0', 'end-1c').strip() + if prefix not in cur: + if cur: + justify_txt.insert('end', '\n' + full) + else: + justify_txt.insert('1.0', full) + combo.bind('<>', _on_pick) + if not applicable_here: # Показатель не применим для сферы объекта — блокируем combo.config(state='disabled') @@ -1992,17 +2019,30 @@ class DokoGenApp: self.is_criteria_values_listbox.insert(tk.END, line) # Категория значимости — только по реально выбранным категориям chosen = [x for x in selected if x[2] != '—'] + not_applicable = [x for x in selected if x[2] == '—'] cat = _calc_category(chosen) if hasattr(self, 'is_category_var'): self.is_category_var.set(cat) # Обоснование: если поле пустое — сформируем автоматически + # (по формату: категория + выбранные показатели + неприменимые с обоснованиями) j = justify_txt.get('1.0', 'end-1c').strip() - auto_just = ( - f"Категория значимости объекта КИИ определена в соответствии с Правилами категорирования " - f"объектов критической информационной инфраструктуры РФ (ПП РФ от 08.02.2019 № 127). " - f"Объект отнесён к {cat} категории значимости. Основания: " - + "; ".join(f"показатель {num} ({c} категория)" for num, _, c, _ in chosen) + "." - ) + auto_parts = [] + if chosen: + auto_parts.append( + "Категория значимости объекта КИИ определена в соответствии с Правилами категорирования " + "объектов критической информационной инфраструктуры РФ (ПП РФ от 08.02.2019 № 127). " + f"Объект отнесён к {cat} категории значимости. Основания: " + + "; ".join(f"показатель {num} ({c} категория)" for num, _, c, _ in chosen) + "." + ) + for num, name, _, _ in not_applicable: + base = f"Показатель {num}. {name} — не применим" + if num in _just: + auto_parts.append(base + ": " + _just[num]) + else: + auto_parts.append(base + ".") + if not_applicable and not chosen: + auto_parts.insert(0, "Категория значимости: не присвоена (показатели критериев значимости неприменимы к объекту).") + auto_just = "\n".join(auto_parts) if auto_parts else "" if not j: j = auto_just if hasattr(self, 'is_criteria_justification_listbox'):