diff --git a/.claude/skills/meta-edit/properties-reference.md b/.claude/skills/meta-edit/properties-reference.md index d3e4fa31..db9f015d 100644 --- a/.claude/skills/meta-edit/properties-reference.md +++ b/.claude/skills/meta-edit/properties-reference.md @@ -14,6 +14,16 @@ Свойство можно задать, даже если оно ещё не выставлено у объекта (например `FullTextSearch`, `DataHistory`). Опечатка в имени свойства → ошибка (правка не теряется молча). Допустимы имена свойств соответствующего типа объекта. +### Type — тип значения (Константа, ПВХ) + +`Type=...` перестраивает дескриптор типа значения. Значение — тип 1С в том же синтаксисе, +что у реквизитов: составной через `+`, с квалификаторами и ссылочными типами: +```powershell +-Operation modify-property -Value "Type=String(100) + Number(15,2) + CatalogRef.Номенклатура" +``` +Структурные свойства (со вложенными узлами) в скалярный текст не превращаются: попытка задать +такое свойство обычным `Ключ=Значение` (кроме `Type`) завершается ошибкой до записи файла. + ## Свойства-списки Свойства, значение которых — список ссылок. Управляются через inline `add-*` / `remove-*` / `set-*` и через JSON `modify.properties`. diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index e201bf20..82aff8c3 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.20 — Edit existing 1C metadata object XML (+add-predefined предопределённые Ext/Predefined.xml) +# meta-edit v1.21 — Edit existing 1C metadata object XML (+modify-property Type: структурный дескриптор, guard от порчи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -2041,6 +2041,32 @@ function Modify-Properties($propsDef) { $valueStr = if ($propValue) { "true" } else { "false" } } + # Structural value-type property (корневой у Константы, ПВХ) — + # перестроить дескриптор типа через Build-ValueTypeXml (не расплющивать в скаляр) + if ($propName -ceq "Type") { + $typeIndent = Get-ChildIndent $script:propertiesEl + $newTypeXml = Build-ValueTypeXml $typeIndent $valueStr + $newTypeNodes = Import-Fragment $newTypeXml + if ($newTypeNodes.Count -gt 0) { + # ReplaceChild сохраняет whitespace до/после узла на месте (без склейки отступов) + $script:propertiesEl.ReplaceChild($newTypeNodes[0], $propEl) | Out-Null + Info "Modified property: Type = $valueStr" + $script:modifyCount++ + } + return + } + + # Guard: не расплющивать структурное свойство (с дочерними узлами) в скалярный текст — + # это молча повредит XML. Завершаем ошибкой ДО записи файла. + $hasChildElements = $false + foreach ($ch in $propEl.ChildNodes) { + if ($ch.NodeType -eq 'Element') { $hasChildElements = $true; break } + } + if ($hasChildElements) { + Write-Error "modify-property: свойство '$propName' структурное (содержит дочерние узлы) — установка скалярного текста повредит XML; не поддерживается" + exit 1 + } + $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 34328088..1e507afb 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.20 — Edit existing 1C metadata object XML (+add-predefined предопределённые Ext/Predefined.xml) +# meta-edit v1.21 — Edit existing 1C metadata object XML (+modify-property Type: структурный дескриптор, guard от порчи) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1915,6 +1915,27 @@ def modify_properties(props_def): if isinstance(prop_value, bool): value_str = "true" if prop_value else "false" + # Structural value-type property (корневой у Константы, ПВХ) — + # перестроить дескриптор типа через build_value_type_xml (не расплющивать в скаляр) + if prop_name == "Type": + type_indent = get_child_indent(properties_el) + new_type_xml = build_value_type_xml(type_indent, value_str) + new_type_nodes = import_fragment(new_type_xml) + if new_type_nodes: + type_idx = list(properties_el).index(prop_el) + new_type_nodes[0].tail = prop_el.tail + properties_el.insert(type_idx + 1, new_type_nodes[0]) + remove_node_with_whitespace(prop_el) + info(f"Modified property: Type = {value_str}") + modify_count += 1 + continue + + # Guard: не расплющивать структурное свойство (с дочерними узлами) в скалярный текст — + # это молча повредит XML. Завершаем ошибкой ДО записи файла. + if len(list(prop_el)) > 0: + print(f"meta-edit: modify-property: свойство '{prop_name}' структурное (содержит дочерние узлы) — установка скалярного текста повредит XML; не поддерживается", file=sys.stderr) + sys.exit(1) + # Set inner text — clear children first, set text for ch in list(prop_el): prop_el.remove(ch) diff --git a/.claude/skills/meta-validate/scripts/meta-validate.ps1 b/.claude/skills/meta-validate/scripts/meta-validate.ps1 index f0b2ba66..24aab602 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.ps1 +++ b/.claude/skills/meta-validate/scripts/meta-validate.ps1 @@ -1,4 +1,4 @@ -# meta-validate v1.9 — Validate 1C metadata object structure +# meta-validate v1.10 — Validate 1C metadata object structure (+корневой : скаляр без структуры = ошибка) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -558,6 +558,26 @@ if ($propsNode) { } } + # Корневой (дескриптор типа значения — Константа, ПВХ) должен быть структурным: + # /, а не скалярный текст. Скаляр = повреждённый тип (напр. после + # старого meta-edit modify-property Type). См. issue #42. + $rootTypeEl = $propsNode.SelectSingleNode("md:Type", $ns) + if ($rootTypeEl) { + $v8Types = $rootTypeEl.SelectNodes("v8:Type", $ns) + $v8TypeSets = $rootTypeEl.SelectNodes("v8:TypeSet", $ns) + $scalarText = "" + foreach ($cn in $rootTypeEl.ChildNodes) { + if ($cn.NodeType -eq 'Text' -or $cn.NodeType -eq 'CDATA') { + $t = $cn.Value.Trim() + if ($t) { $scalarText = $t; break } + } + } + if ($v8Types.Count -eq 0 -and $v8TypeSets.Count -eq 0 -and $scalarText) { + Report-Error "4. Property содержит скалярный текст '$scalarText' без структуры типа (/) — повреждённый дескриптор типа значения" + $check4Ok = $false + } + } + if ($check4Ok) { Report-OK "4. Property values: $enumChecked enum properties checked" } diff --git a/.claude/skills/meta-validate/scripts/meta-validate.py b/.claude/skills/meta-validate/scripts/meta-validate.py index 083b201d..f1543834 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.py +++ b/.claude/skills/meta-validate/scripts/meta-validate.py @@ -1,4 +1,4 @@ -# meta-validate v1.9 — Validate 1C metadata object structure (Python port) +# meta-validate v1.10 — Validate 1C metadata object structure (Python port) (+корневой : скаляр без структуры = ошибка) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -555,6 +555,18 @@ if props_node is not None: check4_ok = False enum_checked += 1 + # Корневой (дескриптор типа значения — Константа, ПВХ) должен быть структурным: + # /, а не скалярный текст. Скаляр = повреждённый тип (напр. после + # старого meta-edit modify-property Type). См. issue #42. + root_type_el = find(props_node, "md:Type") + if root_type_el is not None: + scalar_text = inner_text(root_type_el).strip() + v8_types = find_all(root_type_el, "v8:Type") + v8_type_sets = find_all(root_type_el, "v8:TypeSet") + if len(v8_types) == 0 and len(v8_type_sets) == 0 and scalar_text: + report_error(f"4. Property содержит скалярный текст '{scalar_text}' без структуры типа (/) — повреждённый дескриптор типа значения") + check4_ok = False + if check4_ok: report_ok(f"4. Property values: {enum_checked} enum properties checked") else: diff --git a/tests/skills/cases/meta-edit/modify-property-type-pvh.json b/tests/skills/cases/meta-edit/modify-property-type-pvh.json new file mode 100644 index 00000000..d583186b --- /dev/null +++ b/tests/skills/cases/meta-edit/modify-property-type-pvh.json @@ -0,0 +1,18 @@ +{ + "name": "modify-property Type у ПВХ: составной тип строится структурно (issue #42), не расплющивается в скаляр", + "setup": "empty-config", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "ChartOfCharacteristicTypes", "name": "ДругойПВХ", "valueType": "String(10)" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "ChartOfCharacteristicTypes", "name": "ТестовыйПВХ", "valueType": "Boolean + String(20)" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "params": { "objectPath": "ChartsOfCharacteristicTypes/ТестовыйПВХ" }, + "input": { "modify": { "properties": { "Type": "Boolean + String(20) + ChartOfCharacteristicTypesRef.ДругойПВХ" } } } +} diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ДругойПВХ.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ДругойПВХ.xml new file mode 100644 index 00000000..8d7aef9b --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ДругойПВХ.xml @@ -0,0 +1,97 @@ + + + + + + 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 + false + + + xs:string + + 10 + Variable + + + false + true + 9 + Variable + 100 + WholeCharacteristicKind + true + true + AsDescription + + Auto + InDialog + false + BothWays + + ChartOfCharacteristicTypes.ДругойПВХ.StandardAttribute.Description + ChartOfCharacteristicTypes.ДругойПВХ.StandardAttribute.Code + + DontUse + Begin + Directly + DontUse + Auto + + + + + + + + + + + + + Managed + Use + + + + + + DontUse + false + false + + + + diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ДругойПВХ/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ДругойПВХ/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ТестовыйПВХ.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ТестовыйПВХ.xml new file mode 100644 index 00000000..84dd4c4f --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ТестовыйПВХ.xml @@ -0,0 +1,99 @@ + + + + + + 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 + false + + + xs:boolean + xs:string + + 20 + Variable + + d5p1:ChartOfCharacteristicTypesRef.ДругойПВХ + + false + true + 9 + Variable + 100 + WholeCharacteristicKind + true + true + AsDescription + + Auto + InDialog + false + BothWays + + ChartOfCharacteristicTypes.ТестовыйПВХ.StandardAttribute.Description + ChartOfCharacteristicTypes.ТестовыйПВХ.StandardAttribute.Code + + DontUse + Begin + Directly + DontUse + Auto + + + + + + + + + + + + + Managed + Use + + + + + + DontUse + false + false + + + + diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ТестовыйПВХ/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/ChartsOfCharacteristicTypes/ТестовыйПВХ/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/Configuration.xml new file mode 100644 index 00000000..a4cbe737 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/Configuration.xml @@ -0,0 +1,253 @@ + + + + + + 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-type-pvh/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/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-type-pvh/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-edit/snapshots/modify-property-type-pvh/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/error-scalar-root-type.json b/tests/skills/cases/meta-validate/error-scalar-root-type.json new file mode 100644 index 00000000..e91151ee --- /dev/null +++ b/tests/skills/cases/meta-validate/error-scalar-root-type.json @@ -0,0 +1,6 @@ +{ + "name": "Валидатор ловит повреждённый корневой (скалярный текст без структуры, issue #42)", + "setup": "fixture:pvh-scalar-type", + "params": { "objectPath": "ChartsOfCharacteristicTypes/СкалярныйТипПВХ.xml" }, + "expectError": true +} diff --git a/tests/skills/cases/meta-validate/fixtures/pvh-scalar-type/ChartsOfCharacteristicTypes/СкалярныйТипПВХ.xml b/tests/skills/cases/meta-validate/fixtures/pvh-scalar-type/ChartsOfCharacteristicTypes/СкалярныйТипПВХ.xml new file mode 100644 index 00000000..00acf3b7 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/pvh-scalar-type/ChartsOfCharacteristicTypes/СкалярныйТипПВХ.xml @@ -0,0 +1,91 @@ + + + + + + d9fee16f-9c75-4c72-a0ef-fa8258ebadfb + 0c1d551b-5478-4938-8529-48bb5c723883 + + + 4ce215dc-abc7-4092-bc93-d48f47df6509 + 9d118097-1ab2-4fd0-9ddd-33e4f6137cf0 + + + aee4f6a0-01f9-402a-afee-0b71735cc4e0 + 3d479bd4-f002-4a0b-8bb7-70607bafb7c5 + + + 42df357e-e764-4419-96e3-94b697a72fec + 60fe9329-bac7-4f34-9a2c-5047036388f3 + + + 2bbf0425-ca48-4511-9929-f62a59efeab8 + a8b0ad63-4778-45f0-a0fa-4910e172662b + + + d756b551-d136-494f-a1c9-d3ab85cd138b + a4d7a754-af57-4ec8-800f-5f44876b9d4d + + + + ТестовыйПВХ + + + ru + Тестовый ПВХ + + + + true + false + + Boolean + String(20) + false + true + 9 + Variable + 100 + WholeCharacteristicKind + true + true + AsDescription + + Auto + InDialog + false + BothWays + + ChartOfCharacteristicTypes.ТестовыйПВХ.StandardAttribute.Description + ChartOfCharacteristicTypes.ТестовыйПВХ.StandardAttribute.Code + + DontUse + Begin + Directly + DontUse + Auto + + + + + + + + + + + + + Managed + Use + + + + + + DontUse + false + false + + + +