Создание и проверка XSD-схемы в 1С через механизм XDTO
Содержание
XSD-схему под 1С почти никогда не пишут руками в блокноте с нуля — это долго и легко ошибиться в пространстве имён. В конфигураторе есть механизм XDTO: схему можно собрать визуально в дереве метаданных или импортировать готовый .xsd, а платформа сама свяжет его с типами 1С. Руками правят уже отдельные строки.
Путь в конфигураторе: ветка Общие → Пакеты XDTO. Там создают пакет, задают ему пространство имён и описывают типы — объектные (как таблицы с колонками) и типы-значения (простые: строка, число, дата с ограничениями). Готовую схему из стороннего формата (ФНС, банк, маркетплейс) загружают в этот же узел командой импорта схемы XML.
Ниже — как спроектировать структуру, собрать схему двумя способами, задать типы и ограничения, проверить по ней XML и не споткнуться на типичных ошибках.
Что такое XSD в связке с 1С
XSD (XML Schema Definition) — это описание того, какие элементы и атрибуты допустимы в XML-файле, в каком порядке они идут, какого типа каждое значение и что обязательно, а что нет. Для обмена данными схема — договор между вашей системой и внешней: обе стороны знают, как выглядит корректный документ.
В 1С схему не держат «просто файлом». Её загружают в пакет XDTO — внутреннее представление схемы в конфигурации. После этого платформа умеет:
- 📥 читать XML по схеме в объект XDTO и проверять его на лету;
- 📤 записывать объект XDTO обратно в XML, который гарантированно пройдёт валидацию у получателя;
- 🔗 сопоставлять XSD-типы с типами 1С (строка →
Строка, целое →Числои так далее).
То есть XSD в 1С — это не самоцель, а вход и выход механизма XDTO. Поэтому почти все задачи «создать схему» сводятся к работе с пакетами XDTO.
Как выглядит минимальная схема на одну строку заказа — для ориентира:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://company.ru/exchange/orders"
elementFormDefault="qualified">
<xs:complexType name="Заказ">
<xs:sequence>
<xs:element name="Номер" type="xs:string"/>
<xs:element name="Дата" type="xs:date"/>
<xs:element name="Сумма" type="xs:decimal"/>
<xs:element name="Комментарий" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Здесь targetNamespace — то самое пространство имён, sequence задаёт жёсткий порядок полей, а minOccurs="0" делает комментарий необязательным. Именно это дерево конфигуратор и строит за вас, когда вы собираете пакет XDTO мышью.
Проектирование структуры перед созданием схемы
Прежде чем открывать конфигуратор, опишите данные на бумаге или в таблице. Схема, нарисованная сразу «в коде», обычно переусложнена.
Определите три вещи:
- Корневой элемент — один документ обмена (например,
Накладная,Заказ,Контрагент). - Состав полей — какие данные входят, их имена и типы (строка, число, дата, булево).
- Обязательность и повторяемость — какое поле может отсутствовать, какое повторяется (строки табличной части).
⚠️ Самая частая ошибка проектирования — смешать в одной схеме два несвязанных документа. Если обмен передаёт и заказы, и платежи, это два корневых типа (или два пакета), а не один «универсальный» элемент с десятком необязательных полей.
Сразу решите, нужны ли атрибуты или всё описывать элементами. В обмене 1С-1С проще всё держать элементами — так читаемее. Атрибуты уместны для служебных признаков: версия формата, идентификатор, валюта суммы.
Способ 1. Собрать пакет XDTO в конфигураторе
Это основной путь, когда формат придумываете вы.
- Откройте конфигуратор, в дереве найдите ветку
Общие → Пакеты XDTO. - Добавьте новый пакет. В свойствах задайте пространство имён — URI вида
http://company.ru/exchange/orders. Он должен быть уникальным и постоянным: по нему получатель опознаёт формат. - Внутри пакета добавьте тип объекта — он станет сложным типом XSD (
complexType). Назовите его по смыслу документа. - В тип объекта добавьте свойства. Для каждого укажите тип значения (
string,int,dateTimeи т. д.) и границы:Нижняя граница = 0делает элемент необязательным,Верхняя граница = -1(без ограничения) — повторяющимся.
Так дерево XDTO один в один превращается в XSD. Платформа сама добавит объявление схемы, пространство имён и зависимости между типами.
💡 Для повторяющихся строк (табличная часть) заведите отдельный тип объекта «СтрокаТаблицы» и сошлитесь на него свойством с верхней границей -1. Получится корректная вложенная структура, а не плоский список полей с номерами.
Когда пакет готов, его можно выгрузить в файл .xsd — это нужно, чтобы передать схему контрагенту, который работает не в 1С. Выгрузка доступна из редактора пакета (сохранение схемы в файл) либо программно (см. раздел ниже).
Способ 2. Написать XSD вручную и импортировать
Когда формат задаёт внешняя сторона (ФНС, оператор ЭДО, банк, маркетплейс), схему не рисуют — её присылают готовой. Её нужно загрузить в конфигурацию.
- Сохраните присланный файл схемы, например
exchange.xsd, в доступную папку. - В конфигураторе встаньте на ветку
Общие → Пакеты XDTO. - Вызовите команду импорта схемы XML (из контекстного меню ветки) и укажите файл
.xsd. - Платформа разберёт схему и создаст пакет XDTO с теми же типами. Если схема ссылается на другие (
import/include), подготовьте и их — импортируйте все зависимые файлы.
После импорта проверьте дерево: имена типов и свойств должны совпасть со схемой. Если контрагент пришлёт новую версию формата, пакет нужно перезагрузить — ручная правка типов рассинхронит вашу копию со схемой.
Сравнение подходов:
| Способ | Когда применять | На что смотреть |
|---|---|---|
| Пакет XDTO в конфигураторе | Формат придумываете вы (внутренний обмен) | Правильное пространство имён, границы свойств |
Ручной .xsd + импорт | Формат задаёт внешняя сторона | Импортировать все зависимые схемы, не править типы руками |
| Программно через построитель | Схему надо отдать наружу из готовой фабрики | Кодировка файла, запись набора схем целиком |
Типы данных и ограничения в схеме
Типы в XSD делятся на простые (значение) и сложные (объект с полями). В пакете XDTO им соответствуют типы-значения и типы объектов.
Базовое сопоставление простых типов:
xs:string→Строка;xs:int,xs:integer,xs:decimal→Число;xs:boolean→Булево;xs:date,xs:dateTime→Дата.
Ограничения (facets) задают допустимые значения. Их добавляют к типу-значению:
maxLength/minLength— длина строки (например, ИНН ровно 10 или 12 знаков);pattern— регулярное выражение (маска счёта, кода, артикула);enumeration— замкнутый список значений (статусы, коды операций);minInclusive/maxInclusive— границы числа;totalDigits/fractionDigits— разрядность суммы.
💡 Ограничения — это то, ради чего вообще нужна схема. XML без facets проверяет только структуру; XML с ними отсекает ещё и мусорные значения (пустой ИНН, отрицательное количество, неизвестный статус) до того, как они попадут в базу.
Пример с маской: для поля ИНН задают тип-значение на базе xs:string с pattern, допускающим только цифры длиной 10 или 12 знаков. Тогда схема сама отклонит буквы и неверную длину — проверять это в коде уже не нужно. Для кода операции удобен enumeration: перечислите допустимые значения, и любое чужое платформа не пропустит при чтении.
Обязательность задаётся не типом, а границами свойства. Нижняя граница = 1 — поле обязательно; 0 — можно опустить. Это частый источник путаницы: тип строки не делает поле обязательным, за это отвечает минимальная граница.
Как проверить XML по созданной схеме
Проверка (валидация) в 1С встроена в чтение через фабрику XDTO. Если XML не соответствует схеме — чтение завершится исключением, и это ровно та проверка, которая нужна в обмене.
Когда схема загружена в конфигурацию, используют глобальную ФабрикаXDTO:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("c:\exchange\order.xml");
ТипДокумента = ФабрикаXDTO.Тип("http://company.ru/exchange/orders", "Заказ");
Попытка
Объект = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипДокумента);
Исключение
Сообщить("Документ не прошёл проверку: " + ОписаниеОшибки());
КонецПопытки;
ЧтениеXML.Закрыть();
Если нужно проверить XML по схеме, которой нет в конфигурации (например, присланной одноразово), постройте фабрику из файла схемы прямо в коде:
ЧтениеСхемы = Новый ЧтениеXML;
ЧтениеСхемы.ОткрытьФайл("c:\exchange\exchange.xsd");
Схема = ПрочитатьСхемуXML(ЧтениеСхемы);
ЧтениеСхемы.Закрыть();
НаборСхем = Новый НаборСхемXML;
НаборСхем.Добавить(Схема);
Фабрика = Новый ФабрикаXDTO(НаборСхем);
Дальше у этой Фабрика всё то же: .Тип(...) и .ПрочитатьXML(...). Чтение само проверит структуру и типы.
xmlns корневого элемента XML с URI пакета XDTO — они должны совпадать посимвольно.minLength, или код вне enumeration. Проверьте конкретное поле из текста ошибки.sequence порядок полей жёсткий — переставьте элементы как в схеме.Генерация и выгрузка схемы программно
Иногда схему нужно отдать контрагенту из уже готовой фабрики — например, выложить актуальный .xsd на обмен. Для этого есть построитель схем.
Построитель = Новый ПостроительСхемыXML;
НаборСхем = Построитель.СоздатьНаборСхемXML(ФабрикаXDTO);
Для Каждого Схема Из НаборСхем Цикл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("c:\exchange\scheme.xsd", "UTF-8");
Схема.Записать(ЗаписьXML);
ЗаписьXML.Закрыть();
КонецЦикла;
Набор может содержать несколько схем, если типы разнесены по разным пространствам имён — тогда каждую пишут в свой файл, а не склеивают в один. Имя файла при этом стоит делать осмысленным: по нему контрагент поймёт, какое пространство имён внутри.
Такой же приём применяют, когда формат обмена нужно задокументировать для внешнего разработчика: вы отдаёте не описание на словах, а готовую схему, по которой он проверит свои XML у себя, не имея доступа к вашей базе.
⚠️ Не выгружайте схему в рабочую папку обмена «на ходу», пока идёт сеанс обмена: получатель может прочитать полуперезаписанный файл. Пишите во временный файл и переименовывайте его после закрытия записи.
Типичные ошибки при создании XSD-схемы
Ошибки здесь делятся на две группы — проектные (схема в принципе неверна) и эксплуатационные (схема верна, но что-то не стыкуется).
Проектные:
- 🔸 Нестабильное пространство имён. URI меняют при каждой правке — и старые документы перестают читаться. Пространство имён задают один раз и хранят как контракт.
- 🔸 Всё необязательное. Нижняя граница 0 у всех полей упрощает запись, но снимает проверку: в базу проходит пустой документ. Обязательные поля должны быть обязательными в схеме.
- 🔸 Плоская структура вместо вложенной. Табличную часть пытаются описать полями
Товар1,Товар2… вместо повторяющегося типа строки. Используйте верхнюю границу-1.
Эксплуатационные:
- 🔸 Схема в конфигурации устарела. Контрагент обновил формат, пакет XDTO — нет. Перезагрузите схему целиком, не правьте типы вручную.
- 🔸 Разные кодировки файла и объявления. Классическая причина нечитаемого XML — лечится единой кодировкой.
- 🔸 Циклические ссылки типов. Тип A содержит B, B содержит A без условия выхода. Разорвите цикл необязательной ссылкой (нижняя граница 0).
Частые вопросы
Можно ли обойтись без XSD и просто читать XML построчно?
ЧтениеXML можно разбирать теги вручную. Но тогда проверку структуры и типов пишете сами. На обмене с внешней системой схема почти всегда дешевле: она ловит ошибки формата до загрузки в базу.Чем пакет XDTO отличается от файла .xsd?
.xsd — это текст схемы. Пакет XDTO — та же схема, загруженная внутрь конфигурации и связанная с типами 1С. Для работы в коде нужен пакет; файл нужен, чтобы передать формат наружу.Как добавить в схему новое поле, не ломая старые документы?
Почему XML, собранный в 1С, не принимает внешняя система?
xmlns и последовательность полей с присланной схемой — в XSD с sequence порядок обязателен.