Создание и проверка XSD-схемы в 1С через механизм XDTO

· 9 мин

Содержание

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. Корневой элемент — один документ обмена (например, Накладная, Заказ, Контрагент).
  2. Состав полей — какие данные входят, их имена и типы (строка, число, дата, булево).
  3. Обязательность и повторяемость — какое поле может отсутствовать, какое повторяется (строки табличной части).

⚠️ Самая частая ошибка проектирования — смешать в одной схеме два несвязанных документа. Если обмен передаёт и заказы, и платежи, это два корневых типа (или два пакета), а не один «универсальный» элемент с десятком необязательных полей.

Сразу решите, нужны ли атрибуты или всё описывать элементами. В обмене 1С-1С проще всё держать элементами — так читаемее. Атрибуты уместны для служебных признаков: версия формата, идентификатор, валюта суммы.

Проверить перед созданием схемы
Выполнено: 0 / 5

Способ 1. Собрать пакет XDTO в конфигураторе

Это основной путь, когда формат придумываете вы.

  1. Откройте конфигуратор, в дереве найдите ветку Общие → Пакеты XDTO.
  2. Добавьте новый пакет. В свойствах задайте пространство имён — URI вида http://company.ru/exchange/orders. Он должен быть уникальным и постоянным: по нему получатель опознаёт формат.
  3. Внутри пакета добавьте тип объекта — он станет сложным типом XSD (complexType). Назовите его по смыслу документа.
  4. В тип объекта добавьте свойства. Для каждого укажите тип значения (string, int, dateTime и т. д.) и границы: Нижняя граница = 0 делает элемент необязательным, Верхняя граница = -1 (без ограничения) — повторяющимся.

Так дерево XDTO один в один превращается в XSD. Платформа сама добавит объявление схемы, пространство имён и зависимости между типами.

💡 Для повторяющихся строк (табличная часть) заведите отдельный тип объекта «СтрокаТаблицы» и сошлитесь на него свойством с верхней границей -1. Получится корректная вложенная структура, а не плоский список полей с номерами.

Когда пакет готов, его можно выгрузить в файл .xsd — это нужно, чтобы передать схему контрагенту, который работает не в 1С. Выгрузка доступна из редактора пакета (сохранение схемы в файл) либо программно (см. раздел ниже).

Способ 2. Написать XSD вручную и импортировать

Когда формат задаёт внешняя сторона (ФНС, оператор ЭДО, банк, маркетплейс), схему не рисуют — её присылают готовой. Её нужно загрузить в конфигурацию.

  1. Сохраните присланный файл схемы, например exchange.xsd, в доступную папку.
  2. В конфигураторе встаньте на ветку Общие → Пакеты XDTO.
  3. Вызовите команду импорта схемы XML (из контекстного меню ветки) и укажите файл .xsd.
  4. Платформа разберёт схему и создаст пакет 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(...). Чтение само проверит структуру и типы.

Диагностика: выберите симптом

Генерация и выгрузка схемы программно

Иногда схему нужно отдать контрагенту из уже готовой фабрики — например, выложить актуальный .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С. Для работы в коде нужен пакет; файл нужен, чтобы передать формат наружу.
Как добавить в схему новое поле, не ломая старые документы?
Сделайте новое поле необязательным (нижняя граница 0). Тогда документы старого образца, где этого поля нет, по-прежнему пройдут проверку, а новые смогут его передавать.
Почему XML, собранный в 1С, не принимает внешняя система?
Чаще всего расходится пространство имён или порядок элементов. Сверьте xmlns и последовательность полей с присланной схемой — в XSD с sequence порядок обязателен.
Нужна ли отдельная схема на каждый документ обмена?
Нет. В одном пакете XDTO держат несколько типов одного обмена с общим пространством имён. Отдельный пакет заводят, когда форматы независимы и живут своей версией.