Разработка и Конфигурация · 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.
Сравнение вариантов
Подходит для переноса данных между конфигурациями 1С без программирования. Не подходит для произвольных форматов внешних систем.
Полный ручной контроль структуры файла. Требует написания кода и аккуратной работы с элементами и кодировкой.
Работа по 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С работает под своей учётной записью, и у неё должны быть права на запись в целевой каталог. Ошибка «Отказано в доступе» при «ОткрытьФайл» почти всегда означает проблему прав, а не кода.
Проверка сформированного файла
После формирования файл нужно проверить до отправки получателю. Минимальная проверка — открыть файл в браузере или текстовом редакторе: браузеры показывают ошибки разбора XML с указанием строки. Если файл не открывается как дерево, структура нарушена.
Вторая проверка — чтение файла обратно в 1С через «ЧтениеXML» или «ФабрикаXDTO.ПрочитатьXML». Если файл читается без исключений и данные совпадают с источником, структура корректна.
Третья проверка — валидация по XSD-схеме получателя, если она есть. Для этого можно использовать XDTO-пакет, импортированный из схемы получателя: попытка прочитать ваш файл через эту фабрику сразу покажет несоответствия обязательных полей и типов.
Как проверить результат
Структура отображается без сообщений об ошибке разбора
Браузер показывает ошибку с номером строки — ищите незакрытый элемент или спецсимвол
Русские наименования читаемы, в объявлении указан UTF-8
Крякозябры или вопросительные знаки вместо текста
Чтение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 гибче и проще для небольших форматов без схемы, но все проверки структуры ложатся на разработчика.