diff --git a/.claude/skills/skd-compile/SKILL.md b/.claude/skills/skd-compile/SKILL.md index 161bc981..e0bfdc06 100644 --- a/.claude/skills/skd-compile/SKILL.md +++ b/.claude/skills/skd-compile/SKILL.md @@ -60,7 +60,7 @@ powershell.exe -NoProfile -File .claude\skills\skd-compile\scripts\skd-compile.p "Служебное: string #noFilter #noOrder" — + ограничения ``` -Типы: `string`, `string(N)`, `decimal(D,F)`, `boolean`, `date`, `dateTime`, `CatalogRef.X`, `DocumentRef.X`, `EnumRef.X`, `StandardPeriod`. +Типы: `string`, `string(N)`, `decimal(D,F)`, `boolean`, `date`, `dateTime`, `CatalogRef.X`, `DocumentRef.X`, `EnumRef.X`, `StandardPeriod`. Ссылочные типы (`CatalogRef`, `DocumentRef`, `EnumRef`) задают роли полей, но не эмитируются в `` — платформа определяет их из запроса. **Синонимы типов** (русские и альтернативные): `число` = decimal, `строка` = string, `булево` = boolean, `дата` = date, `датаВремя` = dateTime, `СтандартныйПериод` = StandardPeriod, `СправочникСсылка.X` = CatalogRef.X, `ДокументСсылка.X` = DocumentRef.X, `int`/`number` = decimal, `bool` = boolean. Регистронезависимые. diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index d6597c74..d47d13f3 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.ps1 +++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1 @@ -195,18 +195,25 @@ function Emit-ValueType { return } - # cfg: references (CatalogRef.XXX, DocumentRef.XXX, EnumRef.XXX, etc.) + # cfg: references — skip in DCS (platform infers types from query metadata) + # Emitting cfg:CatalogRef.XXX causes XDTO errors; real DCS files never use them if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef)\.') { - X "$indentcfg:$(Esc-Xml $typeStr)" return } - # Fallback + # Fallback — skip dot-qualified types (likely cfg: references) if ($typeStr.Contains('.')) { - X "$indentcfg:$(Esc-Xml $typeStr)" - } else { - X "$indent$(Esc-Xml $typeStr)" + return } + + X "$indent$(Esc-Xml $typeStr)" +} + +function Is-RefType { + param([string]$typeStr) + if (-not $typeStr) { return $false } + $resolved = Resolve-TypeStr $typeStr + return ($resolved -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef)\.' -or ($resolved.Contains('.') -and $resolved -notmatch '^(string|decimal)')) } # --- 5. Field shorthand parser --- @@ -576,8 +583,8 @@ function Emit-Field { X "$indent`t" } - # ValueType - if ($f.type) { + # ValueType (skip for cfg: reference types — platform infers from query) + if ($f.type -and -not (Is-RefType $f.type)) { X "$indent`t" Emit-ValueType -typeStr $f.type -indent "$indent`t`t" X "$indent`t" diff --git a/docs/skd-dsl-spec.md b/docs/skd-dsl-spec.md index 19eb76ba..ba935303 100644 --- a/docs/skd-dsl-spec.md +++ b/docs/skd-dsl-spec.md @@ -147,12 +147,14 @@ | `boolean` | `xs:boolean` | — | | `date` | `xs:dateTime` | DateFractions=Date | | `dateTime` | `xs:dateTime` | DateFractions=DateTime | -| `CatalogRef.XXX` | `cfg:CatalogRef.XXX` | — | -| `DocumentRef.XXX` | `cfg:DocumentRef.XXX` | — | -| `EnumRef.XXX` | `cfg:EnumRef.XXX` | — | -| `ChartOfAccountsRef.XXX` | `cfg:ChartOfAccountsRef.XXX` | — | +| `CatalogRef.XXX` | *(не эмитируется)* | Роль поля сохраняется, `` опускается | +| `DocumentRef.XXX` | *(не эмитируется)* | Платформа определяет тип из запроса | +| `EnumRef.XXX` | *(не эмитируется)* | | +| `ChartOfAccountsRef.XXX` | *(не эмитируется)* | | | `StandardPeriod` | `v8:StandardPeriod` | — | +> **Ссылочные типы** (`CatalogRef.XXX`, `DocumentRef.XXX` и др.) указываются в JSON для задания ролей полей (`@dimension`, `@account` и т.д.), но **не эмитируются** в ``. Реальные DCS-файлы 1С не содержат `cfg:` ссылок в valueType — платформа определяет типы полей автоматически из метаданных запроса. Включение `cfg:` типов приводит к ошибке XDTO при загрузке. + ### Синонимы типов Все имена типов регистронезависимые. Поддерживаются русские и альтернативные имена: