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