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

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

Как сформировать XML-файл в 1С 8.3

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

XML — стандартный формат обмена данными между 1С и внешними системами: банками, ЭДО-операторами, сайтами, государственными порталами и другими конфигурациями. В платформе 1С 8.3 сформировать XML-файл можно несколькими способами — от штатных обработок обмена до программной записи через объект «ЗаписьXML» или механизм XDTO.

Выбор способа зависит от задачи. Если нужен разовый обмен между типовыми конфигурациями, достаточно встроенной обработки «Универсальный обмен данными в формате XML». Если формат файла жёстко задан внешней системой (например, выгрузка каталога товаров на маркетплейс), потребуется программная формировка файла с точным контролем структуры элементов и атрибутов.

В материале разобраны основные подходы, приведён рабочий пример кода, показано, как проверить корректность результата, и перечислены ошибки, из-за которых файл не принимается системой-получателем.

Когда какой способ формирования XML выбрать

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

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

Третий подход — механизм XDTO (XML Data Transfer Objects). Конфигурация описывает структуру документа через пакет XDTO (фактически — встроенную XSD-схему), а платформа сама сериализует объекты в XML. Этот вариант оптимален, когда внешняя система предоставляет XSD-схему: веб-сервисы, форматы ФНС, CommerceML.

Сравнение вариантов

Универсальный обмен данными XML

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

Объект ЗаписьXML

Полный ручной контроль структуры файла. Требует написания кода и аккуратной работы с элементами и кодировкой.

XDTO

Работа по XSD-схеме с автоматической валидацией. Требует создания пакета XDTO в конфигураторе, избыточен для простых разовых выгрузок.

Формирование XML через типовую обработку обмена

Обработка «Универсальный обмен данными в формате XML» входит в поставку большинства типовых конфигураций или доступна отдельно. Она работает по правилам обмена, созданным в «Конвертации данных», и позволяет выгрузить справочники, документы и движения в XML-файл.

Порядок действий: откройте обработку через «Файл → Открыть», на закладке «Выгружаемые данные» укажите файл правил обмена, отметьте нужные объекты, задайте имя файла выгрузки и нажмите «Выполнить». Платформа сформирует XML в стандартном формате EnterpriseData или формате конвертации.

Ограничение способа очевидно: структура файла определяется правилами обмена, а не требованиями внешней системы. Если банк, маркетплейс или госпортал ожидает свой формат, типовая обработка не поможет — нужен программный метод.

Программная запись XML через объект «ЗаписьXML»

Объект «ЗаписьXML» — основной инструмент ручной формировки файла. Логика проста: создаётся объект записи, открывается файл, последовательно пишутся объявление XML, элементы, атрибуты и текст, затем файл закрывается.

Типичный пример — выгрузка списка товаров с ценами:

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

Запись.ОткрытьФайл("C:\Обмен\goods.xml", "UTF-8");

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

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

Выборка = Справочники.Номенклатура.Выбрать();

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

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

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

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

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

КонецЦикла;

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

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

Критически важны три момента. Первый — каждый открытый элемент должен быть закрыт методом «ЗаписатьКонецЭлемента», иначе файл будет повреждён. Второй — кодировка указывается при открытии файла; большинство внешних систем ожидают UTF-8. Третий — специальные символы (&, <, >, кавычки) в значениях платформа экранирует автоматически, но если вы собираете XML конкатенацией строк (чего делать не следует), экранирование ложится на вас.

Формирование XML через XDTO и схему

Когда внешняя система предоставляет XSD-схему, надёжнее использовать XDTO. В конфигураторе создаётся пакет XDTO (ветка «Общие → XDTO-пакеты»), в него импортируется схема. Далее в коде создаются объекты XDTO, заполняются свойства, и платформа сериализует их в XML с автоматической проверкой типов.

Упрощённый пример записи объекта XDTO в файл:

Пакет = ФабрикаXDTO.Пакеты.Получить("http://example.com/schema");

Заказ = ФабрикаXDTO.Создать(Пакет.КорневыеСвойства.Получить("Заказ").Тип);

Заказ.Номер = "0001";

Заказ.Дата = ТекущаяДатаСеанса();

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

Запись.ОткрытьФайл("C:\Обмен\order.xml", "UTF-8");

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

ФабрикаXDTO.ЗаписатьXML(Запись, Заказ);

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

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

Запись файла на сервере и на клиенте

В клиент-серверном режиме код, формирующий XML, обычно выполняется на сервере, и файл создаётся в файловой системе сервера, а не компьютера пользователя. Это частая причина «пропавших» файлов: пользователь ищет файл у себя, а он лежит на сервере.

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

Также учитывайте права доступа: серверный процесс 1С работает под своей учётной записью, и у неё должны быть права на запись в целевой каталог. Ошибка «Отказано в доступе» при «ОткрытьФайл» почти всегда означает проблему прав, а не кода.

Типичные ошибки
01
Запись файла в серверном коде с последующим поиском его на клиентском компьютере — файл создаётся на сервере.
02
Незакрытые элементы или пропущенный вызов Закрыть() — файл оказывается обрезанным или пустым.
03
Неверная кодировка: получатель ожидает UTF-8, а файл записан в ANSI, кириллица превращается в нечитаемые символы.
04
Конкатенация строк вместо ЗаписьXML — спецсимволы в данных ломают структуру документа.
05
Запись дат и чисел в строковом виде без приведения к формату получателя (например, дата должна быть ISO 8601).

Проверка сформированного файла

После формирования файл нужно проверить до отправки получателю. Минимальная проверка — открыть файл в браузере или текстовом редакторе: браузеры показывают ошибки разбора XML с указанием строки. Если файл не открывается как дерево, структура нарушена.

Вторая проверка — чтение файла обратно в 1С через «ЧтениеXML» или «ФабрикаXDTO.ПрочитатьXML». Если файл читается без исключений и данные совпадают с источником, структура корректна.

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

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

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

Файл открывается в браузере как дерево элементов
Норма

Структура отображается без сообщений об ошибке разбора

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

Браузер показывает ошибку с номером строки — ищите незакрытый элемент или спецсимвол

Кодировка и кириллица
Норма

Русские наименования читаемы, в объявлении указан UTF-8

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

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

Чтение файла обратно в 1С
Норма

ЧтениеXML или ФабрикаXDTO читают файл без исключений

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

Ошибка чтения — структура не соответствует ожидаемой

Обязательные поля по требованиям получателя
Норма

Все обязательные элементы и атрибуты присутствуют и заполнены

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

Получатель отклоняет файл с указанием отсутствующего поля

Частые вопросы и ограничения

Объём выгрузки имеет практические ограничения. «ЗаписьXML» пишет потоково и справляется с большими файлами, но построение всего документа в памяти (например, через DOM-модель) на сотнях тысяч элементов может привести к нехватке памяти. Для больших выгрузок используйте потоковую запись и, при необходимости, разбивайте данные на несколько файлов.

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

Итог

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

Типовой обмен между конфигурациями делайте универсальной обработкой, произвольный формат — через ЗаписьXML, обмен по XSD-схеме — через XDTO. Всегда закрывайте элементы, указывайте UTF-8, формируйте файл с учётом того, где выполняется код (сервер/клиент), и проверяйте результат чтением обратно или валидацией по схеме получателя.

FAQ

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

Да, если задача — обмен между конфигурациями 1С: используйте обработку «Универсальный обмен данными в формате XML» с готовыми правилами. Для произвольного формата внешней системы без кода не обойтись — потребуется ЗаписьXML или XDTO.

Почему получатель отклоняет файл, хотя он открывается в браузере?

Браузер проверяет только синтаксическую корректность XML. Получатель дополнительно проверяет соответствие своей схеме: обязательные элементы, порядок, типы данных, пространства имён, форматы дат. Валидируйте файл по XSD-схеме получателя.

Какую кодировку указывать при записи файла?

В большинстве интеграций ожидается UTF-8 — указывайте её вторым параметром метода «ОткрытьФайл». Если регламент получателя требует windows-1251 или UTF-16, следуйте регламенту, иначе кириллица будет искажена.

Как выгрузить в XML дату в нужном формате?

При записи через ЗаписьXML даты преобразуйте явно, например функцией «Формат(Дата, "ДФ=yyyy-MM-dd")» для формата ISO. При использовании XDTO тип dateTime сериализуется платформой автоматически в стандартный вид.

Файл создаётся пустым — в чём причина?

Чаще всего не вызван метод «Закрыть» у объекта ЗаписьXML, поэтому буфер не сброшен на диск. Также проверьте, что код записи вообще выполняется (например, запрос вернул пустую выборку) и что у процесса есть права на запись в каталог.

Чем XDTO лучше ручной записи через ЗаписьXML?

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