mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-23 21:21:04 +03:00
feat(form-decompile,form-compile): appearance Текст/Заголовок/Формат — xs:string/Field/typed LocalString (категория картинок→текст оформления)
В значениях параметров оформления (dcsset:appearance) компилятор форсил
мультиязычный LocalStringType по имени ключа (Текст/Заголовок/Формат), теряя
плоскую xs:string и dcscor:Field. Корпус 8.3.24 (Текст/Заголовок/Формат):
xs:string 823, LocalString одноязычный 658, многоязычный 188, dcscor:Field 105.
Контекст (форменный CA vs Settings дин-списка) НЕ детерминирует (целевая форма
СправкаРасчётПостоянныхИВременныхРазниц — форменный CA с xs:string).
Решение (scoped-различие по форме значения, в этом конкретном контексте — не общая
конвенция DSL): голая строка → плоский xs:string (нелокализ. литерал; "" →
самозакрывающийся тег); объект {ru,en} → LocalStringType; объект {field:"путь"} →
dcscor:Field. Декомпилятор перестаёт схлопывать одноязычный LocalString здесь
(всегда объект-карта языков → различим от xs:string).
Заодно пред-существующий баг: LocalString-значение параметра несёт
xsi:type="v8:LocalStringType" на теге dcscor:value (846 случаев) — Emit-MLText
эмитил голый тег; добавлен опц. параметр xsiType (ps+py).
Зеркало py (байт-в-байт). Выборка 57 CA-форм (xs:string/LocalString/Field, вкл.
целевую): appearance-потерь 0, целевая → match (match 26→40). Кейс input-fields
(+CA Текст: плоский/multilang/пустой/field) сертифицирован в 1С. Регресс 43/43.
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
b781f97832
commit
459d3feb69
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.91 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.92 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -407,14 +407,26 @@ function Get-LineValue {
|
||||
return $obj
|
||||
}
|
||||
|
||||
# Прочитать <dcscor:value> в JSON-значение: Font/Line/multilang/raw text.
|
||||
# Прочитать <dcscor:value> в JSON-значение: Font/Line/Field/multilang/raw text.
|
||||
function Read-AppearanceValueNode {
|
||||
param($valNode)
|
||||
if (-not $valNode) { return $null }
|
||||
$vt = Get-LocalXsiType $valNode
|
||||
if ($vt -eq 'LocalStringType') { return (Get-MLText $valNode) }
|
||||
if ($vt -eq 'LocalStringType') {
|
||||
# НЕ схлопываем одноязычный в строку: значение параметра оформления различает
|
||||
# xs:string (плоская строка) и LocalStringType (локализуемый текст) — обе формы
|
||||
# одноязычно дают одну строку. Всегда объект-карта языков → компилятор эмитит LocalStringType.
|
||||
$map = [ordered]@{}
|
||||
foreach ($it in @($valNode.SelectNodes("v8:item", $ns))) {
|
||||
$lang = $it.SelectSingleNode("v8:lang", $ns); $content = $it.SelectSingleNode("v8:content", $ns)
|
||||
if ($lang) { $map[$lang.InnerText] = if ($content) { $content.InnerText } else { "" } }
|
||||
}
|
||||
return $map
|
||||
}
|
||||
if ($vt -eq 'Font') { return (Get-FontValue $valNode) }
|
||||
if ($vt -eq 'Line') { return (Get-LineValue $valNode) }
|
||||
# dcscor:Field — значение = ссылка на поле компоновки → объект {field:путь}
|
||||
if ($vt -eq 'Field') { return [ordered]@{ field = $valNode.InnerText } }
|
||||
return $valNode.InnerText
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user