feat(meta-decompile): поддержка HTTPService + починка его компиляции

meta-decompile не знал тип HTTPService, поэтому 7 сервисов УТ не проходили
раундтрип вовсе. Добавлен разбор: rootURL, reuseSessions, sessionMaxAge и
дерево urlTemplates -> methods.

Раундтрип на реальных сервисах вскрыл три пробела компилятора:

1. ReuseSessions: в allowlist были только DontUse и AutoUse, а платформа
   пишет ещё и Use (4 объекта в корпусе) — компиляция падала с ошибкой.
2. Обработчик метода выводился по формуле ИмяШаблона+ИмяМетода; в реальных
   конфигурациях он произвольный (УдаленныйВызовМетодаЧерезТелоЗапроса).
   Метод получил объектную форму {httpMethod, handler, synonym, comment}
   рядом со строчным сокращением "только HTTP-метод".
3. Comment не эмитился ни у объекта, ни у шаблонов и методов, хотя платформа
   пишет тег всегда.

Порядок шаблонов и методов приведён к порядку DSL в обоих портах: PS шёл в
порядке хеш-таблицы, py сортировал — снэпшоты бы разъехались между портами.

В декомпиляторе сравнение синонима с авто-выводом сделано регистрочувствительным
(-ceq): "Post" против "post" считалось совпадением, и синоним терялся.

Проверка: HTTP-сервисы УТ 7/7 без расхождений (было 0 — тип не поддерживался),
сюита 76/76 на обоих портах, 1С-сертификация кейса пройдена.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-01 21:20:44 +03:00
co-authored by Claude Opus 5
parent dac265995e
commit 01c45581ef
6 changed files with 170 additions and 36 deletions
@@ -4,8 +4,9 @@
"type": "HTTPService",
"name": "ТоварныйAPI",
"rootURL": "api/v1",
"reuseSessions": "AutoUse",
"reuseSessions": "Use",
"sessionMaxAge": 30,
"comment": "Публичный API",
"urlTemplates": {
"Товары": {
"template": "/products/{id}",
@@ -13,6 +14,13 @@
"Получить": "GET",
"Обновить": "PUT"
}
},
"rpc": {
"template": "/rpc",
"comment": "Удалённый вызов",
"methods": {
"post": { "httpMethod": "POST", "handler": "ВызовЧерезТелоЗапроса", "synonym": "Post" }
}
}
}
},
@@ -9,9 +9,9 @@
<v8:content>ТоварныйAPI</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Comment>Публичный API</Comment>
<RootURL>api/v1</RootURL>
<ReuseSessions>AutoUse</ReuseSessions>
<ReuseSessions>Use</ReuseSessions>
<SessionMaxAge>30</SessionMaxAge>
</Properties>
<ChildObjects>
@@ -24,23 +24,11 @@
<v8:content>Товары</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Template>/products/{id}</Template>
</Properties>
<ChildObjects>
<Method uuid="UUID-003">
<Properties>
<Name>Обновить</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Обновить</v8:content>
</v8:item>
</Synonym>
<HTTPMethod>PUT</HTTPMethod>
<Handler>ТоварыОбновить</Handler>
</Properties>
</Method>
<Method uuid="UUID-004">
<Properties>
<Name>Получить</Name>
<Synonym>
@@ -49,10 +37,54 @@
<v8:content>Получить</v8:content>
</v8:item>
</Synonym>
<Comment/>
<HTTPMethod>GET</HTTPMethod>
<Handler>ТоварыПолучить</Handler>
</Properties>
</Method>
<Method uuid="UUID-004">
<Properties>
<Name>Обновить</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Обновить</v8:content>
</v8:item>
</Synonym>
<Comment/>
<HTTPMethod>PUT</HTTPMethod>
<Handler>ТоварыОбновить</Handler>
</Properties>
</Method>
</ChildObjects>
</URLTemplate>
<URLTemplate uuid="UUID-005">
<Properties>
<Name>rpc</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>rpc</v8:content>
</v8:item>
</Synonym>
<Comment>Удалённый вызов</Comment>
<Template>/rpc</Template>
</Properties>
<ChildObjects>
<Method uuid="UUID-006">
<Properties>
<Name>post</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Post</v8:content>
</v8:item>
</Synonym>
<Comment/>
<HTTPMethod>POST</HTTPMethod>
<Handler>ВызовЧерезТелоЗапроса</Handler>
</Properties>
</Method>
</ChildObjects>
</URLTemplate>
</ChildObjects>