From 50bc9f5c0a43cd1d33983b0f57f9a14b20bececa Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 9 Aug 2026 21:16:07 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-edit):=20=D0=BA=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B7=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2-=D0=BF=D0=B5=D1=80=D0=B5=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit modify-property писал значение свойства объекта в XML как есть: и "обороты", и "turnovers", и "ЧтоУгодно". Навык печатал Modified: 1 и оставлял выгрузку, которую платформа не примет. Расхождения портов тут не было — оба вели себя одинаково, поэтому кампания паритета это не ловила. Значение теперь проходит через normalize_enum_value — ту же функцию, что уже применялась к свойствам реквизитов: алиас и регистр приводятся к канону, неизвестное значение отвергается с перечислением допустимых ДО записи файла. Поведение сведено к meta-compile, который так работает давно. Словарь алиасов в meta-edit обёрнут в CIDict: без этого правка сделала бы хуже — "обороты" строчными не нашли бы ключ "Обороты" и получили бы отказ вместо прежней тихой записи. check-inline-drift: заведена семья normalize_enum_value (тела в обоих портах совпадают побайтово, эталон meta-compile). Списки значений по-прежнему держит check-enum-drift, новых ключей не заводили. Проверка: два кейса (синоним → канон в эталоне; мусор → expectError), 685/685 на PS и 682+3 skipped на PY, гарды 4/4. Платформенно: синтетический регистр, правка через meta-edit, загрузка в 8.3.27 и обратная выгрузка — платформа вернула Turnovers. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/meta-edit/scripts/meta-edit.ps1 | 7 +- .claude/skills/meta-edit/scripts/meta-edit.py | 10 +- .../error-modify-property-enum-value.json | 31 +++ .../meta-edit/modify-property-enum-alias.json | 30 +++ .../AccumulationRegisters/Продажи.xml | 226 ++++++++++++++++ .../Продажи/Ext/RecordSetModule.bsl | 0 .../Configuration.xml | 252 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../Languages/Русский.xml | 16 ++ tests/skills/check-inline-drift.mjs | 8 + 10 files changed, 596 insertions(+), 2 deletions(-) create mode 100644 tests/skills/cases/meta-edit/error-modify-property-enum-value.json create mode 100644 tests/skills/cases/meta-edit/modify-property-enum-alias.json create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи/Ext/RecordSetModule.bsl create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Configuration.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Languages/Русский.xml diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index 36c76a79..2ed885fd 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.37 — Edit existing 1C metadata object XML (+esc_xml/esc_xml_text: разное экранирование атрибута и текста) +# meta-edit v1.38 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -2110,6 +2110,11 @@ function Modify-Properties($propsDef) { exit 1 } + # Значение свойства-перечисления приводим к канону (как это делает meta-compile): иначе + # в XML уезжает то, что дала модель, и платформа отвергает выгрузку уже при загрузке. + # Неизвестное свойство функция пропускает как есть, неизвестное значение — отвергает. + $valueStr = Normalize-EnumValue $propName $valueStr + $propEl.InnerText = $valueStr Info "Modified property: $propName = $valueStr" $script:modifyCount++ diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py index 6822da34..da492c04 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.37 — Edit existing 1C metadata object XML (+esc_xml/esc_xml_text: разное экранирование атрибута и текста) +# meta-edit v1.38 — Edit existing 1C metadata object XML # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -357,6 +357,9 @@ enum_value_aliases = { 'ИндексироватьСДопУпорядочиванием': 'IndexWithAdditionalOrder', } +# Словарь ищет ПОЛЬЗОВАТЕЛЬСКИЙ ввод — поиск регистронезависим, как хеш-таблица PS1. +enum_value_aliases = CIDict(enum_value_aliases) + valid_enum_values = { 'RegisterType': ['Balance', 'Turnovers'], 'WriteMode': ['Independent', 'RecorderSubordinate'], @@ -2026,6 +2029,11 @@ def modify_properties(props_def): print(f"meta-edit: modify-property: свойство '{prop_name}' структурное (содержит дочерние узлы) — установка скалярного текста повредит XML; не поддерживается", file=sys.stderr) sys.exit(1) + # Значение свойства-перечисления приводим к канону (как это делает meta-compile): иначе + # в XML уезжает то, что дала модель, и платформа отвергает выгрузку уже при загрузке. + # Неизвестное свойство функция пропускает как есть, неизвестное значение — отвергает. + value_str = normalize_enum_value(prop_name, value_str) + # Set inner text — clear children first, set text for ch in list(prop_el): prop_el.remove(ch) diff --git a/tests/skills/cases/meta-edit/error-modify-property-enum-value.json b/tests/skills/cases/meta-edit/error-modify-property-enum-value.json new file mode 100644 index 00000000..04ae0de1 --- /dev/null +++ b/tests/skills/cases/meta-edit/error-modify-property-enum-value.json @@ -0,0 +1,31 @@ +{ + "name": "Ошибка: недопустимое значение свойства-перечисления", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "AccumulationRegister", + "name": "Продажи", + "registerType": "Balance", + "resources": [ + "Количество: Number(10,3)" + ] + }, + "args": { + "-JsonPath": "{inputFile}", + "-OutputDir": "{workDir}" + } + } + ], + "params": { + "objectPath": "AccumulationRegisters/Продажи" + }, + "input": { + "modify": { + "properties": { + "RegisterType": "ЧтоУгодно" + } + } + }, + "expectError": "Invalid value" +} diff --git a/tests/skills/cases/meta-edit/modify-property-enum-alias.json b/tests/skills/cases/meta-edit/modify-property-enum-alias.json new file mode 100644 index 00000000..186bbf2b --- /dev/null +++ b/tests/skills/cases/meta-edit/modify-property-enum-alias.json @@ -0,0 +1,30 @@ +{ + "name": "Значение перечисления по синониму приводится к канону", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "AccumulationRegister", + "name": "Продажи", + "registerType": "Balance", + "resources": [ + "Количество: Number(10,3)" + ] + }, + "args": { + "-JsonPath": "{inputFile}", + "-OutputDir": "{workDir}" + } + } + ], + "params": { + "objectPath": "AccumulationRegisters/Продажи" + }, + "input": { + "modify": { + "properties": { + "RegisterType": "обороты" + } + } + } +} diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи.xml new file mode 100644 index 00000000..437cfcac --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи.xml @@ -0,0 +1,226 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + + Продажи + + + ru + Продажи + + + + true + + + Turnovers + false + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + Managed + Use + true + + + + + + + + Количество + + + ru + Количество + + + + + xs:decimal + + 10 + 3 + Any + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + Use + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи/Ext/RecordSetModule.bsl b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/AccumulationRegisters/Продажи/Ext/RecordSetModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Configuration.xml new file mode 100644 index 00000000..4c4edb76 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + Продажи + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-enum-alias/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/check-inline-drift.mjs b/tests/skills/check-inline-drift.mjs index e3e6633b..2c190b22 100644 --- a/tests/skills/check-inline-drift.mjs +++ b/tests/skills/check-inline-drift.mjs @@ -270,6 +270,14 @@ const FAMILIES = [ ], }, + // ─── Значения свойств-перечислений ─────────────────────────────────────── + // Сама функция одинакова в обоих портах; СПИСКИ значений, на которые она опирается, держит + // отдельный гард check-enum-drift.mjs (авторитет тот же — meta-compile). + { + name: 'normalize_enum_value', py: 'normalize_enum_value', ps1: 'Normalize-EnumValue', + variants: [{ id: 'base', authority: 'meta-compile', consumers: ['meta-edit'] }], + }, + // ─── Регистронезависимый ввод: паритет с PS1 ───────────────────────────── // Существует только в PY: PowerShell регистронезависим сам по себе (свойства PSObject, ключи // Hashtable, -eq/-contains, имена параметров, ValidateSet), поэтому в .ps1 копии нет и быть