К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как работать с XML — чтение, запись и обмен данными

Практическое руководство по работе с XML в 1С: чтение и запись файлов, XDTO-пакеты, обмен данными, типовые ошибки и способы проверки результата.

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

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

Какие инструменты работы с XML есть в платформе 1С

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

Третий подход — XDTO (XML Data Transfer Objects): механизм работы с XML по формальной схеме XSD. Платформа проверяет соответствие данных схеме, что критично для обмена с внешними системами. Четвёртый — готовые планы обмена и универсальная обработка «Выгрузка и загрузка данных XML», которая переносит данные между базами с идентичной конфигурацией без программирования.

Сравнение способов работы с XML

ЧтениеXML / ЗаписьXML

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

Сериализация ЗаписатьXML / ПрочитатьXML

Быстрая выгрузка объектов конфигурации между базами одной структуры. Не подходит для обмена с внешними системами.

XDTO-пакеты

Обмен по XSD-схеме с валидацией типов. Требует подготовки схемы и более сложной настройки.

Универсальная обработка обмена

Перенос данных без кода между идентичными конфигурациями. Не работает при различиях в структуре метаданных.

Как записать данные в XML-файл

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

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

Запись.ОткрытьФайл("C:\Обмен\Товары.xml");

Запись.ЗаписатьОбъявлениеXML();

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

Запрос = Новый Запрос("ВЫБРАТЬ Наименование, Код ИЗ Справочник.Номенклатура");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

Запись.ЗаписатьАтрибут("Код", Выборка.Код);

Запись.ЗаписатьТекст(Выборка.Наименование);

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

КонецЦикла;

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

Запись.Закрыть();

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

Порядок записи XML-файла
  1. 1
    Создайте объект ЗаписьXML и откройте файл методом ОткрытьФайл
  2. 2
    Запишите объявление XML и корневой элемент
  3. 3
    В цикле запишите элементы данных с атрибутами и текстом
  4. 4
    Закройте все элементы в обратном порядке и вызовите Закрыть()
  5. 5
    Откройте файл в редакторе и убедитесь, что структура валидна

Как прочитать и разобрать XML-файл

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

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

Чтение.ОткрытьФайл("C:\Обмен\Товары.xml");

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

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

И Чтение.Имя = "Товар" Тогда

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

// дальнейшая обработка: поиск или создание элемента справочника

КонецЕсли;

КонецЦикла;

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

Типичная логика загрузки: по атрибуту или тексту элемента ищется существующий объект в базе (по коду, наименованию, ИНН), при отсутствии создаётся новый. Перед записью объекта полезно проверять заполненность обязательных реквизитов, чтобы не создать «пустышки». Если файл получен извне, обрабатывайте ситуацию отсутствия ожидаемых атрибутов — метод ПолучитьАтрибут вернёт Неопределено, и обращение к нему без проверки вызовет ошибку.

Сериализация объектов конфигурации в XML

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

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

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

ЗаписатьXML(Запись, ДокументОбъект);

СтрокаXML = Запись.Закрыть();

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

Обмен по схеме через XDTO-пакеты

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

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

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

bsl
Фабрика = ФабрикаXDTO;
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
ОбъектXDTO = Фабрика.ПрочитатьXML(Чтение);
Чтение.Закрыть();

Типовые ошибки и как их избежать

Большинство проблем при работе с XML в 1С связано с кодировкой, пространствами имён и незакрытыми файлами. Кодировка по умолчанию — UTF-8, но внешние системы иногда отдают файлы в windows-1251; признак проблемы — «кракозябры» вместо кириллицы. Кодировку можно указать явно при открытии файла на запись.

Вторая частая причина ошибок — пространства имён. Если в файле элементы объявлены с префиксом пространства имён, сравнение Чтение.Имя с простым именем элемента не сработает: используйте свойство ЛокальноеИмя или проверяйте URIПространстваИмен. Третья группа ошибок — попытка прочитать несуществующий файл или файл нулевого размера: всегда проверяйте существование через объект Файл перед открытием.

Типичные ошибки
01
Не вызван Закрыть() у ЗаписьXML — файл остаётся пустым или обрезанным и заблокированным до перезапуска сеанса
02
Сравнение имени элемента без учёта пространства имён — узлы не находятся, загрузка молча пропускает данные
03
Загрузка без проверки дублей — при повторном запуске создаются копии элементов справочников
04
Чтение файла в чужой кодировке — кириллица превращается в нечитаемые символы
05
Отсутствие обработки исключений — один повреждённый узел прерывает загрузку всего файла

Как проверить результат обмена

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

После загрузки сверьте контрольные числа: количество созданных и обновлённых объектов должно совпадать с количеством узлов в файле. Для справочников дополнительно проверьте отсутствие дублей по ключевым полям (код, ИНН, наименование) и отсутствие элементов с незаполненными обязательными реквизитами.

Контрольные точки

Как проверить результат

Открытие XML-файла в браузере
Норма

Документ отображается деревом без ошибок синтаксиса

Тревожный признак

Сообщение об ошибке разбора, незакрытые теги

Количество загруженных объектов
Норма

Совпадает с количеством узлов данных в файле

Тревожный признак

Объектов меньше (пропуски) или больше (дубли)

Кириллица в данных
Норма

Текст читается корректно

Тревожный признак

Кракозябры — неверная кодировка файла

Ссылки в загруженных документах
Норма

Все ссылки разрешаются в реальные объекты

Тревожный признак

Битые ссылки вида «Объект не найден»

Часто задаваемые вопросы

Можно ли работать с XML в 1С без программирования?

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

Чем XDTO отличается от обычного ЧтениеXML?

ЧтениеXML просто проходит по узлам файла, и проверку структуры вы выполняете вручную. XDTO работает по схеме XSD: фабрика сама контролирует типы, обязательность элементов и порядок следования, выдавая ошибку валидации при несоответствии.

Как обработать очень большой XML-файл?

Используйте потоковое ЧтениеXML — оно не загружает документ в память целиком. Дополнительно разбивайте загрузку на транзакции по порциям узлов и при необходимости выполняйте её в фоновом задании, чтобы не блокировать работу пользователей.

Почему при чтении файла элементы не находятся по имени?

Чаще всего причина в пространстве имён: свойство Имя возвращает полное имя с префиксом. Используйте свойство ЛокальноеИмя для сравнения или проверяйте URIПространстваИмен отдельно.

Как перенести один документ из одной базы 1С в другую?

Если конфигурации идентичны, сериализуйте объект функцией ЗаписатьXML, передайте строку и восстановите через ПрочитатьXML в базе-приёмнике. Убедитесь, что связанные объекты (контрагент, договор, номенклатура) там уже существуют, иначе получите битые ссылки.

Что делать, если внешняя система прислала XML в другой кодировке?

Уточните кодировку у отправителя и укажите её явно при открытии файла — параметр кодировки есть у методов ОткрытьФайл у объектов ЧтениеXML и ЗаписьXML. Не пересохраняйте файл вручную в редакторах без необходимости, чтобы не потерять данные.

Итог

Что важно запомнить

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