Разработка и Конфигурация · 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
Полный контроль над структурой файла, работа с большими файлами. Требует ручного описания каждого узла.
Быстрая выгрузка объектов конфигурации между базами одной структуры. Не подходит для обмена с внешними системами.
Обмен по XSD-схеме с валидацией типов. Требует подготовки схемы и более сложной настройки.
Перенос данных без кода между идентичными конфигурациями. Не работает при различиях в структуре метаданных.
Как записать данные в XML-файл
Для формирования XML вручную используется объект ЗаписьXML. Он последовательно записывает элементы, атрибуты и текст, контролируя корректность вложенности тегов. Типовой фрагмент кода выглядит так:
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\Товары.xml");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Товары");
Запрос = Новый Запрос("ВЫБРАТЬ Наименование, Код ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Запись.ЗаписатьНачалоЭлемента("Товар");
Запись.ЗаписатьАтрибут("Код", Выборка.Код);
Запись.ЗаписатьТекст(Выборка.Наименование);
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Ключевые правила: каждый открытый элемент должен быть закрыт, вызов Закрыть() обязателен даже при ошибке (иначе файл останется заблокированным и обрезанным), а спецсимволы вроде амперсанда и угловых скобок платформа экранирует автоматически при записи текста. Признак успешной записи — файл открывается в браузере или редакторе без ошибок синтаксиса и содержит все ожидаемые узлы.
- 1Создайте объект ЗаписьXML и откройте файл методом ОткрытьФайл
- 2Запишите объявление XML и корневой элемент
- 3В цикле запишите элементы данных с атрибутами и текстом
- 4Закройте все элементы в обратном порядке и вызовите Закрыть()
- 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-пакеты уже встроены, и разработчику достаточно использовать готовые процедуры подсистемы обмена данными, не описывая схему вручную.
Фабрика = ФабрикаXDTO;
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
ОбъектXDTO = Фабрика.ПрочитатьXML(Чтение);
Чтение.Закрыть();Типовые ошибки и как их избежать
Большинство проблем при работе с XML в 1С связано с кодировкой, пространствами имён и незакрытыми файлами. Кодировка по умолчанию — UTF-8, но внешние системы иногда отдают файлы в windows-1251; признак проблемы — «кракозябры» вместо кириллицы. Кодировку можно указать явно при открытии файла на запись.
Вторая частая причина ошибок — пространства имён. Если в файле элементы объявлены с префиксом пространства имён, сравнение Чтение.Имя с простым именем элемента не сработает: используйте свойство ЛокальноеИмя или проверяйте URIПространстваИмен. Третья группа ошибок — попытка прочитать несуществующий файл или файл нулевого размера: всегда проверяйте существование через объект Файл перед открытием.
Как проверить результат обмена
После выгрузки откройте полученный файл в браузере или текстовом редакторе с поддержкой XML: синтаксически корректный документ отобразится в виде дерева без сообщений об ошибке. Проверьте наличие объявления XML, корневого элемента и ожидаемого количества узлов данных.
После загрузки сверьте контрольные числа: количество созданных и обновлённых объектов должно совпадать с количеством узлов в файле. Для справочников дополнительно проверьте отсутствие дублей по ключевым полям (код, ИНН, наименование) и отсутствие элементов с незаполненными обязательными реквизитами.
Как проверить результат
Документ отображается деревом без ошибок синтаксиса
Сообщение об ошибке разбора, незакрытые теги
Совпадает с количеством узлов данных в файле
Объектов меньше (пропуски) или больше (дубли)
Текст читается корректно
Кракозябры — неверная кодировка файла
Все ссылки разрешаются в реальные объекты
Битые ссылки вида «Объект не найден»
Часто задаваемые вопросы
Можно ли работать с XML в 1С без программирования?
Да, для переноса данных между базами с идентичной конфигурацией есть типовая обработка «Выгрузка и загрузка данных XML», а во многих конфигурациях встроены готовые обмены (с банками, ЭДО, сайтами). Для нестандартных форматов без кода не обойтись.
Чем XDTO отличается от обычного ЧтениеXML?
ЧтениеXML просто проходит по узлам файла, и проверку структуры вы выполняете вручную. XDTO работает по схеме XSD: фабрика сама контролирует типы, обязательность элементов и порядок следования, выдавая ошибку валидации при несоответствии.
Как обработать очень большой XML-файл?
Используйте потоковое ЧтениеXML — оно не загружает документ в память целиком. Дополнительно разбивайте загрузку на транзакции по порциям узлов и при необходимости выполняйте её в фоновом задании, чтобы не блокировать работу пользователей.
Почему при чтении файла элементы не находятся по имени?
Чаще всего причина в пространстве имён: свойство Имя возвращает полное имя с префиксом. Используйте свойство ЛокальноеИмя для сравнения или проверяйте URIПространстваИмен отдельно.
Как перенести один документ из одной базы 1С в другую?
Если конфигурации идентичны, сериализуйте объект функцией ЗаписатьXML, передайте строку и восстановите через ПрочитатьXML в базе-приёмнике. Убедитесь, что связанные объекты (контрагент, договор, номенклатура) там уже существуют, иначе получите битые ссылки.
Что делать, если внешняя система прислала XML в другой кодировке?
Уточните кодировку у отправителя и укажите её явно при открытии файла — параметр кодировки есть у методов ОткрытьФайл у объектов ЧтениеXML и ЗаписьXML. Не пересохраняйте файл вручную в редакторах без необходимости, чтобы не потерять данные.
Что важно запомнить
Для ручной работы с XML используйте ЧтениеXML и ЗаписьXML, для переноса объектов между идентичными базами — сериализацию, для обмена по схеме — XDTO. Всегда закрывайте файлы, учитывайте кодировку и пространства имён, а загрузку сначала проверяйте на копии базы с контролем количества объектов и отсутствия дублей.