XDTO 1С: что это, фабрика, объекты и работа с XML

Дата: 02.10.2026 17:34:55
XDTO
XML
Обмен данными
Интеграции 1С
Программирование 1С
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

XDTO 1С — механизм платформы 1С:Предприятие 8.3, который описывает данные типами по модели XML-схемы и сам переводит объекты в XML и обратно. Вместо ручной записи каждого тега через ЗаписьXML вы создаёте объект нужного типа, заполняете свойства и отдаёте его фабрике: она проверит структуру, расставит пространства имён и запишет документ. На XDTO построены SOAP-веб-сервисы, формат обмена EnterpriseData и выгрузка объектов через СериализаторXDTO.

Что такое XDTO 1С и зачем он нужен

XDTO расшифровывается как XML Data Transfer Objects. У каждого уровня модели есть объект встроенного языка:

УровеньОбъектНазначение
ФабрикаФабрикаXDTOхранит пакеты, создаёт объекты, читает и пишет XML
ПакетПакетXDTOтипы одного пространства имён (URI), аналог XSD-схемы
Тип значенияТипЗначенияXDTOпростой тип и его ограничения (фасеты)
Тип объектаТипОбъектаXDTOсоставной тип со свойствами
СвойствоСвойствоXDTOимя, тип, границы, форма: элемент, атрибут или текст
ЭкземплярыЗначениеXDTO, ОбъектXDTOзначение простого типа и объект составного
СписокСписокXDTOзначение свойства с верхней границей больше единицы

Глобальная ФабрикаXDTO уже содержит пакеты конфигурации и платформы, включая типы XML-схемы вроде xs:string и xs:decimal. Тип задаётся парой «пространство имён + имя», в текстах ошибок — {URI}Имя.

Где встречается XDTO:

  • Веб-сервисы и WS-ссылки — параметры SOAP-операций описаны типами XDTO, у WS-прокси своя ФабрикаXDTO.
  • EnterpriseData — формат обмена типовых конфигураций, набор пакетов XDTO; со стороны пользователя это синхронизация данных.
  • Выгрузка объектов — СериализаторXDTO пишет справочники, документы и ссылки; на нём же строят обмен по планам обмена между одинаковыми конфигурациями.
  • Интеграции по чужой XSD — банк, оператор ЭДО или маркетплейс присылает схему, её импортируют в пакет.

Выбор транспорта для обмена разобран в обзоре способов обмена данными. Объекты XDTO доступны на сервере, в толстом клиенте и во внешнем соединении, а в тонком и веб-клиенте их нет, поэтому весь код ниже серверный: общий модуль с флажком «Сервер» или процедуры &НаСервере.

Пакет XDTO: создание в конфигураторе и импорт XSD

Пакет — объект метаданных в ветке «Общие → XDTO-пакеты». Создать его можно двумя способами:

  1. Вручную. Задайте имя и пространство имён вида http://компания/xdto/тема/версия, добавьте типы значений и типы объектов, а типам объектов — свойства с типом, границами и формой. Свойство на уровне самого пакета — корневой элемент документа, по нему фабрика узнаёт тип при чтении.
  2. Импортом XSD. Команда «Импорт XML-схемы…» в контекстном меню ветки «XDTO-пакеты» создаёт пакет с типами и фасетами из схемы. Обратная команда «Экспорт XML-схемы…» отдаёт XSD вашего пакета партнёру.

Примеры статьи используют условный пакет ЗаказыКлиентов с пространством имён http://1c-only.ru/xdto/orders/1.0:

ТипВидСвойства
ИННтип значенияна основе xs:string, длина 10–12 символов
Контрагенттип объектаНаименование, ИНН, КПП (0..1)
СтрокаЗаказатип объектаАртикул, Количество, Цена, Сумма (xs:decimal)
ЗаказКлиентатип объектаатрибут Версия (0..1); элементы Номер, Дата (xs:dateTime), Клиент, Позиция (1..-1), Комментарий (0..1)

Свойство пакета Заказ типа ЗаказКлиента — корневой элемент. Имена типа и элемента различаются нарочно: объект создают по имени типа, а записывают под именем элемента. Схему можно импортировать и сразу запускать код:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://1c-only.ru/xdto/orders/1.0"
           targetNamespace="http://1c-only.ru/xdto/orders/1.0"
           elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:simpleType name="ИНН">
    <xs:restriction base="xs:string">
      <xs:minLength value="10"/>
      <xs:maxLength value="12"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="Контрагент">
    <xs:sequence>
      <xs:element name="Наименование" type="xs:string"/>
      <xs:element name="ИНН" type="tns:ИНН"/>
      <xs:element name="КПП" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="СтрокаЗаказа">
    <xs:sequence>
      <xs:element name="Артикул" type="xs:string"/>
      <xs:element name="Количество" type="xs:decimal"/>
      <xs:element name="Цена" type="xs:decimal"/>
      <xs:element name="Сумма" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ЗаказКлиента">
    <xs:sequence>
      <xs:element name="Номер" type="xs:string"/>
      <xs:element name="Дата" type="xs:dateTime"/>
      <xs:element name="Клиент" type="tns:Контрагент"/>
      <xs:element name="Позиция" type="tns:СтрокаЗаказа" maxOccurs="unbounded"/>
      <xs:element name="Комментарий" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="Версия" type="xs:string"/>
  </xs:complexType>
  <xs:element name="Заказ" type="tns:ЗаказКлиента"/>
</xs:schema>

Документ по этой схеме:

<?xml version="1.0" encoding="UTF-8"?>
<Заказ xmlns="http://1c-only.ru/xdto/orders/1.0" Версия="1.0">
  <Номер>А-125</Номер>
  <Дата>2026-10-02T10:30:00</Дата>
  <Клиент>
    <Наименование>ООО Ромашка</Наименование>
    <ИНН>7700000000</ИНН>
  </Клиент>
  <Позиция>
    <Артикул>SKU-001</Артикул>
    <Количество>2</Количество>
    <Цена>1500</Цена>
    <Сумма>3000</Сумма>
  </Позиция>
</Заказ>

При записи платформа может добавить объявления xmlns:xs, xmlns:xsi и свои префиксы — смысл документа от этого не меняется.

ФабрикаXDTO: объект по типу пакета и его свойства

// Общий модуль ОбменЗаказамиXDTO: флажок «Сервер», остальные сняты.
// Пакет XDTO ЗаказыКлиентов, пространство имен http://1c-only.ru/xdto/orders/1.0.

Функция ПространствоИмен() Экспорт
    Возврат "http://1c-only.ru/xdto/orders/1.0";
КонецФункции

Функция ТипПакета(ИмяТипа) Экспорт
    ТипXDTO = ФабрикаXDTO.Тип(ПространствоИмен(), ИмяТипа);
    Если ТипXDTO = Неопределено Тогда
        ВызватьИсключение СтрШаблон("Тип XDTO {%1}%2 не найден", ПространствоИмен(), ИмяТипа);
    КонецЕсли;
    Возврат ТипXDTO;
КонецФункции

// Позиции - таблица значений с колонками Артикул, Количество, Цена.
Функция НовыйЗаказXDTO(НомерЗаказа, ДатаЗаказа, НаименованиеКлиента, ИННКлиента, Позиции) Экспорт

    Заказ = ФабрикаXDTO.Создать(ТипПакета("ЗаказКлиента"));
    Заказ.Версия = "1.0"; // свойство с формой "Атрибут"
    Заказ.Номер = НомерЗаказа;
    Заказ.Дата = ДатаЗаказа;

    Клиент = ФабрикаXDTO.Создать(ТипПакета("Контрагент"));
    Клиент.Наименование = НаименованиеКлиента;
    Клиент.ИНН = ИННКлиента; // фасеты типа ИНН проверяются уже здесь
    Заказ.Клиент = Клиент;

    ТипСтроки = ТипПакета("СтрокаЗаказа");
    Для Каждого СтрокаТаблицы Из Позиции Цикл
        Позиция = ФабрикаXDTO.Создать(ТипСтроки);
        Позиция.Артикул = СтрокаТаблицы.Артикул;
        Позиция.Количество = СтрокаТаблицы.Количество;
        Позиция.Цена = СтрокаТаблицы.Цена;
        Позиция.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
        Заказ.Позиция.Добавить(Позиция); // верхняя граница -1: значение свойства - СписокXDTO
    КонецЦикла;

    Возврат Заказ;

КонецФункции
  • ФабрикаXDTO.Тип() при опечатке в URI или имени возвращает Неопределено, и ошибка всплывает позже, на Создать(). Поэтому ТипПакета() проверяет результат сразу.
  • Создать() возвращает пустой ОбъектXDTO. Свойства заполняются через точку, вложенный объект создаётся отдельно и присваивается целиком.
  • Число и Дата преобразуются в xs:decimal и xs:dateTime автоматически. Фасеты проверяются при присваивании: ИНН из пяти символов остановит код на этой строке.
  • Свойство с верхней границей -1 (maxOccurs="unbounded") — это СписокXDTO с методом Добавить().

Запись в XML и метод Проверить()

// Общий модуль ОбменЗаказамиXDTO (продолжение).

Процедура ПроверитьОбъектXDTO(ОбъектXDTO) Экспорт
    Попытка
        ОбъектXDTO.Проверить();
    Исключение
        ВызватьИсключение СтрШаблон("Объект типа %1 не соответствует пакету:%2%3",
            ОбъектXDTO.Тип().Имя, Символы.ПС, ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

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

Процедура ЗаписатьЗаказВФайл(Заказ, ИмяФайла) Экспорт
    ПроверитьОбъектXDTO(Заказ);
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
    Попытка
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Заказ, "Заказ", ПространствоИмен());
    Исключение
        ЗаписьXML.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ЗаписьXML.Закрыть();
КонецПроцедуры

// Пример вызова: строка XML для отправки во внешнюю систему.
Функция ПримерЗаказаXML() Экспорт
    Позиции = Новый ТаблицаЗначений;
    Позиции.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
    Позиции.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Позиции.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    НоваяСтрока = Позиции.Добавить();
    НоваяСтрока.Артикул = "SKU-001";
    НоваяСтрока.Количество = 2;
    НоваяСтрока.Цена = 1500;

    Заказ = НовыйЗаказXDTO("А-125", ТекущаяДатаСеанса(), "ООО Ромашка", "7700000000", Позиции);
    Возврат ЗаказВСтрокуXML(Заказ);
КонецФункции
  • Проверить() сверяет объект с типом — обязательные свойства, число значений — и при нарушении вызывает исключение; обёртка дописывает в его текст тип объекта.
  • ФабрикаXDTO.ЗаписатьXML() принимает ЗаписьXML, объект, имя и URI корневого элемента. Дальше можно передать форму (ФормаXML) и назначение типа (НазначениеТипаXML): при явном назначении в элемент пишется xsi:type.
  • Закрыть() после УстановитьСтроку() возвращает готовый текст XML.

Чтение XML: ФабрикаXDTO.ПрочитатьXML

// Общий модуль ОбменЗаказамиXDTO (продолжение).
// ТекстXML - например, тело POST-запроса, пришедшего в HTTP-сервис.
Функция ПрочитатьЗаказ(ТекстXML) Экспорт

    ТипЗаказа = ТипПакета("ЗаказКлиента");
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ТекстXML);
    Попытка
        Заказ = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипЗаказа);
    Исключение
        ЧтениеXML.Закрыть();
        ВызватьИсключение "XML не соответствует пакету ЗаказыКлиентов:" + Символы.ПС + ОписаниеОшибки();
    КонецПопытки;
    ЧтениеXML.Закрыть();

    ПроверитьОбъектXDTO(Заказ);

    Результат = Новый Структура;
    Результат.Вставить("Номер", Заказ.Номер);
    Результат.Вставить("Дата", Заказ.Дата); // xs:dateTime -> Дата
    Результат.Вставить("ИНН", Заказ.Клиент.ИНН);
    Результат.Вставить("Комментарий", "");
    Если Заказ.Установлено("Комментарий") Тогда
        Результат.Комментарий = Заказ.Комментарий;
    КонецЕсли;

    Позиции = Новый Массив;
    Для Каждого Позиция Из Заказ.Позиция Цикл
        // xs:decimal приходит Числом, разбирать строки не нужно
        Позиции.Добавить(Новый Структура("Артикул, Количество, Цена",
            Позиция.Артикул, Позиция.Количество, Позиция.Цена));
    КонецЦикла;
    Результат.Вставить("Позиции", Позиции);

    Возврат Результат;

КонецФункции
  • Тип передан явно. Без него фабрика ищет тип по xsi:type или по имени и пространству имён корня, а не найдя, возвращает объект открытого типа anyType: имена доступны, но значения приходят строками, и проверка ничего не ловит.
  • Установлено() отличает непереданное необязательное свойство от пустого значения.
  • Значения уже приведены к типам 1С: xs:decimal — Число, xs:dateTime — Дата.
  • Как получить тело запроса в обработчике, показано в статье про HTTP-сервис 1С.

ТипОбъектаXDTO: свойства, границы и формы

Структуру пакета из чужой XSD быстрее посмотреть кодом, чем в дереве конфигуратора:

// Общий модуль ОбменЗаказамиXDTO (продолжение).
// Вызов: ОписаниеТипаXDTO(ПространствоИмен(), "ЗаказКлиента").
Функция ОписаниеТипаXDTO(URIПространстваИмен, ИмяТипа) Экспорт

    ТипXDTO = ФабрикаXDTO.Тип(URIПространстваИмен, ИмяТипа);
    Если ТипXDTO = Неопределено Тогда
        Возврат СтрШаблон("Тип {%1}%2 не найден", URIПространстваИмен, ИмяТипа);
    ИначеЕсли ТипЗнч(ТипXDTO) = Тип("ТипЗначенияXDTO") Тогда
        Возврат СтрШаблон("%1 - тип значения на основе %2", ИмяТипа, ТипXDTO.БазовыйТип.Имя);
    КонецЕсли;

    Описание = Новый Массив;
    Описание.Добавить(СтрШаблон("%1 - тип объекта, открытый: %2",
        ИмяТипа, Формат(ТипXDTO.Открытый, "БЛ=нет; БИ=да")));
    Для Каждого Свойство Из ТипXDTO.Свойства Цикл
        Если Свойство.ВерхняяГраница = -1 Тогда
            Граница = "*";
        Иначе
            Граница = Формат(Свойство.ВерхняяГраница, "ЧГ=0");
        КонецЕсли;
        Описание.Добавить(СтрШаблон("  %1: %2 [%3..%4], форма: %5", Свойство.Имя,
            Свойство.Тип.Имя, Свойство.НижняяГраница, Граница, Свойство.Форма));
    КонецЦикла;

    Возврат СтрСоединить(Описание, Символы.ПС);

КонецФункции

// Чтение свойства по имени строкой: подходит и для имен вроде "order-id",
// которые нельзя написать через точку.
Функция ЗначениеСвойства(ОбъектXDTO, ИмяСвойства, ЗначениеПоУмолчанию = Неопределено) Экспорт
    Если ОбъектXDTO.Установлено(ИмяСвойства) Тогда
        Возврат ОбъектXDTO.Получить(ИмяСвойства);
    КонецЕсли;
    Возврат ЗначениеПоУмолчанию;
КонецФункции
  • Тип() возвращает ТипЗначенияXDTO или ТипОбъектаXDTO, поэтому ветки разделены через ТипЗнч(); коллекция Свойства у типа объекта состоит из СвойствоXDTO.
  • Открытый тип принимает свойства, которых нет в схеме, — так устроен anyType.
  • Имена вроде order-id через точку не записать — для них есть Получить() и Установить() с именем строкой.

Фабрика XDTO из XSD без изменения конфигурации

Во внешнюю обработку пакет XDTO не добавить. Выход — собрать фабрику из XSD во время работы:

// Модуль объекта внешней обработки. XSD из начала статьи лежит
// в макете СхемаЗаказов с типом «Текстовый документ».

Функция ФабрикаЗаказов() Экспорт

    ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("xsd");
    ПолучитьМакет("СхемаЗаказов").Записать(ИмяФайлаСхемы, КодировкаТекста.UTF8);
    Попытка
        Фабрика = СоздатьФабрикуXDTO(ИмяФайлаСхемы);
    Исключение
        УдалитьФайлы(ИмяФайлаСхемы);
        ВызватьИсключение;
    КонецПопытки;
    УдалитьФайлы(ИмяФайлаСхемы);

    Возврат Фабрика;

КонецФункции

Функция ЗаказИзСтроки(ТекстXML, Фабрика) Экспорт

    ТипЗаказа = Фабрика.Тип("http://1c-only.ru/xdto/orders/1.0", "ЗаказКлиента");
    Если ТипЗаказа = Неопределено Тогда
        ВызватьИсключение "В схеме нет типа ЗаказКлиента";
    КонецЕсли;

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ТекстXML);
    Попытка
        Заказ = Фабрика.ПрочитатьXML(ЧтениеXML, ТипЗаказа);
        Заказ.Проверить();
    Исключение
        ЧтениеXML.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ЧтениеXML.Закрыть();

    Возврат Заказ;

КонецФункции

Функция НомераЗаказов(ТекстыXML) Экспорт
    Фабрика = ФабрикаЗаказов(); // схема разбирается один раз на всю пачку
    Номера = Новый Массив;
    Для Каждого ТекстXML Из ТекстыXML Цикл
        Номера.Добавить(ЗаказИзСтроки(ТекстXML, Фабрика).Номер);
    КонецЦикла;
    Возврат Номера;
КонецФункции
  • СоздатьФабрикуXDTO() читает схему из файла, поэтому макет сохраняется во временный файл. Без файла то же делает цепочка ПостроительDOM → ПостроительСхемXML → Новый ФабрикаXDTO(НаборСхем).
  • Глобальная ФабрикаXDTO о таких типах не знает: создавать, читать и записывать объекты нужно методами той же фабрики.

СериализаторXDTO: объекты и ссылки конфигурации

Для объектов конфигурации свой пакет не нужен: платформа описывает их в пространстве имён http://v8.1c.ru/8.1/data/enterprise/current-config типами вида CatalogObject.Номенклатура и CatalogRef.Номенклатура. Пишет и читает их СериализаторXDTO:

// Общий модуль ПереносНоменклатурыXML, флажок «Сервер».
// Перенос элементов справочника между базами с одинаковой конфигурацией.

Процедура ВыгрузитьНоменклатуру(МассивСсылок, ИмяФайла) Экспорт

    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config");

    Для Каждого Ссылка Из МассивСсылок Цикл
        Объект = Ссылка.ПолучитьОбъект();
        Если Объект <> Неопределено Тогда // битые ссылки пропускаем
            СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное);
        КонецЕсли;
    КонецЦикла;

    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.Закрыть();

КонецПроцедуры

Функция ЗагрузитьНоменклатуру(ИмяФайла) Экспорт

    Загружено = 0;
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    ЧтениеXML.ПерейтиКСодержимому(); // корневой элемент Данные
    ЧтениеXML.Прочитать();           // первый объект внутри него

    НачатьТранзакцию();
    Попытка
        Пока СериализаторXDTO.ВозможностьЧтенияXML(ЧтениеXML) Цикл
            Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
            Если ТипЗнч(Объект) <> Тип("СправочникОбъект.Номенклатура") Тогда
                ВызватьИсключение "Неожиданный тип в файле: " + Строка(ТипЗнч(Объект));
            КонецЕсли;
            Объект.ОбменДанными.Загрузка = Истина;
            Объект.Записать();
            Загружено = Загружено + 1;
        КонецЦикла;
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ЧтениеXML.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ЧтениеXML.Закрыть();

    Возврат Загружено;

КонецФункции
  • С НазначениеТипаXML.Явное тип записан в каждом элементе, и ВозможностьЧтенияXML() сама понимает, какой объект перед ней. Цикл заканчивается на закрывающем теге корня.
  • Прочитанный объект сохраняет GUID из файла: если такого элемента в базе нет, Записать() создаст его, если есть — перезапишет.
  • ОбменДанными.Загрузка = Истина — признак загрузки, при котором обработчики ПередЗаписью типовых конфигураций пропускают прикладную логику.

Ссылку передают целиком или только идентификатором:

// Общий модуль ПереносНоменклатурыXML (продолжение).

Функция СсылкаЧерезXML(Ссылка) Экспорт

    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Ссылка, НазначениеТипаXML.Явное);
    ТекстXML = ЗаписьXML.Закрыть(); // <CatalogRef.Номенклатура ...>GUID</CatalogRef.Номенклатура>

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ТекстXML);
    ПрочитаннаяСсылка = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
    ЧтениеXML.Закрыть();

    Возврат ПрочитаннаяСсылка; // равна исходной, но наличие в базе не проверено

КонецФункции

// Обратная операция к XMLСтрока(Ссылка), которой GUID кладут в строковое свойство XDTO.
Функция НоменклатураПоGUID(СтрокаGUID) Экспорт

    Ссылка = XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID);

    Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА КАК Найден ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Если Запрос.Выполнить().Пустой() Тогда
        ВызватьИсключение "В базе нет номенклатуры с идентификатором " + СтрокаGUID;
    КонецЕсли;

    Возврат Ссылка;

КонецФункции
  • Сериализатор не проверяет существование объекта: ссылка вернётся, даже если её нет в базе, и отобразится как «<Объект не найден>».
  • XMLСтрока(Ссылка) отдаёт GUID строкой, XMLЗначение() собирает ссылку обратно. В своих пакетах ссылку обычно передают так — GUID в строковом свойстве.
  • В БСП обёртки над сериализатором уже есть: ОбщегоНазначения.ЗначениеВСтрокуXML() и ЗначениеИзСтрокиXML().

Типичные ошибки

Текст ошибки или симптомПричинаЧто сделать
«Переменная не определена (ФабрикаXDTO)»код с XDTO выполняется в тонком или веб-клиентеперенести в &НаСервере или серверный общий модуль
«Ошибка при вызове метода контекста (Создать)»ФабрикаXDTO.Тип() вернул Неопределено из-за опечатки в имени или URIпроверять результат Тип(), хранить URI в одной функции
«Ошибка проверки данных XDTO: Значение: '12345' не соответствует простому типу: {http://1c-only.ru/xdto/orders/1.0}ИНН»значение нарушает фасет: длину, перечисление, шаблон, формат датыпроверять и приводить данные до присваивания
«Ошибка проверки данных XDTO: Структура объекта '/' не соответствует типу: {…}ЗаказКлиента»не заполнено обязательное свойство (например, нет ни одной Позиции) или значений больше верхней границывызывать Проверить() до записи
«Ошибка преобразования данных XDTO: НачалоСвойства: … Форма: Элемент Тип: …»в XML элемент, которого тип в этом месте не ждёт: другое имя, нарушен порядок xs:sequence, чужое пространство имёнсравнить XML со схемой с этого элемента
ошибки нет, но значения пустые или строковыеПрочитатьXML() без типа не узнал корень и вернул anyTypeпередавать тип явно, проверять Тип().URIПространстваИмен
ошибка XDTO с типом {http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogObject.…СериализаторXDTO читает файл из базы с другим составом реквизитовсвой пакет или EnterpriseData

Несовпадение пространства имён — самая частая причина ошибок чтения. URI сравнивается посимвольно: адрес с косой чертой на конце — уже другое пространство. Схема статьи объявлена с elementFormDefault="qualified", поэтому дочерние элементы тоже должны быть в её пространстве: если партнёр ставит префикс только корню (<ns1:Заказ xmlns:ns1="…">), вложенные элементы без префикса для фабрики чужие. Лечится схемой, а не кодом: импортируйте XSD партнёра как есть, а не собирайте пакет по примеру XML.

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

Чем XDTO отличается от ЗаписьXML и DOM?

ЗаписьXML и ЧтениеXML работают потоком: теги, порядок и пространства имён ведёте вы сами. DOM загружает документ в дерево для выборок XPath. XDTO даёт типизированные объекты по схеме и сам проверяет структуру.

Как прочитать XML, для которого нет XSD?

Вызовите ФабрикаXDTO.ПрочитатьXML(ЧтениеXML) без типа: получится объект anyType с доступом по именам элементов. Повторяющийся элемент придёт как СписокXDTO, одиночный — как значение, и код должен обрабатывать оба варианта.

Что выбрать для интеграции: XDTO или JSON?

REST-API сервисов и маркетплейсов обычно работают с JSON, приёмы описаны в статье про JSON в 1С. XDTO выбирают, когда формат задан XSD, нужен SOAP-веб-сервис или обмен в EnterpriseData.

Почему после загрузки через СериализаторXDTO в реквизитах битые ссылки?

Сериализатор переносит ссылки по GUID и не тянет связанные объекты: если единица измерения не попала в файл, реквизит указывает на несуществующий объект. Выгружайте зависимые объекты вместе с основными.

Когда проще заказать

Если 1С нужно подключить к внешней системе по чужой XSD, поднять SOAP-сервис или настроить обмен EnterpriseData, закажите доработку в разделе услуг 1c-only.ru. Приложите схему и пример XML, опишите конфигурацию — разместите задание, и исполнители оценят сроки и стоимость.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.