diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1
index a6b2ed0c..715c0425 100644
--- a/.claude/skills/skd-compile/scripts/skd-compile.ps1
+++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1
@@ -1,4 +1,4 @@
-# skd-compile v1.54 — Compile 1C DCS from JSON
+# skd-compile v1.55 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$DefinitionFile,
@@ -720,6 +720,11 @@ $script:outputParamTypes = @{
"РасположениеРеквизитов" = "dcsset:DataCompositionAttributesPlacement"
"ГоризонтальноеРасположениеОбщихИтогов" = "dcscor:DataCompositionTotalPlacement"
"ВертикальноеРасположениеОбщихИтогов" = "dcscor:DataCompositionTotalPlacement"
+ "РасположениеОбщихИтогов" = "dcscor:DataCompositionTotalPlacement"
+ "РасположениеИтогов" = "dcscor:DataCompositionTotalPlacement"
+ "РасположениеГруппировки" = "dcsset:DataCompositionFieldGroupPlacement"
+ "РасположениеРесурсов" = "dcsset:DataCompositionResourcesPlacement"
+ "ТипМакета" = "dcsset:DataCompositionGroupTemplateType"
}
# --- 11. Emit sections ---
@@ -2177,13 +2182,31 @@ function Emit-AppearanceValue {
Emit-MLText -tag "dcscor:value" -text $innerVal -indent "$indent`t"
} else {
$actualVal = "$innerVal"
- if ($actualVal -match '^(style|web|win):') {
+ # Параметр-специфичный тип для известных appearance keys
+ $keyTypeMap = @{
+ 'Размещение' = 'dcscor:DataCompositionTextPlacementType'
+ 'ГоризонтальноеПоложение' = 'v8ui:HorizontalAlign'
+ 'ВертикальноеПоложение' = 'v8ui:VerticalAlign'
+ 'ОриентацияТекста' = 'xs:decimal'
+ 'РасположениеИтогов' = 'dcscor:DataCompositionTotalPlacement'
+ 'ТипМакета' = 'dcsset:DataCompositionGroupTemplateType'
+ }
+ $keyType = $keyTypeMap[$key]
+ if ($keyType) {
+ X "$indent`t$(Esc-Xml $actualVal)"
+ } elseif ($actualVal -match '^(style|web|win):') {
X "$indent`t$(Esc-Xml $actualVal)"
} elseif ($actualVal -eq "true" -or $actualVal -eq "false") {
X "$indent`t$actualVal"
} elseif ($key -eq "Текст" -or $key -eq "Заголовок" -or $key -eq "Формат") {
# Строковые ключи, традиционно эмитятся как LocalStringType (даже если только ru).
Emit-MLText -tag "dcscor:value" -text $actualVal -indent "$indent`t"
+ } elseif ($actualVal -match '^-?\d+(\.\d+)?$') {
+ # Number → xs:decimal (МинимальнаяШирина=40, ОриентацияТекста и т.п. — но не key-typed)
+ X "$indent`t$actualVal"
+ } elseif ($key -eq 'ЦветТекста' -or $key -eq 'ЦветФона' -or $key -eq 'ЦветГраницы') {
+ # Color без явного префикса (auto, #FFC8C8)
+ X "$indent`t$(Esc-Xml $actualVal)"
} else {
X "$indent`t$(Esc-Xml $actualVal)"
}
diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py
index 80b4e409..aa9550d7 100644
--- a/.claude/skills/skd-compile/scripts/skd-compile.py
+++ b/.claude/skills/skd-compile/scripts/skd-compile.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# skd-compile v1.54 — Compile 1C DCS from JSON
+# skd-compile v1.55 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import json
@@ -544,6 +544,11 @@ OUTPUT_PARAM_TYPES = {
"\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0420\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432": "dcsset:DataCompositionAttributesPlacement",
"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u041e\u0431\u0449\u0438\u0445\u0418\u0442\u043e\u0433\u043e\u0432": "dcscor:DataCompositionTotalPlacement",
"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u041e\u0431\u0449\u0438\u0445\u0418\u0442\u043e\u0433\u043e\u0432": "dcscor:DataCompositionTotalPlacement",
+ "\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u041e\u0431\u0449\u0438\u0445\u0418\u0442\u043e\u0433\u043e\u0432": "dcscor:DataCompositionTotalPlacement",
+ "\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0418\u0442\u043e\u0433\u043e\u0432": "dcscor:DataCompositionTotalPlacement",
+ "\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438": "dcsset:DataCompositionFieldGroupPlacement",
+ "\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0420\u0435\u0441\u0443\u0440\u0441\u043e\u0432": "dcsset:DataCompositionResourcesPlacement",
+ "\u0422\u0438\u043f\u041c\u0430\u043a\u0435\u0442\u0430": "dcsset:DataCompositionGroupTemplateType",
}
@@ -1823,13 +1828,28 @@ def emit_appearance_value(lines, key, val, indent):
emit_mltext(lines, f'{indent}\t', 'dcscor:value', inner_val)
else:
actual_val = str(inner_val) if inner_val is not None else ''
- if re.match(r'^(style|web|win):', actual_val):
+ # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 appearance keys
+ key_type_map = {
+ '\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435': 'dcscor:DataCompositionTextPlacementType',
+ '\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435': 'v8ui:HorizontalAlign',
+ '\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435': 'v8ui:VerticalAlign',
+ '\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0422\u0435\u043a\u0441\u0442\u0430': 'xs:decimal',
+ '\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0418\u0442\u043e\u0433\u043e\u0432': 'dcscor:DataCompositionTotalPlacement',
+ '\u0422\u0438\u043f\u041c\u0430\u043a\u0435\u0442\u0430': 'dcsset:DataCompositionGroupTemplateType',
+ }
+ key_type = key_type_map.get(key)
+ if key_type:
+ lines.append(f'{indent}\t{esc_xml(actual_val)}')
+ elif re.match(r'^(style|web|win):', actual_val):
lines.append(f'{indent}\t{esc_xml(actual_val)}')
elif actual_val == 'true' or actual_val == 'false':
lines.append(f'{indent}\t{actual_val}')
elif key in ('\u0422\u0435\u043a\u0441\u0442', '\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a', '\u0424\u043e\u0440\u043c\u0430\u0442'):
- # \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u044d\u043c\u0438\u0442\u044f\u0442\u0441\u044f \u043a\u0430\u043a LocalStringType (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e ru).
emit_mltext(lines, f'{indent}\t', 'dcscor:value', actual_val)
+ elif re.match(r'^-?\d+(\.\d+)?$', actual_val):
+ lines.append(f'{indent}\t{actual_val}')
+ elif key in ('\u0426\u0432\u0435\u0442\u0422\u0435\u043a\u0441\u0442\u0430', '\u0426\u0432\u0435\u0442\u0424\u043e\u043d\u0430', '\u0426\u0432\u0435\u0442\u0413\u0440\u0430\u043d\u0438\u0446\u044b'):
+ lines.append(f'{indent}\t{esc_xml(actual_val)}')
else:
lines.append(f'{indent}\t{esc_xml(actual_val)}')
lines.append(f'{indent}')
diff --git a/tests/skills/cases/skd-compile/snapshots/field-appearance-and-presentation/Template.xml b/tests/skills/cases/skd-compile/snapshots/field-appearance-and-presentation/Template.xml
index 4593b927..5262dd2a 100644
--- a/tests/skills/cases/skd-compile/snapshots/field-appearance-and-presentation/Template.xml
+++ b/tests/skills/cases/skd-compile/snapshots/field-appearance-and-presentation/Template.xml
@@ -32,7 +32,7 @@
МинимальнаяШирина
- 100
+ 100
РастягиватьПоГоризонтали
diff --git a/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/Template.xml b/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/Template.xml
index 793154ab..9490cb32 100644
--- a/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/Template.xml
+++ b/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/Template.xml
@@ -111,7 +111,7 @@
МинимальнаяШирина
- 80
+ 80