From 5c79b494cd134cc18ae8f05dff9a3421b8ab85a5 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 6 Sep 2026 20:15:26 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-edit):=20=D0=BF=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=80=D0=B5=D0=B1=D1=91=D0=BD=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=BC=20ChildObjects=20?= =?UTF-8?q?=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=B0=D0=BB=20=D0=B2=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D0=BD=D1=8C=20=D1=81=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Get-ChildIndent брал отступ из первого пробельного узла контейнера. В контейнере с детьми это отступ ПЕРЕД первым ребёнком — верно; в пустом (только что раскрытом) единственный пробельный узел — отступ ЗАКРЫВАЮЩЕГО тега, то есть уровень самого контейнера. Первый добавленный реквизит, команда или таблица получали отступ , а не на табуляцию глубже. То же во вложенном ChildObjects табличной части. Платформа такой файл принимает и при выгрузке нормализует, поэтому дефект косметический — но он задевал любой объект, а сравнивать наш вывод с выгрузкой становилось неудобно. Эталоны четырёх кейсов пересняты: git diff -w пуст, меняются только отступы. Все 23 снэпшота meta-edit, доезжающие до платформы, приняты 8.3.24.1691. Кейс eds-add-table-twice объявил skipPlatformVerify: он нарочно удаляет файл таблицы, оставляя висячую регистрацию, — платформа отказывает по условию кейса, а не из-за дефекта навыка. Радиус проверен: та же эвристика есть в cf-edit, form-edit, interface-edit и cfe-borrow (семья get_child_indent из списка долга check-inline-drift, не сведена). У form-edit пустой контейнер обрабатывается верно — проверено добавлением элемента в форму с ; у cf-edit и cfe-borrow ветка недостижима: в ChildObjects конфигурации всегда есть . Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi --- .../skills/meta-edit/scripts/meta-edit.ps1 | 16 +- .claude/skills/meta-edit/scripts/meta-edit.py | 12 +- .../cases/meta-edit/eds-add-table-twice.json | 60 +++- .../add-attribute/Catalogs/Контрагенты.xml | 88 +++--- .../add-command/Catalogs/Контрагенты.xml | 42 +-- .../add-tabpart/Catalogs/Контрагенты.xml | 274 +++++++++--------- .../lenient-key-case/Catalogs/Контрагенты.xml | 88 +++--- 7 files changed, 318 insertions(+), 262 deletions(-) diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index e6a68bed6..e8c465039 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.ps1 +++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1 @@ -1,4 +1,4 @@ -# meta-edit v1.49 — Edit existing 1C metadata object XML +# meta-edit v1.50 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -749,11 +749,21 @@ function Import-Fragment([string]$xmlString) { } function Get-ChildIndent($container) { + # В контейнере с детьми первый пробельный узел — это отступ ПЕРЕД первым ребёнком. + # В пустом (только что раскрытом) единственный пробельный узел — отступ ЗАКРЫВАЮЩЕГО + # тега, то есть уровень самого контейнера: ребёнку нужен на табуляцию глубже. Без этой + # поправки первый ребёнок вставал вровень с . + $hasElements = $false + foreach ($child in $container.ChildNodes) { + if ($child.NodeType -eq 'Element') { $hasElements = $true; break } + } foreach ($child in $container.ChildNodes) { if ($child.NodeType -eq 'Whitespace' -or $child.NodeType -eq 'SignificantWhitespace') { $text = $child.Value - if ($text -match '^\r?\n(\t+)$') { return $Matches[1] } - if ($text -match '^\r?\n(\t+)') { return $Matches[1] } + $found = $null + if ($text -match '^\r?\n(\t+)$') { $found = $Matches[1] } + elseif ($text -match '^\r?\n(\t+)') { $found = $Matches[1] } + if ($null -ne $found) { return $(if ($hasElements) { $found } else { "$found`t" }) } } } # Fallback: count depth diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py index 21ec04b8a..d6355a224 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.py +++ b/.claude/skills/meta-edit/scripts/meta-edit.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-edit v1.49 — Edit existing 1C metadata object XML +# meta-edit v1.50 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -757,17 +757,23 @@ def import_fragment(xml_string): def get_child_indent(container): """Detect indentation of children inside a container element.""" + # В контейнере с детьми первый пробельный узел — это отступ ПЕРЕД первым ребёнком. + # В пустом (только что раскрытом) единственный пробельный узел — отступ ЗАКРЫВАЮЩЕГО + # тега, то есть уровень самого контейнера: ребёнку нужен на табуляцию глубже. Без этой + # поправки первый ребёнок вставал вровень с . + has_elements = len(container) > 0 + extra = "" if has_elements else "\t" # Check container.text (text before first child) if container.text and "\n" in container.text: after_nl = container.text.rsplit("\n", 1)[-1] if after_nl and not after_nl.strip(): - return after_nl + return after_nl + extra # Check tail of child elements for child in container: if child.tail and "\n" in child.tail: after_nl = child.tail.rsplit("\n", 1)[-1] if after_nl and not after_nl.strip(): - return after_nl + return after_nl + extra # Fallback: count depth depth = 0 current = container diff --git a/tests/skills/cases/meta-edit/eds-add-table-twice.json b/tests/skills/cases/meta-edit/eds-add-table-twice.json index 721a3f30a..e4ac25201 100644 --- a/tests/skills/cases/meta-edit/eds-add-table-twice.json +++ b/tests/skills/cases/meta-edit/eds-add-table-twice.json @@ -7,21 +7,61 @@ "input": { "type": "ExternalDataSource", "name": "PG", - "tables": { "products": { "keyFields": ["id"], "fields": ["id: Number(10,0)"] } } + "tables": { + "products": { + "keyFields": [ + "id" + ], + "fields": [ + "id: Number(10,0)" + ] + } + } }, - "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + "args": { + "-JsonPath": "{inputFile}", + "-OutputDir": "{workDir}" + } }, { "script": "meta-edit/scripts/meta-edit", - "input": { "add": { "tables": { "sales": ["id: Number(10,0)"] } } }, - "args": { "-DefinitionFile": "{inputFile}", "-ObjectPath": "{workDir}/ExternalDataSources/PG.xml" } + "input": { + "add": { + "tables": { + "sales": [ + "id: Number(10,0)" + ] + } + } + }, + "args": { + "-DefinitionFile": "{inputFile}", + "-ObjectPath": "{workDir}/ExternalDataSources/PG.xml" + } }, - { "deletePath": "ExternalDataSources/PG/Tables/sales.xml" } + { + "deletePath": "ExternalDataSources/PG/Tables/sales.xml" + } ], - "params": { "objectPath": "ExternalDataSources/PG.xml" }, - "input": { "add": { "tables": { "sales": ["id: Number(10,0)"] } } }, + "params": { + "objectPath": "ExternalDataSources/PG.xml" + }, + "input": { + "add": { + "tables": { + "sales": [ + "id: Number(10,0)" + ] + } + } + }, "expect": { - "stdoutContains": ["already exists"], - "filesAbsent": ["ExternalDataSources/PG/Tables/sales.xml"] - } + "stdoutContains": [ + "already exists" + ], + "filesAbsent": [ + "ExternalDataSources/PG/Tables/sales.xml" + ] + }, + "skipPlatformVerify": "кейс нарочно удаляет файл таблицы, оставляя висячую регистрацию: такую конфигурацию платформа не загрузит по условию кейса, а не из-за дефекта навыка" } diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml index 80c20ddea..229eae352 100644 --- a/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml +++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml @@ -87,50 +87,50 @@ false - - - ИНН - - - ru - Инн - - - - - xs:string - - 12 - Variable - - - false - - - - false - - false - false - - - false - - DontCheck - Items - - - Auto - Auto - - - Auto - ForItem - DontIndex - Use - Use - - + + + ИНН + + + ru + Инн + + + + + xs:string + + 12 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/add-command/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-command/Catalogs/Контрагенты.xml index 0505a2dbd..7dd7c62e0 100644 --- a/tests/skills/cases/meta-edit/snapshots/add-command/Catalogs/Контрагенты.xml +++ b/tests/skills/cases/meta-edit/snapshots/add-command/Catalogs/Контрагенты.xml @@ -87,27 +87,27 @@ false - - - ОткрытьДосье - - - ru - Открыть досье - - - - FormNavigationPanelGoTo - - Single - false - Auto - - - - Auto - - + + + ОткрытьДосье + + + ru + Открыть досье + + + + FormNavigationPanelGoTo + + Single + false + Auto + + + + Auto + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml index 331ba96d9..d1e9320b7 100644 --- a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml +++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml @@ -87,143 +87,143 @@ false - - - - UUID-013 - UUID-014 - - - UUID-015 - UUID-016 - - - - КонтактнаяИнформация - - - ru - Контактная информация - - - - - DontCheck - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - Use - false - - - - Use - - - - - - - ForItem - - - - - Тип - - - ru - Тип - - - - - xs:string - - 50 - Variable - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - DontIndex - Use - Use - - - - - Значение - - - ru - Значение - - - - - xs:string - - 250 - Variable - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - DontIndex - Use - Use - - - - + + + + UUID-013 + UUID-014 + + + UUID-015 + UUID-016 + + + + КонтактнаяИнформация + + + ru + Контактная информация + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + ForItem + + + + + Тип + + + ru + Тип + + + + + xs:string + + 50 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + Use + Use + + + + + Значение + + + ru + Значение + + + + + xs:string + + 250 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + Use + Use + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/lenient-key-case/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/lenient-key-case/Catalogs/Контрагенты.xml index 80c20ddea..229eae352 100644 --- a/tests/skills/cases/meta-edit/snapshots/lenient-key-case/Catalogs/Контрагенты.xml +++ b/tests/skills/cases/meta-edit/snapshots/lenient-key-case/Catalogs/Контрагенты.xml @@ -87,50 +87,50 @@ false - - - ИНН - - - ru - Инн - - - - - xs:string - - 12 - Variable - - - false - - - - false - - false - false - - - false - - DontCheck - Items - - - Auto - Auto - - - Auto - ForItem - DontIndex - Use - Use - - + + + ИНН + + + ru + Инн + + + + + xs:string + + 12 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + \ No newline at end of file