Работа с внешними системами в современной архитектуре 1С:Предприятие 8 часто требует использования форматов обмена данными, отличных от стандартных. Одним из таких форматов является XDTO (XML Data Transfer Objects). Это мощный механизм, позволяющий передавать сложные структуры данных, сохраняя их типы и ссылочную целостность.
Многие разработчики сталкиваются с необходимостью получить данные из внешнего сервиса, который отдает их именно в этом формате. Процесс чтения такого объекта не всегда очевиден, особенно если вы привыкли работать с простыми XML или JSON. В этой статье мы детально разберем алгоритмы десериализации и обработки входящих пакетов.
Понимание принципов работы с XDTO-пакетами критически важно для интеграционных проектов. Ошибки на этапе чтения могут привести к потере данных или некорректной работе бизнес-логики. Мы рассмотрим как встроенные средства платформы, так и нюансы работы с фабриками объектов.
Подготовка среды и фабрика XDTO
Прежде чем попытаться прочитать входящий поток, необходимо убедиться, что среда выполнения готова к работе с форматом. В 1С ключевую роль играет объект XDTOPackage, который описывает структуру данных. Без корректной фабрики система не сможет сопоставить XML-теги с типами 1С.
Обычно фабрика уже создана на стороне отправителя и передается вместе с данными, либо она формируется динамически на основе метаданных конфигурации.
Для инициализации часто используется встроенный функционал или предварительно сгенерированные расширения. Если вы работаете с внешней системой, убедитесь, что описание типов загружено в память.
Всегда проверяйте версию XDTO-пакета перед началом работы. Несовпадение версий может привести к тому, что новые поля просто не будут прочитаны системой.
Инициализация фабрики — это первый шаг, который нельзя пропускать. Без неё вызов методов чтения завершится ошибкой выполнения, так как интерпретатор не найдет соответствия между именем типа и его реализацией.
Чтение из файла и текстовой строки
Самый распространенный сценарий — получение XML-представления объекта в виде строки или сохраненного файла. Платформа 1С предоставляет удобный метод Прочитать у объекта XDTOPackage. Этот метод универсален и принимает различные источники данных.
Если данные приходят в виде строки, её необходимо предварительно обернуть в поток. Прямая передача строки в метод чтения невозможна, требуется использование класса ЧтениеТекста или ПотокВПамяти. Это обеспечивает корректную обработку кодировки.
Рассмотрим пример чтения из файла на диске. Здесь важно правильно указать путь и режим открытия. Файл должен быть доступен для чтения процессом 1С.
Пакет = Новый XDTOPackage();
Поток = Новый ПотокВПамяти();
Запись = Новый ЗаписьXML();
Запись.УстановитьПоток(Поток);
//.. запись данных в поток..
Чтение = Новый ЧтениеXML();
Чтение.УстановитьПоток(Поток);
Объект = Пакет.Прочитать(Чтение);
При работе с большими объемами данных чтение из файла предпочтительнее, чем работа со строкой в памяти. Это снижает нагрузку на оперативную память сервера или клиента.
☑️ Алгоритм чтения данных
После выполнения метода Прочитать вы получите объект 1С, соответствующий корневому элементу XML. Дальнейшая работа ведется уже со свойствами этого объекта как с обычными свойствами структуры или справочника.
Обработка HTTP-запросов и потоков
В веб-сервисах и HTTP-сервисах 1С данные часто передаются напрямую в теле запроса. В этом случае у разработчика есть доступ к свойству Тело объекта HTTPСервисЗапрос. Это свойство представляет собой поток, который можно напрямую передать в методы чтения XDTO.
Использование потока напрямую экономит ресурсы, так как исключается этап промежуточного сохранения данных в строку или временный файл. Однако нужно быть внимательным к позиции указателя чтения внутри потока.
Если поток уже был частично прочитан (например, для логгирования или проверки заголовков), его позицию необходимо сбросить в начало. Иначе десериализация начнется с середины данных и завершится ошибкой.
⚠️ Внимание: Поток в объекте HTTP-запроса может быть однократным. После чтения убедитесь, что вы не пытаетесь прочитать его повторно без сброса позиции или клонирования.
Для чтения из HTTP-запроса используется следующая последовательность действий. Сначала получаем поток, затем создаем читатель XML и передаем его в пакет.
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьПоток(Запрос.Тело);
Результат = Пакет.Прочитать(ЧтениеXML);
Такой подход является стандартом для реализации методов веб-сервисов, принимающих сложные структуры данных. Он обеспечивает высокую производительность при обработке множества одновременных запросов.
Навигация по свойствам объекта
После успешной десериализации перед вами оказывается объект, структура которого определена в пакете. Доступ к данным осуществляется через стандартные свойства. Имена свойств соответствуют именам полей в XML, с учетом регистра.
Если объект содержит вложенные структуры или коллекции, доступ к ним осуществляется иерархически. Важно проверять наличие значений перед обращением, так как отсутствующие в XML поля могут быть неопределены (Неопределено).
Работа с коллекциями XDTO аналогична работе с обычными массивами 1С. Вы можете iterating по ним или обращаться к элементам по индексу. Типы элементов коллекции также определяются метаданными пакета.
В таблице ниже приведены основные типы данных и способы обращения к ним после чтения:
| Тип данных XDTO | Тип в 1С | Особенности доступа |
|---|---|---|
| xs:string | Строка | Прямое чтение свойства |
| xs:int | Число | Автоматическое преобразование |
| xs:dateTime | Дата | Требуется проверка на пустую дату |
| xs:boolean | Булево | Значения Истина/Ложь |
Особое внимание следует уделить полям типа Дата. В XML они могут иметь различные форматы записи, но 1С старается привести их к своему внутреннему представлению автоматически.
Обработка ошибок и валидация
Процесс чтения XDTO не всегда проходит гладко. Структура входящих данных может отличаться от ожидаемой, либо данные могут быть повреждены при передаче. Платформа 1С генерирует исключения при критических ошибках парсинга.
Рекомендуется оборачивать код чтения в конструкцию Попытка..Исключение. Это позволит перехватить ошибку и записать её в журнал регистрации, не останавливая работу всего сервиса.
Кроме того, стоит выполнять логическую валидацию прочитанных данных. Например, проверять обязательные поля на заполненность или соответствие значений допустимым диапазонам. Структурная валидация (соответствие схеме) происходит автоматически при чтении, если включена соответствующая опция.
⚠️ Внимание: Никогда не доверяйте данным извне без проверки. Даже если чтение прошло успешно, значения в полях могут быть логически неверными для вашей бизнес-логики.
Для отладки проблем с чтением полезно выводить содержимое исходного XML в текстовый файл. Это поможет увидеть расхождения между ожидаемой и реальной структурой документа.
Что делать, если чтение завершается ошибкой типа?
Убедитесь, что пространство имен (Namespace) в XML совпадает с пространством имен в XDTOPackage. Часто ошибка кроется именно в различии префиксов или URI.
Специфика работы с ссылочными типами
Одной из самых мощных возможностей XDTO является поддержка ссылок. Если в XML передаются ссылки на объекты (например, ссылки на справочники), они могут быть восстановлены в виде полноценных объектов 1С или оставаться в виде строковых представлений.
Поведение зависит от настроек фабрики и типа ссылки. В некоторых случаях требуется дополнительная процедура разрешения ссылок. Это особенно актуально при обмене между двумя разными базами данных 1С.
Если объект содержит ссылку на элемент, который не существует в текущей базе, свойство может вернуть Неопределено или специальную заглушку. Логика обработки таких ситуаций должна быть прописана явно в коде обработчика.
При записи объекта обратно в XDTO ссылки сериализуются особым образом. При чтении важно понимать, ожидаете ли вы получить готовый объект ссылки или только его идентификатор.
Ссылочные типы в XDTO требуют внимательной настройки контекста выполнения. Без правильного маппинга ссылок данные могут потерять связь с объектами базы.
Часто задаваемые вопросы (FAQ)
Можно ли прочитать XDTO без предварительного создания пакета?
Нет, объект XDTOPackage обязателен. Он содержит метаданные, необходимые для корректной интерпретации XML-тегов и создания объектов нужных типов в памяти 1С. Без него система не поймет, какой тип 1С соответствует узлу XML.
Как обработать файл XDTO, если он имеет кодировку UTF-16?
Класс ЧтениеXML автоматически определяет кодировку по BOM (маркеру последовательности байтов) в начале файла. Если маркера нет, можно явно указать кодировку в свойствах читателя перед вызовом метода Прочитать у пакета.
Почему при чтении некоторые поля остаются пустыми?
Это может происходить по нескольким причинам: имя поля в XML не совпадает с именем свойства в типе 1С (учитывается регистр), поле отсутствует в описании типа в пакете, или в самом XML документе значение не передано.
Можно ли модифицировать объект после чтения и сохранить его обратно?
Да, прочитанный объект является полноценным объектом 1С. Вы можете изменять его свойства, добавлять элементы в коллекции, а затем использовать метод Записать у объекта XDTOPackage для обратной сериализации.