From a305c1bc898ff1d78b646bc15b70ea2c252b2ea5 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 2 Aug 2026 11:59:33 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-decompile):=20=D1=80=D0=B5=D0=B3=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D1=87=D1=83=D0=B2=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D1=81=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=20=D0=B4?= =?UTF-8?q?=D0=B5=D1=84=D0=BE=D0=BB=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Аудит всех 198 сравнений в декомпиляторе после того, как ловушка PS (-eq/-ne регистронезависимы) сработала трижды подряд: синоним метода, RootURL и синоним шаблона теряли значение, отличавшееся от дефолта только регистром. Сравнения разделены на два класса. Рискованный — где дефолт ВЫВОДИТСЯ ИЗ ДАННЫХ (имя, синоним, обработчик): там регистр реально гуляет. Такие сравнения синонимов уже были регистрочувствительными с прошлой кампании; оставались три — обработчик метода против "ИмяШаблона+ИмяМетода", состав UsePurposes и список InputByString. Исправлены. Add-EnumProp (центральный хелпер сравнения с дефолтом) тоже переведён на -cne: на текущем корпусе это no-op, платформа пишет enum канонически, но снимает латентную ловушку. Инлайновые сравнения с enum-литералами (~150 шт.) оставлены как есть: там дефолт — фиксированная константа формата, а не данные, и расхождение по регистру означало бы неканоничный enum от платформы, чего не бывает. Проверка (изменений нет ни на одном корпусе): сервисы ERP+БП 46/46, сервисы УТ 25/25, справочники УТ 519/519, tier-1 УТ 1282/1283, справочники acc+erp+ut 2157/2159, сюиты meta-compile 76/76 и meta-decompile 3/3. Два расхождения в справочниках — давний пробел по предопределённым элементам, воспроизводится и на коде до правки. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/meta-decompile/scripts/meta-decompile.ps1 | 12 +++++++----- .../skills/meta-decompile/scripts/meta-decompile.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index b8e9a49f..b970f74d 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.59 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.60 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, @@ -435,7 +435,9 @@ $cmt = P 'Comment'; if ($cmt) { $dsl['comment'] = $cmt } # Свойства Catalog (omit-on-default). Порядок ключей — как удобно DSL. function Add-BoolProp { param([string]$key, [string]$tag, [bool]$default) $v = P $tag; if ($null -ne $v) { $b = ($v -eq 'true'); if ($b -ne $default) { $dsl[$key] = $b } } } -function Add-EnumProp { param([string]$key, [string]$tag, [string]$default) $v = P $tag; if ($null -ne $v -and $v -ne '' -and $v -ne $default) { $dsl[$key] = $v } } +# -cne: сравнение с дефолтом ВСЕГДА регистрочувствительное. PS -ne регистронезависим, и значение, +# отличающееся от дефолта только регистром, молча терялось (ловилось трижды: синонимы, RootURL). +function Add-EnumProp { param([string]$key, [string]$tag, [string]$default) $v = P $tag; if ($null -ne $v -and $v -ne '' -and $v -cne $default) { $dsl[$key] = $v } } function Add-IntProp { param([string]$key, [string]$tag, [int]$default) $v = P $tag; if ($null -ne $v -and $v -ne '') { $iv = [int]$v; if ($iv -ne $default) { $dsl[$key] = $iv } } } Add-BoolProp 'hierarchical' 'Hierarchical' $false @@ -719,7 +721,7 @@ if ($objType -eq 'CommonForm') { if ($upNode) { $ups = @($upNode.SelectNodes('v8:Value', $nsm) | ForEach-Object { $_.InnerText }) $def2 = @('PlatformApplication', 'MobilePlatformApplication') - $same = ($ups.Count -eq $def2.Count); if ($same) { for ($k=0; $k -lt $ups.Count; $k++) { if ($ups[$k] -ne $def2[$k]) { $same=$false; break } } } + $same = ($ups.Count -eq $def2.Count); if ($same) { for ($k=0; $k -lt $ups.Count; $k++) { if ($ups[$k] -cne $def2[$k]) { $same=$false; break } } } if (-not $same -and $ups.Count -gt 0) { $dsl['usePurposes'] = [System.Collections.ArrayList]@($ups) } } $ep = Get-MLValue ($props.SelectSingleNode('md:ExtendedPresentation', $nsm)); if ($null -ne $ep) { $dsl['extendedPresentation'] = $ep } @@ -955,7 +957,7 @@ if ($ibNode) { if ($cl -gt 0) { $ibDef += "StandardAttribute.Code" } $ibShort = @($ibActual | ForEach-Object { Short-Field $_ }) $same = ($ibShort.Count -eq $ibDef.Count) - if ($same) { for ($k = 0; $k -lt $ibShort.Count; $k++) { if ($ibShort[$k] -ne $ibDef[$k]) { $same = $false; break } } } + if ($same) { for ($k = 0; $k -lt $ibShort.Count; $k++) { if ($ibShort[$k] -cne $ibDef[$k]) { $same = $false; break } } } if (-not $same) { $dsl['inputByString'] = [System.Collections.ArrayList]@($ibShort) } } @@ -1241,7 +1243,7 @@ if ($childObjs) { $handlerVal = if ($mHandler) { $mHandler.InnerText } else { '' } $synDefault = ($null -eq $mSyn) -or ("$mSyn" -ceq (Split-CamelWords $mName)) $cmtEmpty = (-not $mCmt) -or (-not $mCmt.InnerText) - if ($handlerVal -eq "$tName$mName" -and $synDefault -and $cmtEmpty) { + if ($handlerVal -ceq "$tName$mName" -and $synDefault -and $cmtEmpty) { $methods[$mName] = $httpVal } else { $mo = [ordered]@{ httpMethod = $httpVal } diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.py b/.claude/skills/meta-decompile/scripts/meta-decompile.py index 4ad9d808..6942ac9e 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.59 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.60 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии.