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
+27 -4
View File
@@ -1462,17 +1462,24 @@ ChildObjects и модулей.
| Поле JSON | Умолчание | XML элемент |
|-----------|----------|-------------|
| `rootURL` | = имя (lowercase) | RootURL |
| `reuseSessions` | `DontUse` | ReuseSessions |
| `reuseSessions` | `DontUse` | ReuseSessions (`DontUse` / `Use` / `AutoUse`) |
| `sessionMaxAge` | `20` | SessionMaxAge |
| `urlTemplates` | `{}` | → URLTemplate в ChildObjects (§16) |
Шаблон: строкой — только путь; объектом — `template`, `synonym`, `comment`, `methods`.
Метод: строкой — только HTTP-метод; объектом — `httpMethod`, `handler`, `synonym`, `comment`.
Обработчик по умолчанию `<ИмяШаблона><ИмяМетода>`; в типовых конфигурациях он обычно
произвольный, тогда задают `handler` явно.
Модули: `Ext/Module.bsl` (пустой).
```json
{
"type": "HTTPService", "name": "API", "rootURL": "api",
"urlTemplates": {
"Users": { "template": "/v1/users", "methods": { "Get": "GET", "Create": "POST" } }
"Users": { "template": "/v1/users", "methods": { "Get": "GET", "Create": "POST" } },
"rpc": { "template": "/rpc", "methods": {
"post": { "httpMethod": "POST", "handler": "УдаленныйВызовЧерезТелоЗапроса" } } }
}
}
```
@@ -1482,21 +1489,37 @@ ChildObjects и модулей.
| Поле JSON | Умолчание | XML элемент |
|-----------|----------|-------------|
| `namespace` | `""` | Namespace |
| `xdtoPackages` | `""` | XDTOPackages |
| `reuseSessions` | `DontUse` | ReuseSessions |
| `xdtoPackages` | `[]` | XDTOPackages (список, см. ниже) |
| `descriptorFileName` | `<Имя>.1cws` | DescriptorFileName |
| `reuseSessions` | `DontUse` | ReuseSessions (`DontUse` / `Use` / `AutoUse`) |
| `sessionMaxAge` | `20` | SessionMaxAge |
| `operations` | `{}` | → Operation в ChildObjects (§17) |
`xdtoPackages` — массив: значение `XDTOPackage.Имя` даёт ссылку на пакет конфигурации,
любое другое трактуется как URI внешнего пространства имён.
Операция: `returnType`, `nillable`, `transactioned`, `procedureName` (синоним ключа — `handler`),
`dataLockControlMode` (умолчание `Managed`), `synonym`, `comment`, `parameters`.
Параметр: `type`, `nillable`, `direction`, `synonym`, `comment`; строкой — только тип.
Тип из собственного пространства имён задаётся нотацией Кларка `{uri}ИмяТипа` — компилятор
объявит локальный `xmlns` в теге, как это делает платформа.
Модули: `Ext/Module.bsl` (пустой).
```json
{
"type": "WebService", "name": "DataExchange", "namespace": "http://www.1c.ru/DataExchange",
"xdtoPackages": ["XDTOPackage.ОбменДанными", "http://v8.1c.ru/8.3/data/ext"],
"operations": {
"TestConnection": {
"returnType": "xs:boolean",
"handler": "ПроверкаПодключения",
"parameters": { "ErrorMessage": { "type": "xs:string", "direction": "Out" } }
},
"Exchange": {
"returnType": "{http://www.1c.ru/DataExchange}Message",
"parameters": { "Data": { "type": "{http://www.1c.ru/DataExchange}Message", "nillable": false } }
}
}
}