mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-19 16:35:52 +03:00
feat(meta-compile,meta-edit): типы СУБД на входе переводятся в типы 1С
Модель, проектирующая внешний источник по схеме БД, естественно пишет типы так, как они названы в information_schema. До сих пор такое имя молча уходило в XML дословно (<v8:Type>integer</v8:Type>), валидатор ничего не замечал, и падало это только на загрузке в базу. Добавлены однозначные соответствия, замеренные на стенде PostgreSQL — то же самое даёт Конфигуратор при импорте структуры таблицы: integer/int/int4 → Number(10,0) varchar(n)/character varying(n) → String(n) bigint/int8 → Number(19,0) numeric(p,s) → Number(p,s) smallint/int2 → Number(5,0) timestamp → DateTime · bytea → BinaryData boolean НЕ включён намеренно: в DSL это уже Булево, а psqlODBC при импорте отдаёт Строка(5) — молча выбрать один из двух смыслов нельзя. text/real/money/json не включены: замера нет. Словарь типов meta-edit был беднее meta-compile на 25 записей (не было Time, BinaryData, UUID, коллекций, ссылки на таблицу внешнего источника) — дополнен до набора авторитета. Конфликтов значений не было ни одного. Проверено: наборы обоих навыков зелёные в двух рантаймах, снэпшот sql-type-synonyms принят платформой 8.3.24.1691, PS и PY дают идентичный XML. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
co-authored by
Claude Opus 5
parent
41e2eca638
commit
eccb11b0ed
@@ -1,4 +1,4 @@
|
||||
# meta-compile v1.109 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.110 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -612,6 +612,23 @@ $script:typeSynonyms["хранилищезначений"] = "ValueStorage"
|
||||
$script:typeSynonyms["хранилищезначения"] = "ValueStorage"
|
||||
$script:typeSynonyms["uuid"] = "UUID"
|
||||
$script:typeSynonyms["уникальныйидентификатор"] = "UUID"
|
||||
# Типы СУБД — прощающий ввод: модель, проектирующая внешний источник по схеме БД, пишет типы
|
||||
# так, как они названы в information_schema. Соответствие замерено на стенде PostgreSQL: то же
|
||||
# самое даёт Конфигуратор при импорте структуры таблицы. Только однозначные: boolean НЕ включён
|
||||
# (в DSL это уже Булево, а psqlODBC при импорте отдаёт Строка(5) — два разных смысла), как и
|
||||
# text/real/money/json — для них замера нет.
|
||||
$script:typeSynonyms["integer"] = "Number(10,0)"
|
||||
$script:typeSynonyms["int"] = "Number(10,0)"
|
||||
$script:typeSynonyms["int4"] = "Number(10,0)"
|
||||
$script:typeSynonyms["bigint"] = "Number(19,0)"
|
||||
$script:typeSynonyms["int8"] = "Number(19,0)"
|
||||
$script:typeSynonyms["smallint"] = "Number(5,0)"
|
||||
$script:typeSynonyms["int2"] = "Number(5,0)"
|
||||
$script:typeSynonyms["varchar"] = "String"
|
||||
$script:typeSynonyms["character varying"] = "String"
|
||||
$script:typeSynonyms["numeric"] = "Number"
|
||||
$script:typeSynonyms["timestamp"] = "DateTime"
|
||||
$script:typeSynonyms["bytea"] = "BinaryData"
|
||||
# Платформенные типы, требующие префикса v8: (коллекции/периоды, частые в реквизитах обработок/отчётов).
|
||||
$script:v8PlatformTypes = @("ValueTable","ValueTree","ValueList","ValueListType","StandardPeriod",
|
||||
"StandardBeginningDate","PointInTime","TypeDescription","FixedArray","FixedMap","FixedStructure")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-compile v1.109 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.110 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -743,6 +743,23 @@ type_synonyms = {
|
||||
'хранилищезначения': 'ValueStorage',
|
||||
'uuid': 'UUID',
|
||||
'уникальныйидентификатор': 'UUID',
|
||||
# Типы СУБД — прощающий ввод: модель, проектирующая внешний источник по схеме БД, пишет типы
|
||||
# так, как они названы в information_schema. Соответствие замерено на стенде PostgreSQL: то же
|
||||
# самое даёт Конфигуратор при импорте структуры таблицы. Только однозначные: boolean НЕ включён
|
||||
# (в DSL это уже Булево, а psqlODBC при импорте отдаёт Строка(5) — два разных смысла), как и
|
||||
# text/real/money/json — для них замера нет.
|
||||
'integer': 'Number(10,0)',
|
||||
'int': 'Number(10,0)',
|
||||
'int4': 'Number(10,0)',
|
||||
'bigint': 'Number(19,0)',
|
||||
'int8': 'Number(19,0)',
|
||||
'smallint': 'Number(5,0)',
|
||||
'int2': 'Number(5,0)',
|
||||
'varchar': 'String',
|
||||
'character varying': 'String',
|
||||
'numeric': 'Number',
|
||||
'timestamp': 'DateTime',
|
||||
'bytea': 'BinaryData',
|
||||
# Reference synonyms (Russian, lowercase)
|
||||
'справочникссылка': 'CatalogRef',
|
||||
'документссылка': 'DocumentRef',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-edit v1.50 — Edit existing 1C metadata object XML
|
||||
# meta-edit v1.51 — Edit existing 1C metadata object XML
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -502,6 +502,38 @@ $script:typeSynonyms["catalogref"] = "CatalogRef"
|
||||
$script:typeSynonyms["documentref"] = "DocumentRef"
|
||||
$script:typeSynonyms["enumref"] = "EnumRef"
|
||||
|
||||
# Платформенные типы, требующие префикса v8: (коллекции/периоды, частые в реквизитах
|
||||
# обработок и отчётов, где набор типов шире, чем у хранимых объектов). Копия реестра meta-compile.
|
||||
$script:v8PlatformTypes = @("ValueTable","ValueTree","ValueList","ValueListType","StandardPeriod",
|
||||
"StandardBeginningDate","PointInTime","TypeDescription","FixedArray","FixedMap","FixedStructure")
|
||||
# Ниже — записи, которых в этом навыке не было: словарь дополнен до набора meta-compile,
|
||||
# который является авторитетом. Расхождение держит tests/skills/check-type-synonyms.mjs.
|
||||
$script:typeSynonyms["время"] = "Time"
|
||||
$script:typeSynonyms["time"] = "Time"
|
||||
$script:typeSynonyms["base64binary"] = "ValueStorage"
|
||||
$script:typeSynonyms["binarydata"] = "BinaryData"
|
||||
$script:typeSynonyms["двоичныеданные"] = "BinaryData"
|
||||
$script:typeSynonyms["хранилищезначений"] = "ValueStorage"
|
||||
$script:typeSynonyms["uuid"] = "UUID"
|
||||
$script:typeSynonyms["уникальныйидентификатор"] = "UUID"
|
||||
$script:typeSynonyms["integer"] = "Number(10,0)"
|
||||
$script:typeSynonyms["int"] = "Number(10,0)"
|
||||
$script:typeSynonyms["int4"] = "Number(10,0)"
|
||||
$script:typeSynonyms["bigint"] = "Number(19,0)"
|
||||
$script:typeSynonyms["int8"] = "Number(19,0)"
|
||||
$script:typeSynonyms["smallint"] = "Number(5,0)"
|
||||
$script:typeSynonyms["int2"] = "Number(5,0)"
|
||||
$script:typeSynonyms["varchar"] = "String"
|
||||
$script:typeSynonyms["character varying"] = "String"
|
||||
$script:typeSynonyms["numeric"] = "Number"
|
||||
$script:typeSynonyms["timestamp"] = "DateTime"
|
||||
$script:typeSynonyms["bytea"] = "BinaryData"
|
||||
$script:typeSynonyms["таблицазначений"] = "ValueTable"
|
||||
$script:typeSynonyms["деревозначений"] = "ValueTree"
|
||||
$script:typeSynonyms["списокзначений"] = "ValueListType"
|
||||
$script:typeSynonyms["стандартныйпериод"] = "StandardPeriod"
|
||||
$script:typeSynonyms["внешнийисточникданныхтаблицассылка"] = "ExternalDataSourceTableRef"
|
||||
|
||||
# ============================================================
|
||||
# Section 4: Type system
|
||||
# ============================================================
|
||||
@@ -649,6 +681,58 @@ function Build-TypeContentXml {
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# Time — третья доля даты, наравне с Date/DateTime.
|
||||
if ($typeStr -eq "Time") {
|
||||
$sb.AppendLine("$indent<v8:Type>xs:dateTime</v8:Type>") | Out-Null
|
||||
$sb.AppendLine("$indent<v8:DateQualifiers>") | Out-Null
|
||||
$sb.AppendLine("$indent`t<v8:DateFractions>Time</v8:DateFractions>") | Out-Null
|
||||
$sb.AppendLine("$indent</v8:DateQualifiers>") | Out-Null
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# UUID
|
||||
if ($typeStr -eq "UUID") {
|
||||
$sb.AppendLine("$indent<v8:Type>v8:UUID</v8:Type>") | Out-Null
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# BinaryData — xs:base64Binary СО своими квалификаторами (в отличие от ХранилищаЗначения).
|
||||
# Формы и умолчание — как в meta-compile, который здесь авторитет системы типов.
|
||||
if ($typeStr -match '^BinaryData(\(|$)') {
|
||||
$bm = [regex]::Match($typeStr, '^BinaryData(\((\d+)(,\s*(fixed|variable))?\))?$', 'IgnoreCase')
|
||||
if (-not $bm.Success) {
|
||||
Write-Error "Неверный тип '$typeStr': ждётся BinaryData, BinaryData(Длина) или BinaryData(Длина,fixed|variable)."
|
||||
exit 1
|
||||
}
|
||||
$blen = if ($bm.Groups[2].Success) { $bm.Groups[2].Value } else { "4294967292" }
|
||||
$ballowed = if ($bm.Groups[4].Success) { if ($bm.Groups[4].Value.ToLowerInvariant() -eq "fixed") { "Fixed" } else { "Variable" } }
|
||||
elseif ($bm.Groups[2].Success) { "Variable" } else { "Fixed" }
|
||||
$sb.AppendLine("$indent<v8:Type>xs:base64Binary</v8:Type>") | Out-Null
|
||||
$sb.AppendLine("$indent<v8:BinaryDataQualifiers>") | Out-Null
|
||||
$sb.AppendLine("$indent`t<v8:Length>$blen</v8:Length>") | Out-Null
|
||||
$sb.AppendLine("$indent`t<v8:AllowedLength>$ballowed</v8:AllowedLength>") | Out-Null
|
||||
$sb.AppendLine("$indent</v8:BinaryDataQualifiers>") | Out-Null
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# Платформенные типы (коллекции/периоды) — префикс v8:, объявлен в шапке файла.
|
||||
if ($script:v8PlatformTypes -contains $typeStr) {
|
||||
$sb.AppendLine("$indent<v8:Type>v8:$typeStr</v8:Type>") | Out-Null
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# Характеристика ПВХ — множество типов, как и ОпределяемыйТип.
|
||||
if ($typeStr -match '^Characteristic\.(.+)$') {
|
||||
$sb.AppendLine("$indent<v8:TypeSet>cfg:$typeStr</v8:TypeSet>") | Out-Null
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# Голый метатип-категория без имени объекта — «любой объект категории», это TypeSet.
|
||||
if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef|AnyRef|AnyIBRef)$') {
|
||||
$sb.AppendLine("$indent<v8:TypeSet>cfg:$typeStr</v8:TypeSet>") | Out-Null
|
||||
return $sb.ToString().TrimEnd("`r","`n")
|
||||
}
|
||||
|
||||
# DefinedType
|
||||
if ($typeStr -match '^DefinedType\.(.+)$') {
|
||||
$dtName = $Matches[1]
|
||||
@@ -663,7 +747,7 @@ function Build-TypeContentXml {
|
||||
# Если корень URI не объявляет (файл не от платформы), остаёмся на самодостаточной
|
||||
# локальной форме: префикс тут — ТЕКСТ узла, XML-слой про него не знает и сам
|
||||
# объявление не добавит, так что иначе получился бы неразрешимый префикс.
|
||||
if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef)\.(.+)$') {
|
||||
if ($typeStr -match '^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|BusinessProcessRoutePointRef|TaskRef|ExternalDataSourceTableRef)\.(.+)$') {
|
||||
if ($script:cfgPrefix) {
|
||||
$sb.AppendLine("$indent<v8:Type>$($script:cfgPrefix):$typeStr</v8:Type>") | Out-Null
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-edit v1.50 — Edit existing 1C metadata object XML
|
||||
# meta-edit v1.51 — Edit existing 1C metadata object XML
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -540,6 +540,41 @@ type_synonyms = {
|
||||
"catalogref": "CatalogRef",
|
||||
"documentref": "DocumentRef",
|
||||
"enumref": "EnumRef",
|
||||
# Ниже — записи, которых в этом навыке не было: словарь дополнен до набора meta-compile,
|
||||
# который является авторитетом. Расхождение держит tests/skills/check-type-synonyms.mjs.
|
||||
"время": "Time",
|
||||
"time": "Time",
|
||||
"base64binary": "ValueStorage",
|
||||
"binarydata": "BinaryData",
|
||||
"двоичныеданные": "BinaryData",
|
||||
"хранилищезначений": "ValueStorage",
|
||||
"uuid": "UUID",
|
||||
"уникальныйидентификатор": "UUID",
|
||||
"integer": "Number(10,0)",
|
||||
"int": "Number(10,0)",
|
||||
"int4": "Number(10,0)",
|
||||
"bigint": "Number(19,0)",
|
||||
"int8": "Number(19,0)",
|
||||
"smallint": "Number(5,0)",
|
||||
"int2": "Number(5,0)",
|
||||
"varchar": "String",
|
||||
"character varying": "String",
|
||||
"numeric": "Number",
|
||||
"timestamp": "DateTime",
|
||||
"bytea": "BinaryData",
|
||||
"таблицазначений": "ValueTable",
|
||||
"деревозначений": "ValueTree",
|
||||
"списокзначений": "ValueListType",
|
||||
"стандартныйпериод": "StandardPeriod",
|
||||
"внешнийисточникданныхтаблицассылка": "ExternalDataSourceTableRef",
|
||||
}
|
||||
|
||||
# Платформенные типы, требующие префикса v8: (коллекции/периоды, частые в реквизитах
|
||||
# обработок и отчётов, где набор типов шире, чем у хранимых объектов). Копия реестра meta-compile.
|
||||
V8_PLATFORM_TYPES = {
|
||||
"ValueTable", "ValueTree", "ValueList", "ValueListType", "StandardPeriod",
|
||||
"StandardBeginningDate", "PointInTime", "TypeDescription", "FixedArray", "FixedMap",
|
||||
"FixedStructure",
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
@@ -666,6 +701,54 @@ def build_type_content_xml(indent, type_str):
|
||||
lines.append(f"{indent}</v8:DateQualifiers>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# Time — третья доля даты, наравне с Date/DateTime.
|
||||
if type_str == "Time":
|
||||
lines.append(f"{indent}<v8:Type>xs:dateTime</v8:Type>")
|
||||
lines.append(f"{indent}<v8:DateQualifiers>")
|
||||
lines.append(f"{indent}\t<v8:DateFractions>Time</v8:DateFractions>")
|
||||
lines.append(f"{indent}</v8:DateQualifiers>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# UUID
|
||||
if type_str == "UUID":
|
||||
lines.append(f"{indent}<v8:Type>v8:UUID</v8:Type>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# BinaryData — xs:base64Binary СО своими квалификаторами (в отличие от ХранилищаЗначения).
|
||||
# Формы и умолчание — как в meta-compile, который здесь авторитет системы типов.
|
||||
if re.match(r"^BinaryData(\(|$)", type_str, re.I):
|
||||
m_bin = re.match(r"^BinaryData(?:\((\d+)(?:,\s*(fixed|variable))?\))?$", type_str, re.I)
|
||||
if not m_bin:
|
||||
print(f"Неверный тип '{type_str}': ждётся BinaryData, BinaryData(Длина) или BinaryData(Длина,fixed|variable).", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
blen = m_bin.group(1) or "4294967292"
|
||||
if m_bin.group(2):
|
||||
ballowed = "Fixed" if m_bin.group(2).lower() == "fixed" else "Variable"
|
||||
else:
|
||||
ballowed = "Variable" if m_bin.group(1) else "Fixed"
|
||||
lines.append(f"{indent}<v8:Type>xs:base64Binary</v8:Type>")
|
||||
lines.append(f"{indent}<v8:BinaryDataQualifiers>")
|
||||
lines.append(f"{indent}\t<v8:Length>{blen}</v8:Length>")
|
||||
lines.append(f"{indent}\t<v8:AllowedLength>{ballowed}</v8:AllowedLength>")
|
||||
lines.append(f"{indent}</v8:BinaryDataQualifiers>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# Платформенные типы (коллекции/периоды) — префикс v8:, объявлен в шапке файла.
|
||||
if type_str in V8_PLATFORM_TYPES:
|
||||
lines.append(f"{indent}<v8:Type>v8:{type_str}</v8:Type>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# Характеристика ПВХ — множество типов, как и ОпределяемыйТип.
|
||||
if re.match(r"^Characteristic\.(.+)$", type_str):
|
||||
lines.append(f"{indent}<v8:TypeSet>cfg:{type_str}</v8:TypeSet>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# Голый метатип-категория без имени объекта — «любой объект категории», это TypeSet.
|
||||
if re.match(r"^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|"
|
||||
r"ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef|AnyRef|AnyIBRef)$", type_str):
|
||||
lines.append(f"{indent}<v8:TypeSet>cfg:{type_str}</v8:TypeSet>")
|
||||
return "\r\n".join(lines)
|
||||
|
||||
# DefinedType
|
||||
m = re.match(r"^DefinedType\.(.+)$", type_str)
|
||||
if m:
|
||||
@@ -682,7 +765,8 @@ def build_type_content_xml(indent, type_str):
|
||||
# объявление не добавит, так что иначе получился бы неразрешимый префикс.
|
||||
m = re.match(
|
||||
r"^(CatalogRef|DocumentRef|EnumRef|ChartOfAccountsRef|ChartOfCharacteristicTypesRef|"
|
||||
r"ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|TaskRef)\.(.+)$",
|
||||
r"ChartOfCalculationTypesRef|ExchangePlanRef|BusinessProcessRef|BusinessProcessRoutePointRef|"
|
||||
r"TaskRef|ExternalDataSourceTableRef)\.(.+)$",
|
||||
type_str,
|
||||
)
|
||||
if m:
|
||||
|
||||
Reference in New Issue
Block a user