From b174ca659d1df4c794e943a5af96850262ba88b8 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 2 Aug 2026 12:28:54 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-decompile):=20=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=91=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=20?= =?UTF-8?q?=D1=81=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=20=D0=B2=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сокращённая запись предопределённого элемента — "(Код) Имя [Наименование]". Компилятор читает код как [^)]*, а имя как \S+, поэтому значение, содержащее собственные разделители грамматики, разбор ломает: код "114 (108)" даёт "(114 (108)) Код108", регулярка не сходится, и элемент теряет и имя, и код — в XML уходят пустые и . Декомпилятор теперь проверяет однозначность и при конфликте отдаёт объектную форму {name, code, description}, которую компилятор поддерживает давно. Конфликтом считаются ')' или ':' в коде, пробел/скобка/':' в имени, скобки в наименовании. Затронуто по 6 элементов в БП и в ERP (вычеты НДФЛ с кодами вида "117 (109)"). Пробел давний: эмиссия predefined помечена в WORKFLOW как черновая, а на УТ таких кодов нет — вскрылось только на корпусе 2.17. Проверка: справочники acc+erp+ut 2159/2159 (было 2157), JSON декомпилятора побайтово совпадает у PS и py, сюиты meta-decompile 3/3 на обоих портах и meta-compile 76/76. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/meta-decompile/scripts/meta-decompile.ps1 | 9 +++++++-- .claude/skills/meta-decompile/scripts/meta-decompile.py | 8 ++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index b970f74d..e4573290 100644 --- a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 +++ b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 @@ -1,4 +1,4 @@ -# meta-decompile v0.60 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.61 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, @@ -1513,7 +1513,12 @@ if (Test-Path -LiteralPath $predefPath) { # Компактная строка для плоских: без узла Type (Catalog) ИЛИ с непустым типом → "(Код) Имя [Наим]: Тип". # Пустой в короткую не влезает (нужен явный маркер) → object-форма с type:''. - if (-not $isFolder -and $kids.Count -eq 0 -and ($null -eq $typeStr -or $typeStr -ne '')) { + # Сокращение неоднозначно, если значение содержит собственные разделители грамматики + # "(Код) Имя [Наим]: Тип": ')' или ':' в коде, пробел/скобка/':' в имени, скобки в наименовании. + # Компилятор разбирает код как [^)]*, а имя как \S+ — на "114 (108)" разбор рассыпается, + # и элемент терял и имя, и код (6 элементов в БП и столько же в ERP). + $ambiguous = ($code -match '[):]') -or ($name -match '[\s:\[\]()]') -or ($desc -match '[\[\]]') + if (-not $isFolder -and $kids.Count -eq 0 -and ($null -eq $typeStr -or $typeStr -ne '') -and -not $ambiguous) { $s = if ($code) { "($code) $name" } else { $name } if ($desc -eq '') { $s = "$s []" } elseif ($desc -cne $auto) { $s = "$s [$desc]" } diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.py b/.claude/skills/meta-decompile/scripts/meta-decompile.py index 6942ac9e..9f99ed2a 100644 --- a/.claude/skills/meta-decompile/scripts/meta-decompile.py +++ b/.claude/skills/meta-decompile/scripts/meta-decompile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-decompile v0.60 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.61 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии. @@ -717,7 +717,11 @@ def predef_item_to_dsl(item_el): auto = split_camel_words(name) # Компактная строка для плоских: без узла Type (Catalog) ИЛИ с непустым типом → "(Код) Имя [Наим]: Тип". - if (not is_folder) and len(kids) == 0 and (type_str is None or type_str != ''): + # Сокращение неоднозначно, если значение содержит собственные разделители грамматики: + # ')' или ':' в коде, пробел/скобка/':' в имени, скобки в наименовании. Компилятор читает код + # как [^)]*, а имя как \S+ — на "114 (108)" разбор рассыпается и элемент терял имя и код. + ambiguous = bool(re.search(r'[):]', code or '')) or bool(re.search(r'[\s:\[\]()]', name or '')) or bool(re.search(r'[\[\]]', desc or '')) + if (not is_folder) and len(kids) == 0 and (type_str is None or type_str != '') and not ambiguous: s = ("(%s) %s" % (code, name)) if code else name if desc == '': s = s + " []"