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
+