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

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

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

Стандартная сериализация объектов 1С в XML

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

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

Рассмотрим базовый пример кода, который демонстрирует процесс выгрузки справочника "Номенклатура":

Процедура ВыгрузитьСправочникВXML()

Элемент = Справочники.Номенклатура.НайтиПоНаименованию("Товар А");

Если Элемент = Неопределено Тогда

Возврат;

КонецЕсли;

Запись = Новый ЗаписьXML();

Запись.УстановитьСтроку();

// Сериализация объекта

Элемент.ЗаписатьXML(Запись);

Результат = Запись.ЗакрытьИПолучитьСтроку();

Сообщить(Результат);

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

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

💡

При сериализации объектов с большим количеством реквизитов используйте сжатие потока (например, GZip) перед отправкой по сети, чтобы сократить объем передаваемых данных в 5-10 раз.

Ручное формирование XML через ЗаписьXML

Когда стандартная сериализация не подходит из-за требований внешнего API, на помощь приходит ручное формирование документа. Объект ЗаписьXML позволяет программисту полностью контролировать структуру выходного файла, имена тегов, атрибуты и пространства имен. Этот метод требует больше кода, но дает гибкость, необходимую для сложных интеграционных проектов.

Процесс начинается с открытия элемента, записи его атрибутов и содержимого, а затем закрытия элемента. Нарушение порядка вызова методов (например, попытка записать текст до открытия тега) приведет к ошибке выполнения. Особое внимание следует уделить экранированию специальных символов, хотя объект записи делает это автоматически при использовании метода ЗаписатьТекст().

Ниже приведен пример создания простого документа заказа с ручной структурой:

Процедура СоздатьЗаказВручную()

Запись = Новый ЗаписьXML();

Запись.УстановитьСтроку();

Запись.ЗаписатьНачалоЭлемента("Order");

Запись.ЗаписатьАтрибут("ID", "12345");

Запись.ЗаписатьАтрибут("Date", ТекущаяДата());

Запись.ЗаписатьНачалоЭлемента("Items");

// Первая позиция

Запись.ЗаписатьНачалоЭлемента("Item");

Запись.ЗаписатьАтрибут("Name", "Товар 1");

Запись.ЗаписатьАтрибут("Qty", 10);

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

Запись.ЗаписатьКонецЭлемента(); // Items

Запись.ЗаписатьКонецЭлемента(); // Order

СтрокаXML = Запись.ЗакрытьИПолучитьСтроку();

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

  • 🔹 Используйте метод ЗаписатьАтрибут() для метаданных, которые не являются основным содержимым узла.
  • 🔹 Всегда закрывайте открытые элементы в обратном порядке их открытия, чтобы не нарушить иерархию дерева.
  • 🔹 Для вставки готовых XML-фрагмент внутрь текущего узла используйте метод ЗаписатьXML() с параметром-строкой.
📊 Какой метод формирования XML вы используете чаще?
Стандартная сериализация
Ручная запись через ЗаписьXML
Сторонние библиотеки
Конструктор запросов

Чтение и десериализация данных из XML

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

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

Алгоритм чтения обычно строится на цикле, который перебирает узлы до конца файла. Для навигации используются методы Прочитать() и проверка свойства ТипУзла. Если вы ожидаете строго определенную структуру, полезно использовать проверку имен элементов перед попыткой чтения данных из них.

Процедура ПрочитатьЗаказИзXML(СтрокаXML)

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

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

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

Если Чтение.Имя = "Item" Тогда

ИмяТовара = Чтение.ПолучитьАтрибут("Name");

Количество = Чтение.ПолучитьАтрибут("Qty");

// Логика создания элемента справочника

КонецЕсли;

КонецЕсли;

КонецЦикла;

Чтение.Закрыть();

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

Что делать, если XML содержит некорректные символы?

Если входящий файл содержит символы, недопустимые в XML (например, некоторые управляющие символы ASCII), чтение прервется с ошибкой. В таком случае необходимо предварительно очистить строку регулярными выражениями или использовать режим чтения с игнорированием ошибок, если платформа позволяет.

Работа с XDTO пакетами и типизацией

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

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

⚠️ Внимание: При использовании XDTO убедитесь, что типы данных в пакете точно соответствуют типам в конфигурации. Несоответствие типов (например, Число вместо Строка) приведет к ошибке сериализации или потере данных при преобразовании.

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

Метод Сложность внедрения Гибкость Рекомендуемое применение
ЗаписатьXML() Низкая Низкая Внутреннее хранение, простой экспорт
ЗаписьXML (ручная) Средняя Высокая Интеграция со сторонними API, кастомные форматы
XDTO пакеты Высокая Средняя Веб-сервисы SOAP, строгие контракты обмена
JSON (альтернатива) Средняя Высокая REST-сервисы, мобильные приложения

Обработка ошибок и валидация структуры

Надежность системы обмена данными напрямую зависит от качества обработки ошибок. XML-файлы, приходящие извне, могут быть повреждены, иметь неверную кодировку или не соответствовать ожидаемой схеме. Игнорирование этих факторов может привести к тому, что процесс импорта остановится на середине, оставив базу данных в inconsistent состоянии.

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

  • 🔸 Всегда проверяйте свойство EOF() (КонецФайла) при чтении, чтобы избежать зацикливания.
  • 🔸 Используйте Попытка..Исключение вокруг операций парсинга дат и чисел, так как формат может отличаться от регионального.
  • 🔸 Реализуйте механизм транзакционности: если ошибка возникла при загрузке 50-го элемента из 100, вся пачка должна откатиться.

⚠️ Внимание: Интерфейсы внешних систем и требования к форматам XML могут изменяться без уведомления. Регулярно сверяйте структуру входящих файлов с документацией партнера или техническим заданием, особенно после обновлений на стороне контрагента.

☑️ Контроль качества XML-обмена

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

Оптимизация производительности при больших объемах

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

Объект ЧтениеXML поддерживает установку файла напрямую через метод УстановитьФайл(). Это позволяет обрабатывать данные по частям, не удерживая весь документ в памяти. Кроме того, отключение проверки DTD и пространств имен, если они не требуются, может ускорить парсинг на 20-30%.

Еще одним приемом оптимизации является отключение обновлений интерфейса во время выполнения тяжелой операции загрузки. Использование конструкции БлокировкаИзмененияДанных или временное отключение обновлений форм поможет избежать подвисания клиентского приложения.

💡

Для обработки файлов размером более 100 МБ обязательно используйте потоковое чтение с диска и отключайте обновлении экрана интерфейса на время выполнения операции.

Можно ли выгрузить в XML регистры сведений?

Да, регистры сведений можно выгрузить, но напрямую метод ЗаписатьXML() для набора записей регистра может работать не так, как для документов. Обычно требуется сначала выбрать данные запросом в таблицу значений, а затем сериализовать эту таблицу. Это дает дополнительный контроль над отбираемыми полями.

Как сохранить кириллицу в XML без кракозябр?

Проблема кодировки решается указанием параметра UTF-8 при создании объекта ЗаписьXML или при сохранении файла. Метод ЗаписатьПролог() позволяет явно указать версию XML и кодировку в первой строке файла, что гарантирует корректное отображение русских символов в любых редакторах.

В чем разница между ЗаписатьXML и XMLСериализатор?

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

Как обработать XML с пространствами имен (namespace)?

При чтении таких файлов необходимо использовать методы получения узлов с учетом пространства имен или временно игнорировать их, обращаясь только к локальному имени узла (Имя вместо ПолноеИмя). При записи нужно явно объявлять пространства имен через ЗаписатьАтрибут() с префиксом xmlns.