xdto · diff
git:20261013.b21cb45 to git:20261014.f8db19d
23 added, 18 removed. Audit A to A.
---
name: xdto
description: Просмотреть или точечно изменить схему XDTO-пакета 1С по логическому адресу. Используй для EnterpriseData `valueType`, `objectType` и свойств типов.
argument-hint: <sourceSet> <XDTOPackage.Name> <ops>
allowed-tools:
- Read
- Glob
---
# /unica:xdto — XDTO-пакеты 1С
Перед чтением или мутацией сверяй поддерживаемую грамматику и байтовые гарантии
с `../../references/specs/1c-xdto-spec.md`.
## MCP routing
- Используй только MCP `unica`: `unica.view` читает пакет по адресу, а
`unica.apply` с операциями семейства XDTO строит и применяет точечную мутацию.
- Всегда начинай с `unica.view`, затем перед каждой мутацией вызывай
`unica.apply` с `at` и `ops`. Исполняй план вызовом только с
`executionToken` из `data.executionToken` после поручения пользователя; любое изменение
аргументов требует нового preview.
- Планирующий `unica.apply` принимает непустой упорядоченный массив `ops`.
Связное изменение — тип и его свойства — веди одним планом: операции видят
результаты предыдущих, публикация одна, отказ любой операции не оставляет
частичной записи. Ошибка элемента называет `ops[<индекс>]`.
- И читателю, и писателю передавай один адрес `at` вида
`<набор>:XDTOPackage.<Имя>` (для операций над типом —
- `<набор>:XDTOPackage.<Имя>.Type.<Тип>`). Никогда не передавай путь к
- `XDTOPackages/.../Ext/Package.bin`: он остаётся внутренней раскладкой
- платформенной выгрузки.
+ `<набор>:XDTOPackage.<Имя>.Type.<Тип>`, над свойством любой вложенности —
+ `…Type.<Тип>.Property.<А>[.Property.<Б>…]`). Точка внутри имени пишется
+ `\.`: свойство `A.B` — `…Property.A\.B` (в JSON — `A\\.B`). Никогда
+ не передавай путь к `XDTOPackages/.../Ext/Package.bin`: он остаётся
+ внутренней раскладкой платформенной выгрузки.
- Не вызывай donor-команды compile, decompile или validate и не запускай их
скриптовые обёртки: публичная граница этого скилла состоит ровно из двух
нативных инструментов выше.
Операции семейства XDTO в `ops` — закрытое объединение с тегом `op`, а их
аргументы едут внутри `args.values`: `valueType.add` (`name`, `base`),
- `objectType.add` (`name`), `property.add` (`property`, необязательный
- `propertyPath`), `type.remove`, `property.remove` (`name`, необязательный
- `propertyPath`). Тип, над которым идёт операция, называет `at`, а не отдельный
- аргумент. Для вложенного анонимного типа используй `propertyPath`, например
- `"СсылкаНаОбъект"` для `ЛюбаяСсылка`. Writer сохраняет BOM и наблюдённые
+ `objectType.add` (`name`), `property.add` (`property`), `type.remove`,
+ `property.remove` (без аргументов). Узел, над которым идёт операция, называет
+ `at`, а не отдельный аргумент: `property.add` — на типе или на свойстве, во
+ вложенный анонимный тип которого добавляется новое
+ (`…Type.ЛюбаяСсылка.Property.СсылкаНаОбъект`); `property.remove` — на самом
+ удаляемом свойстве. Прежние `propertyPath` и `name` у `property.remove`
+ отклоняются с `bad_value`, `next` ведёт к адресу свойства. Writer сохраняет BOM и наблюдённые
переводы строк, а повтор того же добавления возвращает no-op. QName в `base` и
`property.type` передавай с существующим префиксом. Если префикс не виден в
области вставки, writer повторит его объявление локально только при
единственном доказанном соответствии префикса URI во всём пакете;
отсутствующее или противоречивое соответствие отклоняется без угадывания URI.
## 1. Прочитать логическую цель
Корень пакета отвечает целевым пространством имён и счётчиками, а состав лежит
в ветвях `Namespace`, `Type` и `Property`; спускайся в нужную адресом из
`branches`.
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "unica.view",
"arguments": {
"cwd": "<workspace>",
"at": "main:XDTOPackage.EnterpriseData_1_17_3"
}
}
}
```
- Отдельный тип и его свойства читаются тем же вызовом глубже по адресу:
-
- У свойства `props.type` содержит компактную JSON-строку с исходным QName,
- локальным именем и пространством имён; у ссылки на глобальное свойство эти
- сведения находятся в `props.reference`. `props.bounds` — компактная JSON-строка
- с эффективными `lower` и `upper`, признаками явного задания `lowerExplicit`
- и `upperExplicit`, а также `unbounded`. Отсутствующая граница имеет эффективное
- значение `1`; `upper=-1` означает неограниченную верхнюю границу.
+ Отдельный тип и его свойства читаются тем же вызовом глубже по адресу;
+ свойство со вложенным анонимным типом объявляет ветвь `Property` своих
+ свойств:
```json
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "unica.view",
"arguments": {
"cwd": "<workspace>",
"at": "main:XDTOPackage.EnterpriseData_1_17_3.Type.ЛюбаяСсылка"
}
}
}
```
+ У свойства `props.type` содержит компактную JSON-строку с исходным QName,
+ локальным именем и пространством имён; у ссылки на глобальное свойство эти
+ сведения находятся в `props.reference`. `props.bounds` — компактная JSON-строка
+ с эффективными `lower` и `upper`, признаками явного задания `lowerExplicit`
+ и `upperExplicit`, а также `unbounded`. Отсутствующая граница имеет эффективное
+ значение `1`; `upper=-1` означает неограниченную верхнюю границу.
+
## 2. Построить preview
```json
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "unica.apply",
"arguments": {
- "at": "main:XDTOPackage.EnterpriseData_1_17_3.Type.ЛюбаяСсылка",
+ "at": "main:XDTOPackage.EnterpriseData_1_17_3.Type.ЛюбаяСсылка.Property.СсылкаНаОбъект",
"ops": [
{
"op": "property.add",
"args": {
"values": {
- "propertyPath": "СсылкаНаОбъект",
"property": {
"name": "Документ_НовыйДокумент",
"type": "tns:Документ_ЗаказКлиента",
"minOccurs": 0
}
}
}
}
]
}
}
}
```
Связная последовательность — например `objectType.add` и следом `property.add`
к созданному типу — передаётся тем же массивом `ops` и проверяется одним
preview.
## 3. Применить только после подтверждения
Когда пользователь поручил внести правку, передай только `executionToken`
из `data.executionToken` успешного плана:
Для исполнения передай `data.executionToken` из этого успешного плана:
```json
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "unica.apply",
"arguments": {
"executionToken": "<data.executionToken из успешного плана>"
}
}
}
```