feat(meta-decompile,meta-compile): поддержка WebService и полнота его формата

meta-decompile не знал тип WebService — 18 сервисов УТ не проходили раундтрип.
Добавлен разбор (оба порта): namespace, состав XDTO-пакетов, дескриптор,
операции с параметрами.

Компилятор поддерживал тип поверхностно; раундтрип на реальных сервисах
показал, чего не хватало:

- XDTOPackages эмитился скаляром, а это СПИСОК элементов: ссылка на пакет
  конфигурации (xr:MDObjectRef) либо URI внешнего пространства имён
  (xs:string). Presentation пуст, CheckState 0 — 19/19 по корпусу;
- DescriptorFileName не эмитился вовсе, хотя есть у всех 18 сервисов и НЕ
  выводится из имени (DMILService -> dmil.1cws) — нужен явный ключ;
- DataLockControlMode не эмитился (Managed у всех 192 операций);
- Comment не эмитился ни у сервиса, ни у операций и параметров;
- типы из собственного пространства имён (81 случай) писались без локального
  xmlns. В DSL задаются нотацией Кларка "{uri}ИмяТипа", компилятор объявляет
  xmlns сам — как это делает платформа.

Nillable захватывается явно у операций и параметров: по корпусу значения
смешанные (операции 103/89, параметры 128/395), дефолт угадать нельзя.

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

Проверка: 25 сервисов УТ (18 WebService + 7 HTTPService) 25/25 без
расхождений; JSON декомпилятора побайтово совпадает у PS и py на всех 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:40:10 +03:00
co-authored by Claude Opus 5
parent 01c45581ef
commit 87f97e986a
7 changed files with 442 additions and 45 deletions
@@ -11,7 +11,19 @@
</Synonym>
<Comment/>
<Namespace>http://example.com/exchange</Namespace>
<XDTOPackages/>
<XDTOPackages>
<xr:Item>
<xr:Presentation/>
<xr:CheckState>0</xr:CheckState>
<xr:Value xsi:type="xs:string">http://v8.1c.ru/8.3/data/ext</xr:Value>
</xr:Item>
<xr:Item>
<xr:Presentation/>
<xr:CheckState>0</xr:CheckState>
<xr:Value xsi:type="xs:string">http://example.com/exchange</xr:Value>
</xr:Item>
</XDTOPackages>
<DescriptorFileName>exchange.1cws</DescriptorFileName>
<ReuseSessions>AutoUse</ReuseSessions>
<SessionMaxAge>20</SessionMaxAge>
</Properties>
@@ -30,23 +42,10 @@
<Nillable>true</Nillable>
<Transactioned>false</Transactioned>
<ProcedureName>ПолучитьДанные</ProcedureName>
<DataLockControlMode>Managed</DataLockControlMode>
</Properties>
<ChildObjects>
<Parameter uuid="UUID-003">
<Properties>
<Name>ДатаНачала</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Дата начала</v8:content>
</v8:item>
</Synonym>
<XDTOValueType>xs:dateTime</XDTOValueType>
<Nillable>true</Nillable>
<TransferDirection>In</TransferDirection>
</Properties>
</Parameter>
<Parameter uuid="UUID-004">
<Properties>
<Name>ИдентификаторЗапроса</Name>
<Synonym>
@@ -55,11 +54,76 @@
<v8:content>Идентификатор запроса</v8:content>
</v8:item>
</Synonym>
<Comment/>
<XDTOValueType>xs:string</XDTOValueType>
<Nillable>true</Nillable>
<TransferDirection>In</TransferDirection>
</Properties>
</Parameter>
<Parameter uuid="UUID-004">
<Properties>
<Name>ДатаНачала</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Дата начала</v8:content>
</v8:item>
</Synonym>
<Comment/>
<XDTOValueType>xs:dateTime</XDTOValueType>
<Nillable>true</Nillable>
<TransferDirection>In</TransferDirection>
</Properties>
</Parameter>
</ChildObjects>
</Operation>
<Operation uuid="UUID-005">
<Properties>
<Name>ОбменСообщениями</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Обмен сообщениями</v8:content>
</v8:item>
</Synonym>
<Comment>Основная операция</Comment>
<XDTOReturningValueType xmlns:d1p1="http://example.com/exchange">d1p1:MessageExchange</XDTOReturningValueType>
<Nillable>false</Nillable>
<Transactioned>false</Transactioned>
<ProcedureName>ВыполнитьОбмен</ProcedureName>
<DataLockControlMode>Managed</DataLockControlMode>
</Properties>
<ChildObjects>
<Parameter uuid="UUID-006">
<Properties>
<Name>Сообщение</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Сообщение</v8:content>
</v8:item>
</Synonym>
<Comment/>
<XDTOValueType xmlns:d1p1="http://example.com/exchange">d1p1:MessageExchange</XDTOValueType>
<Nillable>false</Nillable>
<TransferDirection>In</TransferDirection>
</Properties>
</Parameter>
<Parameter uuid="UUID-007">
<Properties>
<Name>Ошибка</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Ошибка</v8:content>
</v8:item>
</Synonym>
<Comment/>
<XDTOValueType>xs:string</XDTOValueType>
<Nillable>false</Nillable>
<TransferDirection>Out</TransferDirection>
</Properties>
</Parameter>
</ChildObjects>
</Operation>
</ChildObjects>
@@ -5,6 +5,8 @@
"name": "СервисОбмена",
"namespace": "http://example.com/exchange",
"reuseSessions": "AutoUse",
"descriptorFileName": "exchange.1cws",
"xdtoPackages": ["http://v8.1c.ru/8.3/data/ext", "http://example.com/exchange"],
"operations": {
"ПолучитьДанные": {
"returnType": "xs:string",
@@ -14,6 +16,15 @@
"ИдентификаторЗапроса": "xs:string",
"ДатаНачала": "xs:dateTime"
}
},
"ОбменСообщениями": {
"returnType": "{http://example.com/exchange}MessageExchange",
"procedureName": "ВыполнитьОбмен",
"comment": "Основная операция",
"parameters": {
"Сообщение": { "type": "{http://example.com/exchange}MessageExchange", "nillable": false },
"Ошибка": { "type": "xs:string", "nillable": false, "direction": "Out" }
}
}
}
},