---
name: 1c-xdto-compile
description: Создание пакета XDTO 1С из XML-схемы (XSD). Используй когда нужно добавить в конфигурацию пакет XDTO - под обмен, интеграцию, веб-сервис или внешний XML-формат
argument-hint: -XsdPath <файл.xsd>|-Xsd <схема> -OutputDir <каталог-исходников> [-Name <имя>] [-Synonym <синоним>] [-Comment <текст>] [-Force]
allowed-tools:
  - Bash
  - Read
  - Glob
---

# /xdto-compile - Создание пакета XDTO из XML-схемы

Собирает пакет XDTO по XML-схеме: `XDTOPackages/<Имя>.xml`,
`XDTOPackages/<Имя>/Ext/Package.bin` и регистрацию в `Configuration.xml`.

Вход - обычная XML-схема, писать ее нужно так же, как для любого другого инструмента.

## Параметры

| Параметр | Обязательный | Описание |
|----------|--------------|----------|
| `XsdPath` | один из двух | Путь к файлу XML-схемы. Псевдоним - `-Path` |
| `Xsd` | один из двух | Схема строкой, вместо `-XsdPath` |
| `OutputDir` | да | Каталог исходников конфигурации или расширения - там, где лежит `Configuration.xml` |
| `Name` | нет | Имя объекта метаданных. По умолчанию - из `xs:appinfo`, иначе имя файла XSD, санированное под идентификатор 1С |
| `Synonym` | нет | Синоним (строка). По умолчанию - из `xs:appinfo`, иначе имя пакета. Для нескольких языков задавай синоним в схеме, блоком `xs:appinfo` |
| `Comment` | нет | Комментарий. По умолчанию - из `xs:appinfo` |
| `Force` | нет | Перезаписать существующий пакет. Без него навык откажется затирать уже собранный пакет |

```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-compile.ps1" -XsdPath "<схема.xsd>" -OutputDir "<каталог-исходников>"
```

Примеры:
```powershell
... -XsdPath bank.xsd -OutputDir src -Name ОбменСБанком -Synonym "Обмен с банком"
... -XsdPath fss.xsd  -OutputDir src -Force
```

## Читай предупреждения

XSD выразительнее модели XDTO. Все, что не переносится один в один, навык переносит
приближенно и **пишет об этом**:

```
Предупреждения (2) - конструкции XSD без точного соответствия в модели XDTO:
  ! Документ : вложенная xs:choice уплощена в последовательность - выбор одного из вариантов не сохранен
  ! Документ : кратность на вложенной частице (<xs:sequence minOccurs/maxOccurs>) не выражается в модели XDTO
```

Такое сообщение означает, что пакет собран, но схема упрощена. Если упрощение
недопустимо - меняй схему (например, разноси варианты `xs:choice` по разным типам),
а не игнорируй.

Что переносится приближенно: вложенные `xs:sequence`/`xs:choice` (уплощаются в плоский
список свойств), `xs:all` (становится последовательностью), кратность на частице,
`substitutionGroup`, `xs:key`/`keyref`/`unique`, `xs:redefine`.

`xs:group` и `xs:attributeGroup` раскрываются по ссылке - их содержимое попадает в тип.
`xs:include` игнорируется: зависимости в XDTO разрешаются только по namespace,
поэтому включаемую схему нужно собрать отдельным пакетом и заменить `include` на `import`.

## Посмотреть, что получилось

Модель пакета лежит в `Ext/Package.bin`. Несмотря на расширение, это текстовый XML,
но читать его напрямую обычно незачем: состав собранного пакета показывает
`/xdto-info`, а полную схему - `/xdto-decompile`.

## Зависимости между пакетами

`<xs:import namespace="..."/>` разрешается по namespace среди пакетов конфигурации
или расширения. Если пакета с таким пространством имен нет, платформа при загрузке
молча подменит тип на `xs:anyType` - без ошибки. Собирай сначала зависимости, потом
зависящий пакет, и проверяй результат через `/xdto-validate`.

Какие пакеты уже собраны, видно в `ChildObjects` файла `Configuration.xml`.

## Что XSD выразить не может

Две вещи модель XDTO умеет, а XML Schema - нет: `nillable` у атрибута и `qualified`
у отдельного свойства. Они пишутся атрибутами из пространства имен модели:

```xml
<xs:attribute name="Представление" type="xs:string"
              xmlns:xdto="http://v8.1c.ru/8.1/xdto" xdto:nillable="true"/>
```

Схема остается валидной - валидаторы такие атрибуты игнорируют. Полный список
и таблица соответствий XSD ↔ XDTO - в [xsd-reference.md](xsd-reference.md).

Свойства объекта метаданных можно задать прямо в схеме:

```xml
<xs:annotation>
    <xs:appinfo>
        <xdto:package xmlns:xdto="http://v8.1c.ru/8.1/xdto">
            <xdto:name>ОбменСБанком</xdto:name>
            <xdto:synonym lang="ru">Обмен с банком</xdto:synonym>
        </xdto:package>
    </xs:appinfo>
</xs:annotation>
```

## Типичный workflow

1. Получить XSD от контрагента (или выгрузить схему существующего пакета: `/xdto-decompile`)
2. `/xdto-compile -XsdPath <файл> -OutputDir <каталог-исходников>` - прочитать предупреждения
3. `/xdto-validate <каталог-исходников>/XDTOPackages/<Имя>` - убедиться, что типы разрешились
4. `/db-load-xml` + `/db-update`

Правка существующего пакета: точечно - `/xdto-edit`; переработать схему целиком -
`/xdto-decompile` → правка XSD → `/xdto-compile -Force`.
