fix(meta-compile,meta-decompile): многоязычные синонимы и регистр RootURL в сервисах

Прогон сервисов на конфигурациях формата 2.17 (ERP + БП, 46 объектов) вскрыл
то, чего не было в УТ: 25 совпадений из 46.

ERP двуязычна, и синоним шаблона, метода, операции и параметра приезжает
объектом {ru,en}. Компилятор интерполировал его в строку — в XML попадал
литерал "@{ru=Версия; en=Version}" вместо пары языковых элементов. Значение
теперь передаётся в эмиттер как есть, он и так умеет обе формы.

RootURL сравнивался с дефолтом (имя в нижнем регистре) регистронезависимо,
поэтому MobileAppReceiptScanner считался дефолтным и терял регистр при
регенерации. Сравнение сделано регистрочувствительным — тот же класс ошибки,
что уже ловили на синонимах методов.

Спека meta-dsl-spec дополнена: объектные формы шаблонов, методов, операций и
параметров; xdtoPackages как список; descriptorFileName; dataLockControlMode;
нотация Кларка для типов из своего пространства имён; Use в ReuseSessions.

Проверка: сервисы ERP+БП 46/46, сервисы УТ 25/25, сюита 76/76 на обоих
портах, 1С-сертификация кейса с многоязычным синонимом пройдена.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-02 11:47:02 +03:00
co-authored by Claude Opus 5
parent 87f97e986a
commit 05beeca7d3
7 changed files with 50 additions and 18 deletions
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-compile v1.72 — Compile 1C metadata object from JSON
# meta-compile v1.73 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -3832,7 +3832,7 @@ def emit_url_template(indent, tmpl_name, tmpl_def):
else:
template = str(tmpl_def['template']) if tmpl_def.get('template') else f'/{tmpl_name.lower()}'
if tmpl_def.get('synonym'):
tmpl_synonym = str(tmpl_def['synonym'])
tmpl_synonym = tmpl_def['synonym'] # объект {ru,en} НЕ приводить к строке
if tmpl_def.get('comment'):
tmpl_comment = str(tmpl_def['comment'])
if tmpl_def.get('methods'):
@@ -3861,7 +3861,7 @@ def emit_url_template(indent, tmpl_name, tmpl_def):
else:
http_method = str(m_def.get('httpMethod') or 'GET')
handler = str(m_def.get('handler') or f'{tmpl_name}{method_name}')
method_synonym = str(m_def['synonym']) if m_def.get('synonym') else split_camel_case(method_name)
method_synonym = m_def['synonym'] if m_def.get('synonym') else split_camel_case(method_name)
method_comment = str(m_def.get('comment') or '')
X(f'{indent}\t\t<Method uuid="{method_uuid}">')
X(f'{indent}\t\t\t<Properties>')
@@ -3901,7 +3901,7 @@ def emit_operation(indent, op_name, op_def):
if op_def.get('procedureName'):
handler = str(op_def['procedureName'])
if op_def.get('synonym'):
op_synonym = str(op_def['synonym'])
op_synonym = op_def['synonym']
if op_def.get('comment'):
op_comment = str(op_def['comment'])
if op_def.get('dataLockControlMode'):
@@ -3940,7 +3940,7 @@ def emit_operation(indent, op_name, op_def):
if param_def.get('direction'):
param_dir = str(param_def['direction'])
if param_def.get('synonym'):
param_synonym = str(param_def['synonym'])
param_synonym = param_def['synonym']
if param_def.get('comment'):
param_comment = str(param_def['comment'])
X(f'{indent}\t\t<Parameter uuid="{param_uuid}">')