From eb6f8379e699637bb0b77db587fee93222529fa2 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 11 Feb 2026 11:32:17 +0300 Subject: [PATCH] Skip cfg: reference types in DCS valueType to fix XDTO build errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Real 1C DCS files (12,495 analyzed) never include cfg:CatalogRef.XXX in — the platform infers field types from query metadata. Emitting them causes XDTO exceptions when building EPF. Reference types in JSON DSL still set field roles but no longer emit valueType. Co-Authored-By: Claude Opus 4.6 --- .claude/skills/skd-compile/SKILL.md | 2 +- .../skd-compile/scripts/skd-compile.ps1 | 23 ++++++++++++------- docs/skd-dsl-spec.md | 10 ++++---- 3 files changed, 22 insertions(+), 13 deletions(-) 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 при загрузке. + ### Синонимы типов Все имена типов регистронезависимые. Поддерживаются русские и альтернативные имена: