fix(meta-edit): канонизация значений свойств-перечислений

modify-property писал значение свойства объекта в XML как есть: и "обороты", и
"turnovers", и "ЧтоУгодно". Навык печатал Modified: 1 и оставлял выгрузку,
которую платформа не примет. Расхождения портов тут не было — оба вели себя
одинаково, поэтому кампания паритета это не ловила.

Значение теперь проходит через normalize_enum_value — ту же функцию, что уже
применялась к свойствам реквизитов: алиас и регистр приводятся к канону,
неизвестное значение отвергается с перечислением допустимых ДО записи файла.
Поведение сведено к meta-compile, который так работает давно.

Словарь алиасов в meta-edit обёрнут в CIDict: без этого правка сделала бы хуже
— "обороты" строчными не нашли бы ключ "Обороты" и получили бы отказ вместо
прежней тихой записи.

check-inline-drift: заведена семья normalize_enum_value (тела в обоих портах
совпадают побайтово, эталон meta-compile). Списки значений по-прежнему держит
check-enum-drift, новых ключей не заводили.

Проверка: два кейса (синоним → канон в эталоне; мусор → expectError), 685/685
на PS и 682+3 skipped на PY, гарды 4/4. Платформенно: синтетический регистр,
правка через meta-edit, загрузка в 8.3.27 и обратная выгрузка — платформа
вернула Turnovers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-09 21:16:07 +03:00
co-authored by Claude Opus 5
parent 5baece90d6
commit 50bc9f5c0a
10 changed files with 596 additions and 2 deletions
@@ -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++
@@ -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)