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 копии нет и быть