fix(meta-edit): ключ свойства в любом регистре — в XML каноническое имя

ps1 сопоставлял ключ свойства без учёта регистра, но при создании элемента писал
тег как подан: registerRecords у заимствованного документа давал <registerRecords>,
и meta-validate его пропускал. py сравнивал точно и на том же входе отказывал.

Ключ свойства объекта и дочернего элемента теперь сводится к каноническому имени
(ключи веток modify — name/type/synonym… — впереди списка свойств), дальше в обоих
портах только оно. Попутно: py при переименовании сравнивал синоним с разбивкой
старого имени с учётом регистра и не обновлял авто-синоним «ИНН»; сравнение теперь
без учёта регистра, как в ps1.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-26 17:31:28 +03:00
co-authored by Claude Opus 5.5
parent 2fc5659b47
commit 0ff848784e
32 changed files with 2261 additions and 6 deletions
+20 -4
View File
@@ -1,4 +1,4 @@
# meta-edit v1.57 — Edit existing 1C metadata object XML
# meta-edit v1.58 — Edit existing 1C metadata object XML
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -2660,7 +2660,7 @@ function Process-Remove($removeDef) {
function Modify-Properties($propsDef) {
$propsDef.PSObject.Properties | ForEach-Object {
$propName = $_.Name
$propName = Get-CanonicalName $_.Name ($script:knownObjectProps + @($script:complexPropertyMap.Keys))
$propValue = $_.Value
# Свойство-список: наличие элемента решает Get-ListPropertyElement (тип объекта, заимствование)
@@ -2769,7 +2769,7 @@ function Modify-ChildElements($modifyDef, [string]$childType) {
}
$changes.PSObject.Properties | ForEach-Object {
$changeProp = $_.Name
$changeProp = Get-CanonicalName $_.Name ($script:childModifyKeys + $script:knownChildProps)
$changeValue = $_.Value
# TS child attribute operations (add/remove/modify attrs inside a TabularSection)
@@ -2883,7 +2883,8 @@ function Modify-ChildElements($modifyDef, [string]$childType) {
}
}
}
if ($currentSyn -eq $oldSynonym -or -not $currentSyn) {
# Без учёта регистра: авто-синоним «ИНН» против разбивки «Инн»
if ($currentSyn -ieq $oldSynonym -or -not $currentSyn) {
$newSynonym = Split-CamelCase $newName
$synXml = Build-MLTextXml (Get-ChildIndent $propsEl) "Synonym" $newSynonym
$newSynNodes = Import-Fragment $synXml
@@ -3177,6 +3178,13 @@ $script:knownChildProps = @(
'Synonym','ToolTip','Type','Use','UseInTotals'
)
# Ключи веток modify дочернего элемента в их написании. Стоят перед knownChildProps: при канонизации
# первый выигрывает, и Name уходит в ветку переименования name, а не в скалярную.
$script:childModifyKeys = @(
'add','remove','modify','name','type','synonym','Format','EditFormat','ToolTip','ChoiceForm','MinValue','MaxValue',
'LinkByType','ChoiceParameterLinks','ChoiceParameters','FillValue'
)
# Канонический порядок свойств реквизита (последовательность Build-AttributeFragment) — для вставки в позицию.
# Порядок 1С терпит (cert), но держим канонический для консистентности с meta-compile.
$script:attrPropOrder = @(
@@ -3565,6 +3573,14 @@ function Build-FillValueExplicitXml([string]$typeStr, $spec) {
return "<FillValue xsi:type=`"$($r.XsiType)`">$(Esc-XmlText $r.Text)</FillValue>"
}
# Прощающий ввод: ключ свойства в любом регистре сводим к каноническому имени из списка (первое
# совпадение без учёта регистра). Дальше работаем только с ним — в XML уходит имя тега, а не
# написание из входа. Неизвестное возвращается как есть — его отвергнет allowlist.
function Get-CanonicalName([string]$name, [string[]]$canon) {
foreach ($c in $canon) { if ($c -eq $name) { return $c } }
return $name
}
function Find-PropertyElement([string]$propName) {
foreach ($child in $script:propertiesEl.ChildNodes) {
if ($child.NodeType -eq 'Element' -and $child.LocalName -eq $propName) {