mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-27 20:45:54 +03:00
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:
co-authored by
Claude Opus 5.5
parent
2fc5659b47
commit
0ff848784e
@@ -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) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# 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
|
||||
|
||||
import argparse
|
||||
@@ -2580,6 +2580,7 @@ def modify_properties(props_def):
|
||||
global modify_count
|
||||
|
||||
for prop_name, prop_value in props_def.items():
|
||||
prop_name = canonical_name(prop_name, list(known_object_props) + list(complex_property_map))
|
||||
# Свойство-список: наличие элемента решает get_list_property_element (тип объекта, заимствование)
|
||||
if prop_name in complex_property_map:
|
||||
values_list = []
|
||||
@@ -2670,6 +2671,7 @@ def modify_child_elements(modify_def, child_type):
|
||||
die(f"{xml_tag} '{elem_name}': no Properties element found")
|
||||
|
||||
for change_prop, change_value in changes.items():
|
||||
change_prop = canonical_name(change_prop, child_modify_keys + list(known_child_props))
|
||||
# TS child attribute operations (add/remove/modify attrs inside a TabularSection)
|
||||
if xml_tag == "TabularSection" and change_prop in ("add", "remove", "modify"):
|
||||
# Find ChildObjects inside this TS element
|
||||
@@ -2759,7 +2761,8 @@ def modify_child_elements(modify_def, child_type):
|
||||
for gc in item_el:
|
||||
if localname(gc) == "content":
|
||||
current_syn = (gc.text or "").strip()
|
||||
if current_syn == old_synonym or not current_syn:
|
||||
# Без учёта регистра: авто-синоним «ИНН» против разбивки «Инн» (так в PS-мастере)
|
||||
if current_syn.lower() == old_synonym.lower() or not current_syn:
|
||||
new_synonym = split_camel_case(new_name)
|
||||
syn_indent = get_child_indent(props_el)
|
||||
new_syn_xml = build_mltext_xml(syn_indent, "Synonym", new_synonym)
|
||||
@@ -3021,6 +3024,13 @@ known_object_props = {
|
||||
}
|
||||
|
||||
# Известные свойства дочерних элементов (union Attribute/Dimension/Resource) — allowlist default-ветки modify-child.
|
||||
# Ключи веток modify дочернего элемента в их написании. Стоят перед known_child_props: при канонизации
|
||||
# первый выигрывает, и Name уходит в ветку переименования name, а не в скалярную.
|
||||
child_modify_keys = [
|
||||
"add", "remove", "modify", "name", "type", "synonym", "Format", "EditFormat", "ToolTip", "ChoiceForm", "MinValue",
|
||||
"MaxValue", "LinkByType", "ChoiceParameterLinks", "ChoiceParameters", "FillValue",
|
||||
]
|
||||
|
||||
known_child_props = {
|
||||
'AccountingFlag', 'Balance', 'BaseDimension', 'ChoiceFoldersAndItems', 'ChoiceForm', 'ChoiceHistoryOnInput',
|
||||
'ChoiceParameterLinks', 'ChoiceParameters', 'Comment', 'CreateOnInput', 'DataHistory', 'DenyIncompleteValues',
|
||||
@@ -3500,6 +3510,17 @@ def build_fill_value_explicit_xml(type_str, spec):
|
||||
return f'<FillValue xsi:type="{r["XsiType"]}">{esc_xml_text(r["Text"])}</FillValue>'
|
||||
|
||||
|
||||
# Прощающий ввод: ключ свойства в любом регистре сводим к каноническому имени из списка (первое
|
||||
# совпадение без учёта регистра). Дальше работаем только с ним — в XML уходит имя тега, а не
|
||||
# написание из входа. Неизвестное возвращается как есть — его отвергнет allowlist.
|
||||
def canonical_name(name, canon):
|
||||
low = name.lower()
|
||||
for c in canon:
|
||||
if c.lower() == low:
|
||||
return c
|
||||
return name
|
||||
|
||||
|
||||
def find_property_element(prop_name):
|
||||
for child in properties_el:
|
||||
if localname(child) == prop_name:
|
||||
|
||||
Reference in New Issue
Block a user