fix(meta-compile,meta-edit): synonym decimal и документация типов без синонима

Ревью собственной работы против плана нашло три упущения.

1. Синоним `decimal(p,s)` был в плане, но в код не попал — после включения отказа компилятора
   стандартный SQL-тип стал отвергаться. Добавлен в оба навыка и покрыт кейсом.
2. Тип Null в таблице примитивных типов не описан. Голого синонима у него нет и не будет:
   в DSL он задаётся как `v8:Null`. Заодно сказано прямым текстом, что имя С префиксом проходит
   как есть — так задаются типы без синонима (`v8:ValueTable`, `ent:AccountType`, `v8ui:Color`).
3. Раздел 9.1 в 1c-form-spec помечен как общий справочник типов, а не «про формы»: там самые
   полные перечни v8/v8ui/dcs/ent, и они относятся к любому объекту метаданных.

Проверено: meta-compile 94/94 и meta-edit 32/32 в обоих рантаймах, 11 гардов, снэпшот
sql-type-synonyms с decimal принят платформой.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
Nick Shirokov
2026-09-07 14:13:18 +03:00
co-authored by Claude Opus 5
parent ed160c65b5
commit 6169a7ff93
8 changed files with 66 additions and 8 deletions
@@ -1,4 +1,4 @@
# meta-compile v1.111 — Compile 1C metadata object from JSON
# meta-compile v1.112 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -627,6 +627,7 @@ $script:typeSynonyms["int2"] = "Number(5,0)"
$script:typeSynonyms["varchar"] = "String"
$script:typeSynonyms["character varying"] = "String"
$script:typeSynonyms["numeric"] = "Number"
$script:typeSynonyms["decimal"] = "Number"
$script:typeSynonyms["timestamp"] = "DateTime"
$script:typeSynonyms["bytea"] = "BinaryData"
# Платформенные типы, требующие префикса v8: (коллекции/периоды, частые в реквизитах обработок/отчётов).
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-compile v1.111 — Compile 1C metadata object from JSON
# meta-compile v1.112 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -758,6 +758,7 @@ type_synonyms = {
'varchar': 'String',
'character varying': 'String',
'numeric': 'Number',
'decimal': 'Number',
'timestamp': 'DateTime',
'bytea': 'BinaryData',
# Reference synonyms (Russian, lowercase)
@@ -1,4 +1,4 @@
# meta-edit v1.51 — Edit existing 1C metadata object XML
# meta-edit v1.52 — Edit existing 1C metadata object XML
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -526,6 +526,7 @@ $script:typeSynonyms["int2"] = "Number(5,0)"
$script:typeSynonyms["varchar"] = "String"
$script:typeSynonyms["character varying"] = "String"
$script:typeSynonyms["numeric"] = "Number"
$script:typeSynonyms["decimal"] = "Number"
$script:typeSynonyms["timestamp"] = "DateTime"
$script:typeSynonyms["bytea"] = "BinaryData"
$script:typeSynonyms["таблицазначений"] = "ValueTable"
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-edit v1.51 — Edit existing 1C metadata object XML
# meta-edit v1.52 — Edit existing 1C metadata object XML
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -560,6 +560,7 @@ type_synonyms = {
"varchar": "String",
"character varying": "String",
"numeric": "Number",
"decimal": "Number",
"timestamp": "DateTime",
"bytea": "BinaryData",
"таблицазначений": "ValueTable",
+5
View File
@@ -963,6 +963,11 @@ ChildItems
### 9.1. Система типов
Перечни ниже — самые полные в документации и НЕ только про формы: те же имена стоят в `<v8:Type>`
любого объекта метаданных. Набор доступных типов зависит от владельца: у реквизита, хранимого в базе,
это скаляры + ссылочные + ОпределяемыйТип/Характеристика; у реквизита обработки или формы — ещё и рантайм-типы
из таблиц `v8:*`, `v8ui:*`, `dcs*:*` и системные перечисления `ent:*`.
#### Примитивные типы (xs:*)
```xml
+5
View File
@@ -80,6 +80,7 @@ JSON DSL для описания объектов метаданных конф
| `ValueStorage` | `v8:ValueStorage` (ХранилищеЗначения) |
| `UUID` | `v8:UUID` (УникальныйИдентификатор) |
| `BinaryData` или `BinaryData(N[,fixed\|variable])` | `xs:base64Binary` + BinaryDataQualifiers (ДвоичныеДанные) |
| `v8:Null` | `v8:Null` — тип «Null»; задаётся только с префиксом, голого синонима нет |
Типы СУБД на входе компилятор переводит сам — соответствие замерено на стенде PostgreSQL и совпадает
с тем, что делает Конфигуратор при импорте структуры таблицы:
@@ -92,6 +93,10 @@ JSON DSL для описания объектов метаданных конф
| `varchar(n)`, `character varying(n)` | `String(n)` | | `bytea` | `BinaryData` |
| `numeric(p,s)`, `decimal(p,s)` | `Number(p,s)` | | | |
Имя типа без префикса, которое не совпало ни с одной из форм выше, компилятор отвергает: так выглядит
и опечатка, и неподдержанный тип СУБД. А вот имя С префиксом проходит как есть — так задаются
типы, у которых нет синонима в DSL: `v8:Null`, `v8:ValueTable`, `ent:AccountType`, `v8ui:Color`.
Важное ограничение: типы 1С получает ОТ ДРАЙВЕРА ODBC, а не из схемы БД. Поэтому `boolean`
в список НЕ входит: в DSL это Булево, а psqlODBC при реальном импорте отдаёт `Строка(5)` (опция
драйвера *Bools as Char*). `text`, `real`, `double precision`, `money`, `json` и массивы не поддержаны —
@@ -334,6 +334,48 @@
</Properties>
</Field>
<Field uuid="UUID-024">
<Properties>
<Name>price2</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>price2</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>xs:decimal</v8:Type>
<v8:NumberQualifiers>
<v8:Digits>12</v8:Digits>
<v8:FractionDigits>3</v8:FractionDigits>
<v8:AllowedSign>Any</v8:AllowedSign>
</v8:NumberQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:type="xs:decimal">0</FillValue>
<FillChecking>DontCheck</FillChecking>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<ChoiceForm/>
<NameInDataSource>price2</NameInDataSource>
<ReadOnly>false</ReadOnly>
<AllowNull>false</AllowNull>
</Properties>
</Field>
<Field uuid="UUID-025">
<Properties>
<Name>created</Name>
<Synonym>
@@ -373,7 +415,7 @@
<AllowNull>false</AllowNull>
</Properties>
</Field>
<Field uuid="UUID-025">
<Field uuid="UUID-026">
<Properties>
<Name>born</Name>
<Synonym>
@@ -413,7 +455,7 @@
<AllowNull>false</AllowNull>
</Properties>
</Field>
<Field uuid="UUID-026">
<Field uuid="UUID-027">
<Properties>
<Name>uid</Name>
<Synonym>
@@ -450,7 +492,7 @@
<AllowNull>false</AllowNull>
</Properties>
</Field>
<Field uuid="UUID-027">
<Field uuid="UUID-028">
<Properties>
<Name>blob</Name>
<Synonym>
@@ -15,6 +15,7 @@
"name: varchar(150)",
"descr: character varying(50)",
"price: numeric(15,2)",
"price2: decimal(12,3)",
"created: timestamp",
"born: date",
"uid: uuid",
@@ -35,7 +36,8 @@
"<v8:Length>150</v8:Length>",
"<v8:DateFractions>DateTime</v8:DateFractions>",
"<v8:Type>v8:UUID</v8:Type>",
"<v8:Type>xs:base64Binary</v8:Type>"
"<v8:Type>xs:base64Binary</v8:Type>",
"<v8:Digits>12</v8:Digits>"
]
}
],