# Спецификация формата XML пакетов XDTO 1С Формат: XML-выгрузка конфигурации 1С:Предприятие 8.3 (Конфигуратор → Конфигурация → Выгрузить конфигурацию в файлы). Версии формата: `2.17` (платформа 8.3.20–8.3.24), `2.20` (платформа 8.3.27+). Источники: выгрузки Бухгалтерия предприятия (8.3.24), ERP 2 (8.3.24) — 760 пакетов. > **Связанные спецификации:** > - Корневая структура конфигурации — [1c-configuration-spec.md](1c-configuration-spec.md) > - DSL навыков (XSD как формат описания) — [xdto-dsl-spec.md](xdto-dsl-spec.md) > - Сводный индекс — [1c-specs-index.md](1c-specs-index.md) --- ## 1. Структура каталогов ``` XDTOPackages/ ├── ОбменСБанком.xml # Объект метаданных — 4 свойства, и всё ├── ОбменСБанком/ │ └── Ext/ │ └── Package.bin # Модель пакета └── ... ``` Регистрация в корневом `Configuration.xml`: ```xml ... ОбменСБанком ``` Ни форм, ни модулей, ни макетов у пакета XDTO нет. --- ## 2. Объект метаданных `<Имя>.xml` ```xml ApdexExport ru Apdex export www.v8.1c.ru/ssl/performace-assessment/apdexExport ``` | Свойство | Описание | |---|---| | `Name` | Имя объекта метаданных. Должно быть валидным идентификатором 1С | | `Synonym` | Многоязычное представление | | `Comment` | Комментарий | | `Namespace` | URI целевого пространства имён. Дублирует `targetNamespace` в `Package.bin` | Других свойств у пакета XDTO нет. --- ## 3. `Ext/Package.bin` — модель пакета Несмотря на расширение `.bin`, это **текстовый XML**: UTF-8 с BOM, перевод строки CRLF, отступ — символы табуляции. ```xml ``` ### 3.1. Вложенность элементов ``` package > objectType | valueType | property | import objectType > property valueType > enumeration | pattern | typeDef property > typeDef typeDef > property | enumeration | pattern ``` Всего восемь имён элементов. `typeDef` — анонимный (встроенный) тип; его разновидность задаёт `xsi:type` = `ValueType` либо `ObjectType`. **Порядок элементов верхнего уровня обязателен:** ``` import* → property* → valueType* → objectType* ``` Ему удовлетворяют все 760 пакетов корпуса. Нарушение порядка платформа не прощает — `db-update` падает с «Ошибка преобразования данных XDTO: Чтение объекта типа `{http://v8.1c.ru/8.1/xdto}Package`… Проверка свойства 'property'». Это существенно при сборке из XML-схемы, где порядок объявлений верхнего уровня произвольный. ### 3.2. `` | Атрибут | Значения | Описание | |---|---|---| | `targetNamespace` | URI | Целевое пространство имён | | `elementFormQualified` | `true` \| `false` | Умолчание при отсутствии — `true` | | `attributeFormQualified` | `true` \| `false` | Умолчание при отсутствии — `false` | Порядок атрибутов: `targetNamespace`, `elementFormQualified`, `attributeFormQualified`. ### 3.3. `` `` — объявление зависимости от другого пакета. Разрешается по namespace среди пакетов конфигурации; `schemaLocation` в модели XDTO нет. ### 3.4. `` и `` | Атрибут | Значения | Описание | |---|---|---| | `name` | идентификатор | Только у именованного `objectType` | | `base` | QName | Базовый тип (наследование) | | `open` | `true` \| `false` | Допускает произвольные элементы и атрибуты | | `abstract` | `true` \| `false` | Абстрактный тип | | `mixed` | `true` \| `false` | Смешанное содержимое | | `ordered` | `true` \| `false` | `false` — выбор одного из вариантов (аналог `xs:choice`) | | `sequenced` | `true` | Последовательное содержимое | Порядок атрибутов `objectType`: `name`, `base`, `open`, `abstract`, `mixed`, `ordered`, `sequenced`. Порядок атрибутов `typeDef`: `xsi:type`, `base`, `mixed`, `open`, `ordered`, `sequenced`, далее атрибуты простого типа. ### 3.5. `` и `` | Атрибут | Значения | |---|---| | `name` | идентификатор (только у именованного `valueType`) | | `base` | QName базового типа | | `variety` | `Atomic` \| `List` \| `Union` | | `itemType` | QName — тип элемента списка (`variety="List"`) | | `memberTypes` | список типов объединения (`variety="Union"`) | Фасеты задаются **атрибутами**, а не дочерними элементами: `length`, `minLength`, `maxLength`, `totalDigits`, `fractionDigits`, `minInclusive`, `maxInclusive`, `minExclusive`, `maxExclusive`, `whiteSpace` (`preserve` \| `collapse`). Базовый тип может задаваться не атрибутом `base`, а вложенным анонимным `typeDef` **без** `xsi:type` — соответствует анонимному `xs:simpleType` внутри `xs:restriction`: ```xml [0-9]{12} ``` Дочерними элементами идут только `` и `` — значение в тексте узла: ```xml [0-9]{20} ``` У `` встречается атрибут `xsi:type` (например `xs:string`), указывающий тип литерала. ### 3.6. `` | Атрибут | Значения | Описание | |---|---|---| | `name` | идентификатор | Имя свойства | | `ref` | QName | Ссылка на глобальное свойство вместо собственного объявления | | `type` | QName | Тип свойства. При отсутствии и `type`, и вложенного `typeDef` — произвольный тип | | `lowerBound` | `0` \| `1` | Минимальная кратность. Умолчание при отсутствии — `1` | | `upperBound` | число \| `-1` | Максимальная кратность; `-1` — неограниченно. Умолчание — `1` | | `nillable` | `true` \| `false` | Допускает `xsi:nil` | | `fixed` | значение | Фиксированное значение | | `default` | значение | Значение по умолчанию | | `form` | `Element` \| `Attribute` \| `Text` | Форма представления в XML. Умолчание — `Element` | | `localName` | строка | Исходное XML-имя, если оно не является валидным идентификатором 1С | | `qualified` | `true` \| `false` | Переопределение `*FormQualified` для конкретного свойства | Порядок атрибутов: `name`, `ref`, `type`, `lowerBound`, `upperBound`, `nillable`, `fixed`, `default`, `form`, `localName`, `qualified`. **`form="Text"`** — свойство хранит собственное значение элемента (аналог `xs:simpleContent`). Такое свойство платформа всегда называет `__content`: ```xml ``` Наличие `form="Text"` не отменяет флагов самого типа — `mixed`, `sequenced` и прочие задаются как обычно: ```xml ``` **`localName`** — при импорте XML-схемы имя, недопустимое как идентификатор 1С, санируется, а оригинал сохраняется: ```xml ``` ### 3.7. Порядок свойств внутри типа Свойства с `form="Attribute"` обычно идут перед остальными — так записаны 96.5% типов корпуса. Оставшиеся 3.5% содержат произвольное чередование; порядок значим и сохраняется платформой как есть. --- ## 4. Схема префиксов пространств имён Каждая ссылка на тип из пространства имён, отличного от `xs:`/`xsi:`, требует объявления префикса вида `dNpM`: ```xml ``` - `N` — глубина узла: `package` = 1, его прямые потомки = 2, свойство внутри `objectType` = 3, свойство внутри `typeDef` = 5, глубже — 7, 9 и т.д. - `M` — порядковый номер нового пространства имён, объявляемого на этом узле (с 1). Префикс объявляется **на первом узле, которому он нужен**; потомки переиспользуют его из области видимости, а не объявляют заново: ```xml ``` Целевое пространство имён самого пакета исключением не является — ссылка на собственный тип тоже требует локального объявления. Частоты по корпусу: `d3p1` — 109 738, `d2p1` — 13 108, `d5p1` — 9 581, далее по убыванию до `d16p1`. ### 4.1. Нотация Кларка в `memberTypes` Значения `memberTypes` записываются нотацией Кларка `{URI}Локальное`, без префикса (125 случаев из 135 в корпусе; остальные — обычные префиксные QName): ```xml ``` Обратите внимание: объявление `xmlns:d2p1` присутствует, хотя в значении не используется — пространство имён всё равно проходит через общий механизм выделения префиксов. Если оно уже объявлено предком, нового объявления не появляется. Остальные атрибуты-QName (`type`, `base`, `ref`, `itemType`) всегда префиксные. ### 4.2. Осмысленные префиксы Изредка вместо сгенерированного `dNpM` встречается содержательный префикс — например `dcsset` для настроек компоновки данных: ```xml ``` ### 4.3. Свойство с `qualified` сериализуется с префиксом Если у свойства задан `qualified`, платформа пишет и сам тег, и имя атрибута с явным префиксом пространства имён модели XDTO (хотя по умолчанию оно и так объявлено как `xmlns=`): ```xml ``` Префикс для XDTO выделяется последним, после префиксов типов. Такое встречается редко (16 узлов на весь корпус) и появляется при импорте XML-схемы, где `form` задан на объявлении в unqualified-пакете. --- ## 5. Умолчания записываются непоследовательно Один и тот же смысл в корпусе встречается в двух написаниях: `nillable="false"` присутствует явно 6 899 раз, `objectType open="false"` — 6 раз, `abstract="false"` — 2 раза, явное `form="Element"` — 44 раза. Пакеты, полученные импортом XML-схемы, и пакеты, созданные руками в Конфигураторе, отличаются стилем. Практическое следствие: приведение пакета к «каноническому» виду меняет байты реальных файлов. Инструменты, которым важен точный round-trip, обязаны сохранять literal-форму. --- ## 6. Тихая деградация в `xs:anyType` При импорте XML-схемы через Конфигуратор тип из чужого пространства имён, для которого в конфигурации нет соответствующего пакета, **молча** заменяется на `xs:anyType` — без ошибки и без предупреждения: ```xml ``` При этом `` в пакете остаётся. Признак «объявлен импорт, но ни один тип из этого пространства имён не используется» — надёжный индикатор проблемы.