Импорт XML-схемы в 1С 8.3: XDTO-пакет, фабрика и проверка файлов

· 9 мин

Содержание

Загрузить XSD в 1С можно двумя путями. Первый — импортировать схему в конфигурацию: в конфигураторе откройте ветку Общие → XDTO-пакеты, в контекстном меню выберите Импорт XML-схемы... и укажите файл .xsd. Второй — загрузить схему прямо из кода, без изменения конфигурации: функция СоздатьФабрикуXDTO("путь к файлу.xsd") строит фабрику по схеме на лету.

Импорт в XDTO-пакет выбирают, когда формат постоянный: обмен с контрагентом, веб-сервис, своя интеграция. Загрузку из кода — когда схема меняется часто, приходит от внешней системы (как схемы форматов ФНС) или нужна разово, например чтобы проверить XML-файл перед отправкой. Есть и третий путь — собрать фабрику через построитель схем, если схема лежит в макете или строке.

СпособГде работаетКогда выбиратьОграничения
Импорт в XDTO-пакетКонфигуратор, конфигурация или расширениеПостоянный формат обмена, веб-сервисыНужно право менять конфигурацию, обновление БД
СоздатьФабрикуXDTOКод на сервере, внешняя обработкаРазовая проверка, схемы от внешних системСхема читается при каждом вызове, типы не видны в дереве метаданных
ПостроительСхемXML + Новый ФабрикаXDTOКод на сервереСхема из нескольких файлов, схема хранится не в файле, а в строке или макетеЧуть больше кода

Что проверить в XSD-файле до загрузки в 1С

Большинство неудачных импортов ломаются не в 1С, а на самом файле. Пять минут проверки до загрузки избавляют от повторов.

  • 📄 Корректность XML. Откройте файл в любом редакторе с подсветкой XML и убедитесь, что он парсится: закрыты все теги, нет посторонних символов до <?xml ...?>.
  • 🔤 Кодировка. Чаще всего UTF-8, у схем ФНС встречается windows-1251. Кодировка в прологе должна совпадать с реальной кодировкой файла.
  • 🏷️ Пространство имён. Найдите атрибут targetNamespace в корневом элементе xs:schema. Именно по этому URI вы потом будете обращаться к типам из кода. У части схем (например, у форматов ФНС) атрибута нет — это допустимо, пространство имён будет пустым.
  • 🔗 Зависимости. Поищите в файле xs:import и xs:include. Если они есть, рядом должны лежать файлы из атрибута schemaLocation, и сохранить нужно ту же структуру папок.
  • 🔁 Конфликты. В одной конфигурации не может быть двух XDTO-пакетов с одним пространством имён. В типовых конфигурациях уже есть пакеты, например для формата EnterpriseData, — сверьте URI.

Если схема ссылается на стандартные пространства имён (например, XML-подписи http://www.w3.org/2000/09/xmldsig#), такую зависимость тоже придётся загрузить отдельной схемой — сама по себе она в конфигурации не появится.

Как загрузить XSD в конфигураторе через XDTO-пакет

Это основной способ для разработчика. Пакет становится частью конфигурации, его типы доступны через глобальную ФабрикаXDTO в любом серверном модуле.

Шаг 1. Подготовьте конфигурацию

  1. Откройте базу в конфигураторе и выполните Конфигурация → Открыть конфигурацию.
  2. Если конфигурация типовая и стоит на поддержке, добавлять объекты в неё без включения возможности изменений нельзя. Лучше не снимать её с поддержки, а создать расширение и импортировать схему туда: XDTO-пакеты в расширениях тоже поддерживаются.
  3. Если база подключена к хранилищу конфигурации, захватите корень конфигурации — без этого новый объект добавить не получится.

Перед любыми изменениями рабочей конфигурации сделайте выгрузку информационной базы в .dt или резервную копию средствами СУБД.

Шаг 2. Импортируйте схему

  1. В дереве конфигурации раскройте Общие и найдите ветку XDTO-пакеты.
  2. Щёлкните по ней правой кнопкой мыши и выберите Импорт XML-схемы....
  3. Укажите файл .xsd. Если схема зависит от других файлов, начните с базовой схемы — той, на которую ссылаются остальные, — а потом импортируйте зависимые.
  4. Платформа создаст новый XDTO-пакет. Дайте ему понятное имя латиницей или кириллицей, например ОбменСоСкладом_v2.

Шаг 3. Проверьте результат

Откройте пакет двойным щелчком. В редакторе видно:

  • поле с пространством имён — оно должно совпадать с targetNamespace из файла;
  • список типов объектов и типов значений, перенесённых из схемы;
  • глобальные свойства — корневые элементы схемы;
  • список импортируемых пакетов, если схема ссылалась на другие пространства имён.

Если какой-то тип отсутствует, вернитесь к зависимостям: обычно не загружен файл, на который ссылается xs:import.

Шаг 4. Сохраните и обновите базу

Сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (клавиша F7). Структура таблиц от XDTO-пакета не меняется, но без обновления конфигурации базы новый пакет не будет доступен пользователям в режиме Предприятия. Для расширения — сохраните его и обновите расширение в базе.

Готовый пакет можно выгрузить обратно в файл: в контекстном меню пакета есть команда Экспорт XML-схемы.... Это удобно, чтобы отдать схему контрагенту или сравнить с исходником.

Загрузка XSD-схемы из кода, без изменения конфигурации

Когда схему нельзя или не хочется вносить в конфигурацию, её загружают во время работы программы. Так делают внешние обработки, которые проверяют регламентированные файлы, и интеграции, где схема приходит вместе с данными.

Вариант 1. Одной функцией из файла

&НаСервере
Функция ФабрикаПоСхеме(ПутьКСхеме)
    // ПутьКСхеме — полный путь к .xsd на сервере 1С
    Возврат СоздатьФабрикуXDTO(ПутьКСхеме);
КонецФункции

Функция выполняется на сервере, поэтому и путь должен быть доступен серверу 1С, а не компьютеру пользователя. Если файл выбирает пользователь:

  1. На клиенте поместите файл во временное хранилище (НачатьПомещениеФайлаНаСервер или ПоместитьВоВременноеХранилище).
  2. На сервере получите двоичные данные через ПолучитьИзВременногоХранилища.
  3. Запишите их во временный файл: ИмяФайла = ПолучитьИмяВременногоФайла("xsd"), затем ДвоичныеДанные.Записать(ИмяФайла).
  4. Передайте ИмяФайла в СоздатьФабрикуXDTO, а после работы удалите временный файл через УдалитьФайлы.

Вариант 2. Через построитель схем

Этот вариант нужен, когда схема хранится не в файле, а в макете или строке, либо когда требуется сначала собрать набор из нескольких схем.

&НаСервере
Функция ФабрикаИзСтроки(ТекстСхемы)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТекстСхемы);

    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(Чтение);
    Чтение.Закрыть();

    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументDOM);

    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);

    Возврат Новый ФабрикаXDTO(НаборСхем);
КонецФункции

Для нескольких связанных схем повторите чтение для каждого файла и добавьте все объекты СхемаXML в один НаборСхемXML до создания фабрики.

Внешнюю обработку пользователь откроет, только если у него есть право на интерактивное открытие внешних обработок. В конфигурациях на БСП такие обработки обычно подключают через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.

Проверка XML-файла по загруженной схеме

Самый частый практический сценарий — убедиться, что выгруженный файл соответствует формату до отправки. Проверку в 1С выполняет XDTO: файл читается в объект по типу из схемы, а метод Проверить() сверяет объект с ограничениями схемы.

&НаСервере
Функция ПроверитьXMLПоСхеме(ПутьКСхеме, ПутьКФайлу)
    Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме);

    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ПутьКФайлу);

    Попытка
        Объект = Фабрика.ПрочитатьXML(Чтение);
        Объект.Проверить();
        Результат = "Файл соответствует схеме";
    Исключение
        Результат = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;

    Чтение.Закрыть();
    Возврат Результат;
КонецФункции

Как это работает:

  1. ПрочитатьXML без указания типа определяет тип по корневому элементу файла — он должен быть объявлен в схеме как глобальный.
  2. Уже на чтении платформа отбрасывает файл, если встречает неизвестный элемент или значение не того типа.
  3. Проверить() дополнительно проверяет ограничения: обязательность, длину строк, перечисления, шаблоны.
  4. Текст ошибки содержит имя свойства, на котором споткнулась проверка, — по нему легко найти место в файле.

Если пакет уже импортирован в конфигурацию, вместо СоздатьФабрикуXDTO используйте глобальную ФабрикаXDTO, а тип задайте явно:

Тип = ФабрикаXDTO.Тип("http://example.ru/exchange/v2", "Документ");
Объект = ФабрикаXDTO.ПрочитатьXML(Чтение, Тип);

Для разовой проверки файла без программирования подойдут внешние XML-редакторы с функцией валидации по XSD. Но если файл формирует 1С, проверку лучше встроить в саму выгрузку — ошибка всплывёт до отправки, а не после отказа приёмной стороны.

Как работать с типами схемы после импорта

Загрузить схему — половина задачи. Дальше по ней формируют и читают файлы обмена.

Создание и запись объекта:

Пространство = "http://example.ru/exchange/v2";
ТипДокумента = ФабрикаXDTO.Тип(Пространство, "Документ");

Документ = ФабрикаXDTO.Создать(ТипДокумента);
Документ.Номер = "А-125";
Документ.Дата  = ТекущаяДатаСеанса();

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(Запись, Документ);
Запись.Закрыть();

Имена свойств (Номер, Дата) берутся из схемы как есть — с учётом регистра и языка. Если в XSD элементы названы латиницей, обращайтесь к ним латиницей.

Полезные приёмы:

  • 🧩 Для свойства-списка (в схеме maxOccurs="unbounded") значение — СписокXDTO, новые элементы добавляют методом Добавить().
  • 🧭 Тип вложенного объекта удобно получать через свойство родителя: Документ.Свойства().Получить("Строки").Тип.
  • 🧪 Перед записью вызывайте Документ.Проверить() — ошибки найдутся до того, как файл уйдёт контрагенту.

Ошибки при загрузке XSD и чтении файлов

Выберите симптом — откроется причина и порядок действий.

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

Новая версия схемы: как обновить XDTO-пакет

Форматы обмена живут годами и меняются. Чтобы обновление не сломало действующий обмен, договоритесь о порядке заранее.

Если меняется только содержимое

Пространство имён то же, добавились поля или ослабились ограничения. Порядок такой:

  1. Выгрузите текущий пакет через Экспорт XML-схемы... — это ваша страховка.
  2. Удалите старый пакет и импортируйте новую схему, задав пакету то же имя.
  3. Найдите в коде все обращения к удалённым или переименованным свойствам: глобальный поиск по имени свойства в модулях.
  4. Сравните файлы обмена до и после: сформируйте XML по старой и новой схеме на одних данных.

Если меняется пространство имён

Многие форматы включают номер версии прямо в URI. Тогда старый и новый пакеты могут жить рядом:

СитуацияЧто делать
Контрагенты переходят на новую версию постепенноДержите оба пакета, выбирайте фабрику по версии в файле
Старая версия больше не принимаетсяУдалите старый пакет после проверки, что код на него не ссылается
Схему меняет внешняя система без вашего участияЗагружайте её из кода через СоздатьФабрикуXDTO, не храня в конфигурации

Как не потерять историю:

  • 🗂️ Храните исходные .xsd рядом с проектом в системе контроля версий, с номером версии в имени папки.
  • 📝 В комментарии к XDTO-пакету укажите дату и источник схемы.
  • 🔍 Перед обновлением рабочей базы сравните конфигурации через Конфигурация → Сравнить, объединить с конфигурацией из файла... — изменения в пакете будут видны в отчёте о сравнении.

Частые вопросы

Можно ли загрузить XSD в 1С без конфигуратора?
Да. Функция СоздатьФабрикуXDTO строит фабрику по файлу схемы прямо во время работы. Её используют во внешних обработках, конфигурацию при этом менять не нужно.
Чем XDTO-пакет отличается от WS-ссылки?
XDTO-пакет описывает только типы данных из XSD. WS-ссылка создаётся импортом WSDL и описывает веб-сервис целиком: операции, адреса и вложенные схемы типов.
Нужно ли обновлять конфигурацию базы после импорта XSD?
Да. Таблицы не меняются, но без обновления конфигурации базы новый пакет не будет доступен в режиме Предприятия.
Можно ли добавить XSD-схему в типовую конфигурацию, не снимая её с поддержки?
Да, через расширение конфигурации: создайте расширение и импортируйте схему в его ветку XDTO-пакетов.
Почему ФабрикаXDTO не видит загруженную схему во внешней обработке?
Глобальная ФабрикаXDTO знает только пакеты конфигурации и подключённых расширений. Для схемы, загруженной из файла, используйте фабрику, которую вернула СоздатьФабрикуXDTO.