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 # списки — данные вложенных циклов, не подставляем