mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-04 18:50:23 +03:00
feat(form-decompile,form-compile): choiceList значение — DesignTimeRef по GUID + nil
Значение элемента <ChoiceList> (InputField/RadioButtonField): (1) <Value xsi:type="xr:DesignTimeRef">GUID.GUID</Value> — ссылка по метаданным-GUID (raw, не по имени) эмитилась как xs:string: декомпилятор исключал DesignTimeRef из valueType (расчёт на авто-детект компилятора), но Normalize-ChoiceValue детектит только named-ссылки (Enum.X.Y), GUID.GUID → xs:string. Фикс: декомпилятор сохраняет valueType="xr:DesignTimeRef" при значении-GUID (по префиксу GUID); named-ссылки по-прежнему авто-детектятся. (2) <Value xsi:nil="true"/> — nil-значение варианта эмитилось как typed-empty xs:string (Convert-TypedValue пустого nil-узла → ""). Фикс: декомпилятор ставит valueType="nil", компилятор эмитит <Value xsi:nil="true"/>. Зеркало py. Выборка 15 форм (ИндексацияЗаработка/ФормаДокумента, РассылкиОтчетов, …): match 13→15 целевых (остаток 2 формы — отдельный кластер dcsset:left булев-литерал). ps1==py байт-в-байт. Регресс 43/43. Spec обновлён (choiceList valueType nil/DesignTimeRef). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
8465bbc82e
commit
2d326c99a5
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.132 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.133 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -1677,12 +1677,20 @@ function Decompile-ChoiceList {
|
||||
$presNode = $it.SelectSingleNode("xr:Value/lf:Presentation", $ns)
|
||||
$ci = [ordered]@{}
|
||||
if ($valNode) {
|
||||
$xsiType = $valNode.GetAttribute("type", $NS_XSI)
|
||||
$ci['value'] = Convert-TypedValue $valNode.InnerText $xsiType
|
||||
# Системное перечисление (ent:*) / иной не-примитивный, не-DesignTimeRef тип → сохраняем
|
||||
# valueType (Normalize-ChoiceValue в компиляторе вывела бы xs:string и потеряла тип).
|
||||
if ($xsiType -and $xsiType -notmatch '^xs:(string|decimal|boolean|dateTime)$' -and $xsiType -ne 'xr:DesignTimeRef') {
|
||||
$ci['valueType'] = $xsiType
|
||||
if ($valNode.GetAttribute("nil", $NS_XSI) -eq 'true') {
|
||||
# nil-значение элемента choiceList — компилятор эмитит <Value xsi:nil="true"/>
|
||||
# (иначе Convert-TypedValue вернул бы "" → typed-empty xs:string).
|
||||
$ci['valueType'] = 'nil'
|
||||
} else {
|
||||
$xsiType = $valNode.GetAttribute("type", $NS_XSI)
|
||||
$ci['value'] = Convert-TypedValue $valNode.InnerText $xsiType
|
||||
# Системное перечисление (ent:*) / иной не-примитивный тип → сохраняем valueType
|
||||
# (Normalize-ChoiceValue вывела бы xs:string). DesignTimeRef обычно авто-детектится
|
||||
# компилятором по named-ref (Enum.X.Y), НО raw-ссылка по GUID (GUID.GUID) — нет → сохраняем.
|
||||
if ($xsiType -and $xsiType -notmatch '^xs:(string|decimal|boolean|dateTime)$' -and `
|
||||
($xsiType -ne 'xr:DesignTimeRef' -or "$($valNode.InnerText)" -match '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-')) {
|
||||
$ci['valueType'] = $xsiType
|
||||
}
|
||||
}
|
||||
}
|
||||
# Presentation: непустой → текст/мультиязык; пустой <Presentation/> → "" — суппресс-маркер,
|
||||
|
||||
Reference in New Issue
Block a user