diff --git a/.claude/skills/skd-compile/SKILL.md b/.claude/skills/skd-compile/SKILL.md index 25c950a5..ab902fdc 100644 --- a/.claude/skills/skd-compile/SKILL.md +++ b/.claude/skills/skd-compile/SKILL.md @@ -88,6 +88,8 @@ powershell.exe -NoProfile -File .claude/skills/skd-compile/scripts/skd-compile.p Типы: `string`, `string(N)`, `decimal(D,F)`, `boolean`, `date`, `dateTime`, `CatalogRef.X`, `DocumentRef.X`, `EnumRef.X`, `StandardPeriod`. Ссылочные типы эмитируются с inline namespace `d5p1:` (`http://v8.1c.ru/8.1/data/enterprise/current-config`). Сборка EPF со ссылочными типами требует базу с соответствующей конфигурацией. +Составной тип (несколько типов значений) — массив в объектной форме: `"type": ["CatalogRef.A", "CatalogRef.B"]`. Квалификаторы (`(N)`, `(D,F)`) применяются к каждому элементу. + **Синонимы типов** (русские и альтернативные): `число` = decimal, `строка` = string, `булево` = boolean, `дата` = date, `датаВремя` = dateTime, `СтандартныйПериод` = StandardPeriod, `СправочникСсылка.X` = CatalogRef.X, `ДокументСсылка.X` = DocumentRef.X, `int`/`number` = decimal, `bool` = boolean. Регистронезависимые. Роли: `@dimension`, `@account`, `@balance`, `@period`. diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index 4c77170b..1f95d0a9 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.19 — Compile 1C DCS from JSON +# skd-compile v1.20 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -179,6 +179,20 @@ function Resolve-TypeStr { } function Emit-ValueType { + param($typeStr, [string]$indent) + + if (-not $typeStr) { return } + + # Multi-type: iterate and emit each type with its qualifiers + if ($typeStr -is [array] -or $typeStr -is [System.Collections.IList]) { + foreach ($t in $typeStr) { Emit-SingleValueType -typeStr "$t" -indent $indent } + return + } + + Emit-SingleValueType -typeStr "$typeStr" -indent $indent +} + +function Emit-SingleValueType { param([string]$typeStr, [string]$indent) if (-not $typeStr) { return } @@ -597,7 +611,13 @@ function Emit-Field { dataPath = if ($fieldDef.dataPath) { "$($fieldDef.dataPath)" } elseif ($fieldDef.field) { "$($fieldDef.field)" } else { "" } field = if ($fieldDef.field) { "$($fieldDef.field)" } else { "$($fieldDef.dataPath)" } title = if ($fieldDef.title) { "$($fieldDef.title)" } else { "" } - type = if ($fieldDef.type) { Resolve-TypeStr "$($fieldDef.type)" } else { "" } + type = if ($fieldDef.type) { + if ($fieldDef.type -is [array] -or $fieldDef.type -is [System.Collections.IList]) { + @($fieldDef.type | ForEach-Object { Resolve-TypeStr "$_" }) + } else { + Resolve-TypeStr "$($fieldDef.type)" + } + } else { "" } roles = @() restrict = @() appearance = [ordered]@{} diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 55798a20..67ecec32 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.19 — Compile 1C DCS from JSON +# skd-compile v1.20 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -115,7 +115,20 @@ def resolve_type_str(type_str): return type_str -def emit_value_type(lines, type_str, indent): +def emit_value_type(lines, type_spec, indent): + if not type_spec: + return + + # Multi-type: iterate and emit each type with its qualifiers + if isinstance(type_spec, list): + for t in type_spec: + emit_single_value_type(lines, str(t), indent) + return + + emit_single_value_type(lines, str(type_spec), indent) + + +def emit_single_value_type(lines, type_str, indent): if not type_str: return @@ -484,7 +497,11 @@ def emit_field(lines, field_def, indent): 'dataPath': str(field_def.get('dataPath', '')) or str(field_def.get('field', '')), 'field': str(field_def.get('field', '')) or str(field_def.get('dataPath', '')), 'title': str(field_def.get('title', '')) if field_def.get('title') else '', - 'type': resolve_type_str(str(field_def['type'])) if field_def.get('type') else '', + 'type': ( + [resolve_type_str(str(t)) for t in field_def['type']] + if isinstance(field_def['type'], list) + else resolve_type_str(str(field_def['type'])) + ) if field_def.get('type') else '', 'roles': [], 'restrict': [], 'appearance': {}, diff --git a/tests/skills/cases/skd-compile/field-multi-type.json b/tests/skills/cases/skd-compile/field-multi-type.json new file mode 100644 index 00000000..49ad75d9 --- /dev/null +++ b/tests/skills/cases/skd-compile/field-multi-type.json @@ -0,0 +1,26 @@ +{ + "name": "Составной тип поля (multi-type valueType)", + "params": { "outputPath": "Template.xml" }, + "input": { + "dataSets": [{ + "name": "ЖурналОшибок", + "objectName": "ЖурналОшибок", + "fields": [ + { "field": "ТекстСообщения", "title": "Текст сообщения", "type": "string(150)" }, + { + "field": "Расшифровка", + "title": "Расшифровка", + "type": [ + "CatalogRef.СтруктураПредприятия", + "CatalogRef.ЭтапыПроизводства", + "CatalogRef.ВидыРабочихЦентров" + ] + } + ] + }] + }, + "validatePath": "Template.xml", + "expect": { + "files": ["Template.xml"] + } +} diff --git a/tests/skills/cases/skd-compile/snapshots/field-multi-type/Template.xml b/tests/skills/cases/skd-compile/snapshots/field-multi-type/Template.xml new file mode 100644 index 00000000..54bbdc54 --- /dev/null +++ b/tests/skills/cases/skd-compile/snapshots/field-multi-type/Template.xml @@ -0,0 +1,72 @@ + + + + ИсточникДанных1 + Local + + + ЖурналОшибок + + ТекстСообщения + ТекстСообщения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст сообщения</v8:content> + </v8:item> + + + xs:string + + 150 + Variable + + + + + Расшифровка + Расшифровка + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Расшифровка</v8:content> + </v8:item> + + + d5p1:CatalogRef.СтруктураПредприятия + d5p1:CatalogRef.ЭтапыПроизводства + d5p1:CatalogRef.ВидыРабочихЦентров + + + ИсточникДанных1 + ЖурналОшибок + + + Основной + + + ru + Основной + + + + + + + + + + + + + + + +