mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-14 18:04:58 +03:00
feat(form-decompile,form-compile): формат и формат редактирования (Format/EditFormat)
Ключи format/editFormat на InputField/LabelField/CheckBoxField (1408/958
файлов в корпусе). LocalStringType как inputHint/title: строка или {ru,en} —
переиспользование Emit-MLText (компилятор) и Get-LangText (декомпилятор).
Декомпилятор: хелпер Add-FormatProps в 3 ветках. Зеркало py.
Round-trip чистый (0 остатка на 30 формах с Format/EditFormat). Кейс
input-fields: format/editFormat строкой на input/check + мультиязык-объект
на labelField; снэпшот сертифицирован загрузкой в 1С.
Заодно добавлены забытые ключи (format/editFormat/choiceParameters/
choiceParameterLinks/typeLink) в allowlist knownKeys (ps1+py), чтобы не
сыпать ложный warning «unknown key».
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.71 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.72 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -2439,6 +2439,7 @@ function Emit-Element {
|
||||
"wrap"=1;"openButton"=1;"listChoiceMode"=1;"showInFooter"=1
|
||||
"extendedEditMultipleValues"=1;"chooseType"=1;"autoCellHeight"=1
|
||||
"choiceButtonRepresentation"=1;"footerHorizontalAlign"=1;"headerHorizontalAlign"=1
|
||||
"format"=1;"editFormat"=1;"choiceParameters"=1;"choiceParameterLinks"=1;"typeLink"=1
|
||||
# label/hyperlink
|
||||
"hyperlink"=1;"formatted"=1
|
||||
# group-specific
|
||||
@@ -2938,6 +2939,10 @@ function Emit-Input {
|
||||
Emit-MLText -tag "InputHint" -text $el.inputHint -indent $inner
|
||||
}
|
||||
|
||||
# Формат / формат редактирования (LocalStringType — строка или {ru,en})
|
||||
if ($el.format) { Emit-MLText -tag "Format" -text $el.format -indent $inner }
|
||||
if ($el.editFormat) { Emit-MLText -tag "EditFormat" -text $el.editFormat -indent $inner }
|
||||
|
||||
Emit-ChoiceList -el $el -indent $inner
|
||||
|
||||
# Связи по типу / связи параметров выбора / параметры выбора
|
||||
@@ -2982,6 +2987,10 @@ function Emit-Check {
|
||||
|
||||
Emit-Layout -el $el -indent $inner
|
||||
|
||||
# Формат / формат редактирования (LocalStringType — строка или {ru,en})
|
||||
if ($el.format) { Emit-MLText -tag "Format" -text $el.format -indent $inner }
|
||||
if ($el.editFormat) { Emit-MLText -tag "EditFormat" -text $el.editFormat -indent $inner }
|
||||
|
||||
# Оформление (цвета/шрифты/граница) — перед компаньонами
|
||||
Emit-Appearance -el $el -indent $inner -profile 'field'
|
||||
|
||||
@@ -3448,6 +3457,10 @@ function Emit-LabelField {
|
||||
if ($el.hyperlink -eq $true) { X "$inner<Hiperlink>true</Hiperlink>" }
|
||||
Emit-Layout -el $el -indent $inner
|
||||
|
||||
# Формат / формат редактирования (LocalStringType — строка или {ru,en})
|
||||
if ($el.format) { Emit-MLText -tag "Format" -text $el.format -indent $inner }
|
||||
if ($el.editFormat) { Emit-MLText -tag "EditFormat" -text $el.editFormat -indent $inner }
|
||||
|
||||
# Оформление (цвета/шрифты/граница + header/footer) — перед компаньонами
|
||||
Emit-Appearance -el $el -indent $inner -profile 'field'
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.71 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.72 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import copy
|
||||
@@ -1775,6 +1775,7 @@ KNOWN_KEYS = {
|
||||
"wrap", "openButton", "listChoiceMode", "showInHeader", "showInFooter",
|
||||
"extendedEditMultipleValues", "chooseType", "autoCellHeight",
|
||||
"choiceButtonRepresentation", "footerHorizontalAlign", "headerHorizontalAlign",
|
||||
"format", "editFormat", "choiceParameters", "choiceParameterLinks", "typeLink",
|
||||
"hyperlink", "formatted",
|
||||
"showTitle", "united", "collapsed", "behavior",
|
||||
"children", "columns",
|
||||
@@ -3008,6 +3009,12 @@ def emit_input(lines, el, name, eid, indent):
|
||||
if el.get('inputHint'):
|
||||
emit_mltext(lines, inner, 'InputHint', el['inputHint'])
|
||||
|
||||
# Формат / формат редактирования (LocalStringType — строка или {ru,en})
|
||||
if el.get('format'):
|
||||
emit_mltext(lines, inner, 'Format', el['format'])
|
||||
if el.get('editFormat'):
|
||||
emit_mltext(lines, inner, 'EditFormat', el['editFormat'])
|
||||
|
||||
emit_choice_list(lines, el, inner)
|
||||
|
||||
# Связи по типу / связи параметров выбора / параметры выбора
|
||||
@@ -3052,6 +3059,12 @@ def emit_check(lines, el, name, eid, indent):
|
||||
|
||||
emit_layout(lines, el, inner)
|
||||
|
||||
# Формат / формат редактирования (LocalStringType — строка или {ru,en})
|
||||
if el.get('format'):
|
||||
emit_mltext(lines, inner, 'Format', el['format'])
|
||||
if el.get('editFormat'):
|
||||
emit_mltext(lines, inner, 'EditFormat', el['editFormat'])
|
||||
|
||||
# Оформление (цвета/шрифты/граница) — перед компаньонами
|
||||
emit_appearance(lines, el, inner, 'field')
|
||||
|
||||
@@ -3159,6 +3172,12 @@ def emit_label_field(lines, el, name, eid, indent):
|
||||
lines.append(f'{inner}<Hiperlink>true</Hiperlink>')
|
||||
emit_layout(lines, el, inner)
|
||||
|
||||
# Формат / формат редактирования (LocalStringType — строка или {ru,en})
|
||||
if el.get('format'):
|
||||
emit_mltext(lines, inner, 'Format', el['format'])
|
||||
if el.get('editFormat'):
|
||||
emit_mltext(lines, inner, 'EditFormat', el['editFormat'])
|
||||
|
||||
# Оформление (цвета/шрифты/граница + header/footer) — перед компаньонами
|
||||
emit_appearance(lines, el, inner, 'field')
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.49 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.50 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -1249,6 +1249,13 @@ function Decompile-TypeLink {
|
||||
return $o
|
||||
}
|
||||
|
||||
# Захват <Format>/<EditFormat> (LocalStringType) → format/editFormat (строка или {ru,en}).
|
||||
function Add-FormatProps {
|
||||
param($obj, $node)
|
||||
$fmt = $node.SelectSingleNode("lf:Format", $ns); if ($fmt) { $t = Get-LangText $fmt; if ($null -ne $t -and $t -ne '') { $obj['format'] = $t } }
|
||||
$efmt = $node.SelectSingleNode("lf:EditFormat", $ns); if ($efmt) { $t = Get-LangText $efmt; if ($null -ne $t -and $t -ne '') { $obj['editFormat'] = $t } }
|
||||
}
|
||||
|
||||
function Decompile-Element {
|
||||
param($node)
|
||||
$tag = $node.LocalName
|
||||
@@ -1315,6 +1322,7 @@ function Decompile-Element {
|
||||
}
|
||||
$cbr = Get-Child $node 'ChoiceButtonRepresentation'; if ($cbr) { $obj['choiceButtonRepresentation'] = $cbr }
|
||||
$cl = Decompile-ChoiceList $node; if ($cl) { $obj['choiceList'] = $cl }
|
||||
Add-FormatProps $obj $node
|
||||
# Параметры выбора / Связи параметров выбора / Связь по типу
|
||||
$cp = Decompile-ChoiceParameters $node; if ($cp) { $obj['choiceParameters'] = $cp }
|
||||
$cpl = Decompile-ChoiceParameterLinks $node; if ($cpl) { $obj['choiceParameterLinks'] = $cpl }
|
||||
@@ -1330,6 +1338,7 @@ function Decompile-Element {
|
||||
if ($null -eq $cbt) { $obj['checkBoxType'] = '' }
|
||||
elseif ($cbt -ne 'Auto') { $obj['checkBoxType'] = $cbt.Substring(0,1).ToLower() + $cbt.Substring(1) }
|
||||
Add-TitleLocation $obj $node 'Right'
|
||||
Add-FormatProps $obj $node
|
||||
}
|
||||
'RadioButtonField' {
|
||||
$obj[$key] = $name
|
||||
@@ -1356,6 +1365,7 @@ function Decompile-Element {
|
||||
$em = Get-Child $node 'EditMode'; if ($em) { $obj['editMode'] = $em }
|
||||
# LabelField: тег <Hiperlink> (опечатка платформы), не <Hyperlink>
|
||||
if ((Get-Child $node 'Hiperlink') -eq 'true') { $obj['hyperlink'] = $true }
|
||||
Add-FormatProps $obj $node
|
||||
}
|
||||
'PictureDecoration' {
|
||||
$obj[$key] = $name
|
||||
|
||||
@@ -352,6 +352,8 @@ companion-панели с собственным контентом. Оба не
|
||||
| `skipOnInput` | bool | Пропускать при вводе |
|
||||
| `inputHint` | string | Подсказка ввода (placeholder) |
|
||||
| `choiceList` | array | Список выбора: массив `{ value, presentation?/title? }` — та же грамматика, что у `radio` (см. ниже) |
|
||||
| `format` | string/object | Формат значения (`<Format>`). Строка форматной строки 1С (`ЧДЦ=2`, `ДЛФ=D`, `БЛ=Нет; БИ=Да`) или мультиязык `{ru, en}`. Так же у `labelField` и `check` |
|
||||
| `editFormat` | string/object | Формат редактирования (`<EditFormat>`). Та же грамматика, что `format` |
|
||||
| `wrap` | bool | Перенос по словам (`<Wrap>`) |
|
||||
| `openButton` | bool | Кнопка открытия (`<OpenButton>`) |
|
||||
| `listChoiceMode` | bool | Режим выбора из списка (`<ListChoiceMode>`) |
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
"input": {
|
||||
"title": "Поля ввода",
|
||||
"elements": [
|
||||
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "tooltip": "Введите значение поля", "tooltipRepresentation": "ShowBottom", "editMode": "EnterOnInput", "horizontalStretch": false, "verticalStretch": false },
|
||||
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "titleLocation": "left", "hyperlink": true },
|
||||
{ "input": "ОбычноеПоле", "path": "ОбычноеПоле", "title": "Обычное поле", "tooltip": "Введите значение поля", "tooltipRepresentation": "ShowBottom", "editMode": "EnterOnInput", "horizontalStretch": false, "verticalStretch": false, "format": "ЧДЦ=2", "editFormat": "ЧДЦ=2; ЧН=" },
|
||||
{ "labelField": "Ссылка", "path": "ОбычноеПоле", "titleLocation": "left", "hyperlink": true, "format": { "ru": "ДЛФ=D", "en": "DLF=D" } },
|
||||
{ "input": "МногострочноеПоле", "path": "МногострочноеПоле", "multiLine": true, "height": 5, "title": "Комментарий", "wrap": false, "showInHeader": false, "showInFooter": false, "autoCellHeight": true, "footerHorizontalAlign": "Right", "openButton": false, "chooseType": false },
|
||||
{ "input": "ПолеПароля", "path": "ПолеПароля", "passwordMode": true, "title": "Пароль" },
|
||||
{ "input": "ПолеСКнопками", "path": "ПолеСКнопками", "choiceButton": true, "clearButton": true, "title": "Выбор" },
|
||||
@@ -48,7 +48,7 @@
|
||||
{ "check": "Флаг", "path": "Флаг", "title": "Включено" },
|
||||
{ "check": "ФлагПлатформенный", "path": "ФлагПлатформенный", "title": "Слева", "titleLocation": "" },
|
||||
{ "check": "ФлагЯвный", "path": "ФлагЯвный", "title": "Сверху", "titleLocation": "top" },
|
||||
{ "check": "ФлагТумблер", "path": "ФлагТумблер", "title": "Тумблер", "checkBoxType": "switcher" }
|
||||
{ "check": "ФлагТумблер", "path": "ФлагТумблер", "title": "Тумблер", "checkBoxType": "switcher", "format": "БЛ=Нет; БИ=Да" }
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "DataProcessorObject.ПоляВвода", "main": true },
|
||||
|
||||
+28
@@ -27,6 +27,18 @@
|
||||
<EditMode>EnterOnInput</EditMode>
|
||||
<HorizontalStretch>false</HorizontalStretch>
|
||||
<VerticalStretch>false</VerticalStretch>
|
||||
<Format>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>ЧДЦ=2</v8:content>
|
||||
</v8:item>
|
||||
</Format>
|
||||
<EditFormat>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>ЧДЦ=2; ЧН=</v8:content>
|
||||
</v8:item>
|
||||
</EditFormat>
|
||||
<ContextMenu name="ОбычноеПолеКонтекстноеМеню" id="2"/>
|
||||
<ExtendedTooltip name="ОбычноеПолеРасширеннаяПодсказка" id="3"/>
|
||||
</InputField>
|
||||
@@ -34,6 +46,16 @@
|
||||
<DataPath>ОбычноеПоле</DataPath>
|
||||
<TitleLocation>Left</TitleLocation>
|
||||
<Hiperlink>true</Hiperlink>
|
||||
<Format>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>ДЛФ=D</v8:content>
|
||||
</v8:item>
|
||||
<v8:item>
|
||||
<v8:lang>en</v8:lang>
|
||||
<v8:content>DLF=D</v8:content>
|
||||
</v8:item>
|
||||
</Format>
|
||||
<ContextMenu name="СсылкаКонтекстноеМеню" id="5"/>
|
||||
<ExtendedTooltip name="СсылкаРасширеннаяПодсказка" id="6"/>
|
||||
</LabelField>
|
||||
@@ -323,6 +345,12 @@
|
||||
</Title>
|
||||
<CheckBoxType>Switcher</CheckBoxType>
|
||||
<TitleLocation>Right</TitleLocation>
|
||||
<Format>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>БЛ=Нет; БИ=Да</v8:content>
|
||||
</v8:item>
|
||||
</Format>
|
||||
<ContextMenu name="ФлагТумблерКонтекстноеМеню" id="38"/>
|
||||
<ExtendedTooltip name="ФлагТумблерРасширеннаяПодсказка" id="39"/>
|
||||
</CheckBoxField>
|
||||
|
||||
Reference in New Issue
Block a user