From 05374100c1d40309b8bd92edaffd34ee55b7a266 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 20 May 2026 11:45:23 +0300 Subject: [PATCH] fix(skd-compile): accept bare decimal and decimal(N) with sensible defaults MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Emit-SingleValueType / emit_single_value_type previously required full decimal(D,F) — anything else fell through to a fallback that produced invalid decimal (no xs: prefix, no qualifiers). New regex `^decimal(\((\d+)(,(\d+))?(,nonneg)?\))?$` accepts: - decimal → 10,2,Any (money default — most common 1C intent) - decimal(N) → N,0,Any (integer) - decimal(N,nonneg) → N,0,Nonnegative - decimal(N,M) → as before - decimal(N,M,nonneg) → as before Synonyms (число, число(N), etc.) inherit the same forms via Resolve-TypeStr. Shared Emit-ValueType is called from fields, parameters, and output parameters — one fix covers all three paths. 3 existing snapshots regenerated with proper xs:decimal + qualifiers, plus new decimal-qualifier-defaults test case covering all 5 forms × synonyms. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/skd-compile/SKILL.md | 4 +- .../skd-compile/scripts/skd-compile.ps1 | 21 ++- .../skills/skd-compile/scripts/skd-compile.py | 20 +- .../decimal-qualifier-defaults.json | 29 +++ .../auto-data-parameters/Template.xml | 7 +- .../decimal-qualifier-defaults/Template.xml | 172 ++++++++++++++++++ .../snapshots/empty-param-values/Template.xml | 7 +- .../orgroup-string-items/Template.xml | 14 +- 8 files changed, 257 insertions(+), 17 deletions(-) create mode 100644 tests/skills/cases/skd-compile/decimal-qualifier-defaults.json create mode 100644 tests/skills/cases/skd-compile/snapshots/decimal-qualifier-defaults/Template.xml diff --git a/.claude/skills/skd-compile/SKILL.md b/.claude/skills/skd-compile/SKILL.md index 8a8853bc..1937ecad 100644 --- a/.claude/skills/skd-compile/SKILL.md +++ b/.claude/skills/skd-compile/SKILL.md @@ -88,7 +88,9 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-compile.ps1" -V Многоязычный заголовок: `"title": { "ru": "...", "en": "..." }`. Применимо везде, где принимается title/presentation (поля, calculatedFields, parameters, settingsVariants, availableValues и пр.). Строка эквивалентна `{ "ru": "..." }`. -Типы: `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 со ссылочными типами требует базу с соответствующей конфигурацией. +Типы: `string`, `string(N)`, `decimal`, `decimal(D)`, `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 со ссылочными типами требует базу с соответствующей конфигурацией. + +`decimal` без скобок = `10,2` (деньги по умолчанию), `decimal(N)` = `N,0` (целое); `,nonneg` в конце скобок → AllowedSign=Nonnegative. Составной тип (несколько типов значений) — массив в объектной форме: `"type": ["CatalogRef.A", "CatalogRef.B"]`. Квалификаторы (`(N)`, `(D,F)`) применяются к каждому элементу. diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index df537bbe..4fa26c2a 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.24 — Compile 1C DCS from JSON +# skd-compile v1.25 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -230,11 +230,20 @@ function Emit-SingleValueType { return } - # decimal(D,F) or decimal(D,F,nonneg) - if ($typeStr -match '^decimal\((\d+),(\d+)(,nonneg)?\)$') { - $digits = $Matches[1] - $fraction = $Matches[2] - $sign = if ($Matches[3]) { "Nonnegative" } else { "Any" } + # decimal forms (defaults — bare decimal = money 10,2; decimal(N) = integer N,0): + # decimal → 10,2,Any + # decimal(N) → N,0,Any + # decimal(N,nonneg) → N,0,Nonnegative + # decimal(N,M) → N,M,Any + # decimal(N,M,nonneg) → N,M,Nonnegative + if ($typeStr -match '^decimal(\((\d+)(,(\d+))?(,nonneg)?\))?$') { + if (-not $Matches[1]) { + $digits = "10"; $fraction = "2"; $sign = "Any" + } else { + $digits = $Matches[2] + $fraction = if ($Matches[4]) { $Matches[4] } else { "0" } + $sign = if ($Matches[5]) { "Nonnegative" } else { "Any" } + } X "$indentxs:decimal" X "$indent" X "$indent`t$digits" diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 38efd58f..bf2e5e6a 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.24 — Compile 1C DCS from JSON +# skd-compile v1.25 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -159,12 +159,20 @@ def emit_single_value_type(lines, type_str, indent): lines.append(f'{indent}') return - # decimal(D,F) or decimal(D,F,nonneg) - m = re.match(r'^decimal\((\d+),(\d+)(,nonneg)?\)$', type_str) + # decimal forms (defaults — bare decimal = money 10,2; decimal(N) = integer N,0): + # decimal → 10,2,Any + # decimal(N) → N,0,Any + # decimal(N,nonneg) → N,0,Nonnegative + # decimal(N,M) → N,M,Any + # decimal(N,M,nonneg) → N,M,Nonnegative + m = re.match(r'^decimal(\((\d+)(,(\d+))?(,nonneg)?\))?$', type_str) if m: - digits = m.group(1) - fraction = m.group(2) - sign = 'Nonnegative' if m.group(3) else 'Any' + if not m.group(1): + digits, fraction, sign = '10', '2', 'Any' + else: + digits = m.group(2) + fraction = m.group(4) if m.group(4) else '0' + sign = 'Nonnegative' if m.group(5) else 'Any' lines.append(f'{indent}xs:decimal') lines.append(f'{indent}') lines.append(f'{indent}\t{digits}') diff --git a/tests/skills/cases/skd-compile/decimal-qualifier-defaults.json b/tests/skills/cases/skd-compile/decimal-qualifier-defaults.json new file mode 100644 index 00000000..c872996a --- /dev/null +++ b/tests/skills/cases/skd-compile/decimal-qualifier-defaults.json @@ -0,0 +1,29 @@ +{ + "name": "decimal — все формы квалификаторов (bare, (N), (N,M), nonneg, синонимы)", + "params": { "outputPath": "Template.xml" }, + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ 1 КАК Поле1", + "fields": [ + "ДеньгиПоУмолчанию: decimal", + "ЦелоеОдинАргумент: decimal(10)", + "ОбычныеДеньги: decimal(10,2)", + "Положительные: decimal(10,2,nonneg)", + "ЦелоеПоложительное: decimal(10,nonneg)", + "ЧислоСинонимБезАргументов: число", + "ЧислоСинонимЦелое: число(8)", + "ЧислоСинонимКоличество: число(15,3)" + ] + }], + "parameters": [ + "ПараметрДеньги: decimal", + "ПараметрЦелое: decimal(10)", + "ПараметрКоличество: decimal(15,3,nonneg)" + ] + }, + "validatePath": "Template.xml", + "expect": { + "files": ["Template.xml"] + } +} diff --git a/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml b/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml index d2270b2f..1d3156a5 100644 --- a/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml +++ b/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml @@ -17,7 +17,12 @@ Поле Поле - decimal + xs:decimal + + 10 + 2 + Any + ИсточникДанных1 diff --git a/tests/skills/cases/skd-compile/snapshots/decimal-qualifier-defaults/Template.xml b/tests/skills/cases/skd-compile/snapshots/decimal-qualifier-defaults/Template.xml new file mode 100644 index 00000000..88cda4d3 --- /dev/null +++ b/tests/skills/cases/skd-compile/snapshots/decimal-qualifier-defaults/Template.xml @@ -0,0 +1,172 @@ + + + + ИсточникДанных1 + Local + + + Основной + + ДеньгиПоУмолчанию + ДеньгиПоУмолчанию + + xs:decimal + + 10 + 2 + Any + + + + + ЦелоеОдинАргумент + ЦелоеОдинАргумент + + xs:decimal + + 10 + 0 + Any + + + + + ОбычныеДеньги + ОбычныеДеньги + + xs:decimal + + 10 + 2 + Any + + + + + Положительные + Положительные + + xs:decimal + + 10 + 2 + Nonnegative + + + + + ЦелоеПоложительное + ЦелоеПоложительное + + xs:decimal + + 10 + 0 + Nonnegative + + + + + ЧислоСинонимБезАргументов + ЧислоСинонимБезАргументов + + xs:decimal + + 10 + 2 + Any + + + + + ЧислоСинонимЦелое + ЧислоСинонимЦелое + + xs:decimal + + 8 + 0 + Any + + + + + ЧислоСинонимКоличество + ЧислоСинонимКоличество + + xs:decimal + + 15 + 3 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ 1 КАК Поле1 + + + ПараметрДеньги + + xs:decimal + + 10 + 2 + Any + + + 0 + + + ПараметрЦелое + + xs:decimal + + 10 + 0 + Any + + + 0 + + + ПараметрКоличество + + xs:decimal + + 15 + 3 + Nonnegative + + + 0 + + + Основной + + + ru + Основной + + + + + + + + + + + + + + + + diff --git a/tests/skills/cases/skd-compile/snapshots/empty-param-values/Template.xml b/tests/skills/cases/skd-compile/snapshots/empty-param-values/Template.xml index 624a0bb3..40d32cb4 100644 --- a/tests/skills/cases/skd-compile/snapshots/empty-param-values/Template.xml +++ b/tests/skills/cases/skd-compile/snapshots/empty-param-values/Template.xml @@ -70,7 +70,12 @@ ПараметрЧисло - decimal + xs:decimal + + 10 + 2 + Any + 0 diff --git a/tests/skills/cases/skd-compile/snapshots/orgroup-string-items/Template.xml b/tests/skills/cases/skd-compile/snapshots/orgroup-string-items/Template.xml index 4e89027c..76f8b444 100644 --- a/tests/skills/cases/skd-compile/snapshots/orgroup-string-items/Template.xml +++ b/tests/skills/cases/skd-compile/snapshots/orgroup-string-items/Template.xml @@ -17,14 +17,24 @@ Поле1 Поле1 - decimal + xs:decimal + + 10 + 2 + Any + Поле2 Поле2 - decimal + xs:decimal + + 10 + 2 + Any +