fix(meta-compile): константа без valueType получала тип значения "Constant"

Определение {"type": "Constant", "name": "X"} эмитило <v8:Type>Constant</v8:Type>:
в тип значения попадал ВИД объекта. Платформа отвергала всю конфигурацию целиком —
«Неизвестное имя типа - Constant», — то есть один минимальный объект ронял загрузку.

Причина: Emit-ConstantProperties передавал корневое определение в общий Build-TypeStr,
а тот читает valueType, иначе type. Для реквизита это верно, для корневого определения
нет: там type — вид объекта. Добавлен флаг ValueTypeOnly, которым корневые эмиттеры
отключают подхват; заодно убрано мёртвое условие в typeEmpty, пришедшее туда из
контекста реквизита.

Поведение теперь совпадает с документированным (reference/simple.md): Строка(10).
Проверено платформой 8.3.24.1691.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
Nick Shirokov
2026-09-05 20:20:22 +03:00
co-authored by Claude Opus 5
parent cc0b7d3b64
commit 5592590a0e
9 changed files with 379 additions and 11 deletions
@@ -1,4 +1,4 @@
# meta-compile v1.102 — Compile 1C metadata object from JSON
# meta-compile v1.103 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -1080,8 +1080,10 @@ function Emit-FillValue {
# --- 5. Attribute shorthand parser ---
function Build-TypeStr {
param($obj)
$t = if ($obj.valueType) { "$($obj.valueType)" } elseif ($obj.type) { "$($obj.type)" } else { "" }
# ValueTypeOnly — для корневого определения объекта: там ключ type означает ВИД объекта
# (Constant, Catalog, …), а не тип значения, и подхватывать его нельзя.
param($obj, [switch]$ValueTypeOnly)
$t = if ($obj.valueType) { "$($obj.valueType)" } elseif (-not $ValueTypeOnly -and $obj.type) { "$($obj.type)" } else { "" }
if ($t -and -not $t.Contains('(')) {
if ($t -eq "String" -and $obj.length) {
$t = "String($($obj.length))"
@@ -2771,8 +2773,8 @@ function Emit-ConstantProperties {
if ($def.comment) { X "$i<Comment>$(Esc-XmlText $def.comment)</Comment>" } else { X "$i<Comment/>" }
# Type — valueType (пустой явный '' → <Type/>, реквизит без типа; отсутствие → String дефолт).
$valueType = Build-TypeStr $def
$typeEmpty = ($null -ne $def.valueType -and "$($def.valueType)".Trim() -eq '') -or ($null -ne $def.type -and "$($def.type)".Trim() -eq '')
$valueType = Build-TypeStr $def -ValueTypeOnly
$typeEmpty = ($null -ne $def.valueType -and "$($def.valueType)".Trim() -eq '')
if ($typeEmpty) { X "$i<Type/>" }
else { if (-not $valueType) { $valueType = "String" }; Emit-ValueType $i $valueType }
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-compile v1.102 — Compile 1C metadata object from JSON
# meta-compile v1.103 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -1194,8 +1194,10 @@ def emit_fill_value(indent, type_str, spec, has_spec, type_empty=False):
# 5. Attribute shorthand parser
# ---------------------------------------------------------------------------
def build_type_str(obj):
t = str(obj.get('valueType') or obj.get('type') or '')
def build_type_str(obj, value_type_only=False):
# value_type_only — для корневого определения объекта: там ключ type означает ВИД объекта
# (Constant, Catalog, …), а не тип значения, и подхватывать его нельзя.
t = str(obj.get('valueType') or ('' if value_type_only else obj.get('type')) or '')
if t and '(' not in t:
if t == 'String' and obj.get('length'):
t = f"String({obj['length']})"
@@ -2869,9 +2871,8 @@ def emit_constant_properties(indent):
else:
X(f'{i}<Comment/>')
# Type — valueType (явный '' → <Type/>, реквизит без типа; отсутствие → String дефолт).
value_type = build_type_str(defn)
type_empty = (defn.get('valueType') is not None and str(defn.get('valueType')).strip() == '') or \
(defn.get('type') is not None and str(defn.get('type')).strip() == '')
value_type = build_type_str(defn, value_type_only=True)
type_empty = defn.get('valueType') is not None and str(defn.get('valueType')).strip() == ''
if type_empty:
X(f'{i}<Type/>')
else: