Работа с форматом XDTO (XML Data Transfer Object) является неотъемлемой частью интеграции внешних систем с платформой 1С:Предприятие 8. Этот механизм позволяет передавать сложные структуры данных в виде XML, сохраняя типы значений и ссылки на объекты. Однако для разработчика часто встает задача не просто получить XML-поток, а корректно прочитать его содержимое, преобразовав в понятные для платформы объекты.

Процесс чтения объекта зависит от того, на какой стороне происходит взаимодействие: на стороне сервера 1С или на стороне внешнего клиента. Важно понимать, что XDTO-объект — это не просто текст, а строго типизированная структура, описание которой хранится в пакете XDTO. Без подключения соответствующего пакета чтение данных превратится в хаотичный разбор XML-узлов.

В данной статье мы детально разберем алгоритмы чтения данных, рассмотрим типичные ошибки при десериализации и определим, как правильно извлекать значения из вложенных структур. Мы не будем затрагивать базовые понятия XML, а сосредоточимся именно на инструментарии платформы для работы с транспортными объектами.

Основы работы с пакетами XDTO

Прежде чем пытаться прочитать данные, необходимо убедиться, что платформа знает, как интерпретировать входящую структуру. Для этого используется механизм пакетов XDTO. Пакет содержит описание всех типов, которые могут встретиться в передаваемом XML-документе. Если вы пытаетесь прочитать объект, тип которого не описан в подключенном пакете, система выдаст ошибку или вернет некорректные данные.

Подключение пакета обычно происходит на старте приложения или в момент инициализации обработчика веб-сервиса. Вы можете использовать как встроенные пакеты, так и сгенерированные вручную через конфигуратор. Критически важно, чтобы пространство имен (namespace) в XML совпадало с URI подключенного пакета. В противном случае механизм сериализации просто не найдет соответствия.

⚠️ Внимание: При чтении данных из внешних источников всегда проверяйте версию пакета XDTO. Если внешняя система обновила структуру данных, а ваш пакет остался старым, чтение завершится ошибкой или потерей части информации.

Для работы с пакетами используется объект ПакетXDTO. Его можно получить через менеджера XDTO или загрузить из файла конфигурации. После подключения пакета система автоматически регистрирует фабрики для создания объектов соответствующих типов. Это позволяет платформе понимать, какой класс 1С должен быть создан при встрече с определенным XML-тегом.

💡

Если вы разрабатываете интеграцию с нуля, начните с экспорта пакета XDTO из конфигурации-источника. Это гарантирует, что типы данных на обеих сторонах будут идентичны.

Чтение из XML-потока на сервере

Наиболее распространенный сценарий — получение XML-данных через HTTP-запрос или чтение из файла на сервере. В этом случае данные приходят в виде потока байтов или текста. Первым шагом является создание объекта чтения XML. Платформа 1С предоставляет мощный инструмент ЧтениеXML, который позволяет поэлементно проходить по структуре документа.

Однако для работы именно с XDTO удобнее использовать объект СерийаторXDTO. Он автоматически преобразует XML-поток в объекты 1С, используя метаданные подключенного пакета. Вам не нужно вручную парсить теги и атрибуты. Достаточно передать поток в метод Прочитать(), и вы получите готовый объект с заполненными реквизитами.

Чтение = Новый ЧтениеXML;

Чтение.УстановитьСтроку(XMLСтрока);

Серийатор = Новый СерийаторXDTO(Пакет);

Объект = Серийатор.Прочитать(Чтение);

Важно контролировать состояние чтения. Если XML-документ поврежден или не соответствует схеме, метод Прочитать() может выбросить исключение. Поэтому всегда оборачивайте операцию чтения в конструкцию Попытка..Исключение. Это позволит логировать ошибку и не останавливать работу всего сервиса при получении некорректного запроса от внешнего партнера.

☑️ Проверка перед чтением потока

Выполнено: 0 / 4

Обработка входящих данных в веб-сервисах

При публикации веб-сервисов на основе XDTO платформа 1С берет на себя большую часть работы по сериализации и десериализации. Когда внешний клиент отправляет запрос, 1С автоматически преобразует XML в аргументы метода. Но иногда возникает необходимость прочитать "сырой" XML или обработать объект динамически, когда тип заранее неизвестен.

В таких случаях используется параметр типа Структура или Соответствие, куда можно принять данные. Также можно объявить параметр метода как XDTO.ЛюбойОбъект (если тип определен в пакете). Это дает гибкость: вы можете проверить тип пришедшего объекта с помощью оператора ТипЗнч() и выполнить специфическую логику в зависимости от него.

  • 📦 Используйте строгую типизацию аргументов для стандартных операций, чтобы платформа сама валидировала данные.
  • 🔍 Применяйте динамическое чтение, если веб-сервис должен принимать разнородные документы от разных контрагентов.
  • 🛡️ Всегда проверяйте свойство Пустой у прочитанного объекта перед обращением к его полям.

Особое внимание стоит уделить коллекциям. Если в XML передан массив объектов, в 1С он будет представлен объектом МассивXDTO или стандартным массивом, в зависимости от настроек сериализации. Итерация по таким коллекциям ничем не отличается от работы с обычными массивами, но типы элементов внутри могут быть разнородными.

Как обработать ошибку типа в веб-сервисе?

Если тип пришедшего объекта не совпадает с ожидаемым, метод вернет ошибку SOAP. Чтобы избежать этого, используйте параметр типа "Любой" и выполняйте ручную проверку типов внутри кода метода.

Извлечение значений и навигация по объекту

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

Для безопасного чтения рекомендуется сначала проверить наличие свойства с помощью метода Свойство() или ПолучитьСвойство(). Это особенно актуально при работе с версиями форматов, где в новых версиях могут появляться дополнительные поля, а в старых — отсутствовать некоторые обязательные на первый взгляд данные.

Метод доступа Описание Возвращаемое значение
Объект.Свойство Прямое обращение Значение свойства или Ошибка
Объект.Получить("Имя") Динамическое получение Значение или Неопределено
Объект.Свойство("Имя", Значение) Проверка существования Булево (Истина/Ложь)

При чтении ссылочных типов (например, ссылка на Документ или Справочник) Если передана ссылка, вам потребуется дополнительно вызвать метод ПолучитьОбъект() для загрузки данных из базы. Если передан объект, данные уже находятся в памяти.

💡

Всегда используйте метод Свойство() перед чтением, если структура данных может варьироваться в зависимости от версии внешнего интерфейса. Это предотвратит падение скрипта.

Работа с коллекциями и вложенными структурами

Сложные бизнес-документы часто содержат табличные части или вложенные списки. В формате XDTO они представляются как коллекции объектов. Чтение таких структур требует организации цикла. Важно правильно определить тип коллекции: это может быть Массив, СписокЗначений или специализированный ТаблицаXDTO.

При итерации по коллекции помните, что каждый элемент также является XDTO-объектом. Рекурсивный обход может понадобиться, если структура данных имеет произвольную глубину вложенности. В таких случаях удобно использовать рекурсивную функцию, которая проверяет тип элемента и либо извлекает данные, либо запускает себя для вложенной коллекции.

⚠️ Внимание: При чтении больших коллекций (тысячи строк) следите за потреблением памяти. Чтение огромного XML-документа в память может привести к исчерпанию ресурсов сервера 1С.

Если вам нужно прочитать только часть данных из большой коллекции, рассмотрите возможность использования потокового чтения XML вместо полной десериализации в объект XDTO. Это позволит обрабатывать элементы по одному, не загружая весь документ в оперативную память сразу.

📊 С каким объемом данных вы чаще всего работаете в XDTO?
До 100 записей
100-1000 записей
Более 1000 записей
Только одиночные объекты

Типичные ошибки и отладка

Процесс чтения XDTO-объектов редко проходит без ошибок, особенно на этапе отладки интеграции. Самая частая проблема — несоответствие типов данных. Например, когда в XML передано строковое значение "100", а в пакете XDTO свойство объявлено как Число. Сериайтор не сможет автоматически преобразовать данные и выбросит исключение.

Для диагностики таких проблем используйте встроенный отладчик 1С и логи сериализации. Включите подробное протоколирование обмена данными, чтобы видеть "сырой" XML, который приходит на вход. Часто ошибка кроется не в коде 1С, а в том, что внешняя система формирует XML с нарушением схемы (например, лишние пробелы в числах или неверный формат даты).

  • ❌ Ошибка "Тип не найден": проверьте подключение пакета XDTO и пространство имен.
  • ❌ Ошибка "Неверный формат значения": проверьте локали и форматы дат/чисел в XML.
  • ❌ Ошибка "Свойство не найдено": убедитесь, что имя свойства в коде совпадает с именем в схеме XDTO (регистр важен!).

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

Что делать, если чтение завершается успешно, но данные пустые?

Проверьте, соответствует ли корневой элемент XML ожидаемому типу. Возможно, вы читаете узел, который является оберткой, а не самим объектом данных. Также убедитесь, что кодировка XML совпадает с кодировкой, ожидаемой сериайтором.

Можно ли читать XDTO без подключения пакета?

Технически можно прочитать XML как текст или использовать общий парсер XML, но тогда вы потеряете преимущества типизации XDTO. Вам придется вручную сопоставлять теги полям объектов, что значительно усложняет код и делает его менее надежным.

Как обработать дату в формате, отличном от стандарта 1С?

XDTO поддерживает стандартные форматы дат ISO 8601. Если внешняя система использует свой формат, вам придется прочитать поле как Строку, а затем вручную преобразовать её в дату 1С с помощью функции Дата() или регулярных выражений.