From 136c58c9486754812f7eac7bd2c7bf67bd96ff07 Mon Sep 17 00:00:00 2001 From: LocoAgent Date: Wed, 5 Aug 2026 13:52:29 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=86=D0=B8=D0=BA=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=E2=80=94=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D1=86=D0=B8=D0=BA=D0=BB=D1=8B=20(=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B8=20=D0=B7=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=B2=D0=BD=D1=83?= =?UTF-8?q?=D1=82=D1=80=D0=B8=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=9A=D0=98=D0=98)=20=D0=B1=D1=80=D0=B0=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=B8=D0=B7=20item;=20=D1=82=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83?= =?UTF-8?q?=D1=8E=D1=82=20=D0=BE=D0=B1=D1=89=D0=B8=D0=B9=20=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=80=D1=8C=20loops,=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B5=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dokogen/generator.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/dokogen/generator.py b/dokogen/generator.py index 8214cad..151a82a 100644 --- a/dokogen/generator.py +++ b/dokogen/generator.py @@ -310,10 +310,14 @@ def _subst_var_xml(xml: str, var: str, val: str) -> str: + '') -def _expand_nested_loops(template: str, item: Dict) -> str: +def _expand_nested_loops(template: str, item: Dict, loops: Dict = None) -> str: """Разворачивает вложенные циклы вида ... - данными из item (список словарей). Используется для циклов внутри цикла ИС, - например пользователи ИС. Переменные внутри: {{user_fio}}, {{user_position}}.""" + данными из item (список словарей) или из общего словаря циклов loops. + Используется для циклов внутри цикла ИС, например пользователи ИС, + а также для вложенных таблиц (показатели значимости внутри объекта КИИ). + Переменные внутри: {{user_fio}}, {{user_position}}, {{item.*}}.""" + if loops is None: + loops = {} result = template for _ in range(20): m_start = LOOP_START.search(result) @@ -321,6 +325,8 @@ def _expand_nested_loops(template: str, item: Dict) -> str: break key = m_start.group(1) data = item.get(key) + if not isinstance(data, list): + data = loops.get(key) if not isinstance(data, list): # Нет данных для вложенного цикла — удаляем блок целиком depth = 1 @@ -478,7 +484,7 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str: clone = template_clean # Вложенные циклы (users_loop и т.п.) — разворачиваем ДО подстановки # обычных полей, чтобы {{user_fio}} внутри них не затёрлись алиасами - clone = _expand_nested_loops(clone, item) + clone = _expand_nested_loops(clone, item, loops) for field, value in item.items(): if isinstance(value, list): continue # списки — данные вложенных циклов, не подставляем