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

В этой статье вы найдёте не только пошаговые инструкции для разных сценариев (от простой выгрузки справочников до сложных иерархических структур), но и уникальные приёмы ускорения процесса — например, как использовать XDTO-пакеты для генерации схем или как избежать ошибок кодировки при работе с кириллицей. Мы также разберём, какие инструменты встроены в платформу 1С 8.3 для упрощения задачи, и когда стоит прибегнуть к внешним обработкам.

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

1. Подготовка к формированию XML: что нужно знать до начала работы

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

  • 📌 Цель выгрузки: для какой системы или сервиса предназначен файл? Например, требования к структуре XML для ФНС, ЭДО или маркетплейсов (Ozon, Wildberries) сильно отличаются.
  • 📌 Источник данных: какие объекты (справочники, документы, регистры) будут участвовать в выгрузке? От этого зависит выбор метода формирования.
  • 📌 Формат и схема: есть ли готовая XSD-схема, по которой нужно формировать XML? Если нет — придётся разрабатывать структуру самостоятельно.

В 1С 8.3 есть несколько способов генерации XML:

  1. Встроенные механизмы (запись XML, XDTO): подходят для простых задач и не требуют дополнительных обработок.
  2. Конструктор выгрузки данных (в типовой конфигурации УТ 11, БП 3.0): удобен для стандартных обменов, но ограничен гибкостью.
  3. Внешние обработки (например, Универсальный обмен данными): позволяют настраивать сложные правила преобразования.
  4. Прямой код на : максимальная гибкость, но требует знаний языка.

Если вы работаете с типовой конфигурацией (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11), проверьте, есть ли в ней готовые обработки для нужного вам обмена. Например, для выгрузки данных в ФНС или ПФР уже предусмотрены стандартные механизмы — их проще адаптировать, чем создавать с нуля.

📊 Какой способ формирования XML вы используете чаще?
Встроенные механизмы 1С
Конструктор выгрузки
Внешние обработки
Пишу код самостоятельно

2. Способ 1: Формирование XML через запись XML (для простых структур)

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

// Создаём объект записи XML

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

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

// Начинаем документ и корневой элемент

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

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

// Выгружаем данные из справочника

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

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

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

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

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

ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем элемент"Товар"

КонецЦикла;

// Закрываем корневой элемент и документ

ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"КаталогТоваров"

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

Этот код создаст файл с такой структурой:

<?xml version="1.0" encoding="UTF-8"?>

<КаталогТоваров>

<Товар Код="00001" Наименование="Стул офисный" />

<Товар Код="00002" Наименование="Стол компьютерный" />

</КаталогТоваров>

⚠️ Внимание: При использовании ЗаписьXML следите за кодировкой. Если в данных есть кириллица, обязательно указывайте "UTF-8" при открытии файла. В противном случае символы превратятся в кракозябры.

☑️ Подготовка к выгрузке через ЗаписьXML

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

3. Способ 2: Использование XDTO для сложных структур

Если вам нужно сформировать XML со сложной иерархией (например, заказ с вложенными позициями, контрагентами и адресами), удобнее использовать XDTO-пакеты. Этот механизм позволяет:

  • 🔹 Описывать структуру данных в виде схемы (аналог XSD).
  • 🔹 Автоматически генерировать XML на основе объектов .
  • 🔹 Валидировать данные перед выгрузкой.

Пример создания XDTO-пакета и формирования XML:

  1. Создайте новый XDTO-пакет в конфигураторе (Файл → Новый → XDTO-пакет).
  2. Импортируйте схему (если есть) или опишите её вручную. Например, для заказа:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="Заказ">

<xs:complexType>

<xs:sequence>

<xs:element name="Номер" type="xs:string"/>

<xs:element name="Дата" type="xs:date"/>

<xs:element name="Позиции">

<xs:complexType>

<xs:sequence>

<xs:element name="Позиция" maxOccurs="unbounded">

<xs:complexType>

<xs:element name="Товар" type="xs:string"/>

<xs:element name="Количество" type="xs:decimal"/>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

Далее в модуле можно сформировать XML на основе этой схемы:

// Создаём фабрику XDTO

ФабрикаXDTO = Новый ФабрикаXDTO;

ФабрикаXDTO.ПространстваИмен.Добавить("http://example.com/orders","orders");

// Создаём объект заказа

ЗаказXDTO = ФабрикаXDTO.Sоздать("http://example.com/orders","Заказ");

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

ЗаказXDTO.Дата = ТекущаяДата;

// Добавляем позиции

Позиции = ЗаказXDTO.Позиции.Добавить;

Позиция = Позиции.Позиция.Добавить;

Позиция.Товар ="Ноутбук";

Позиция.Количество = 2;

// Сериализуем в XML

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

ЗаписьXML.ОткрытьФайл("C:\Export\Заказ.xml");

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

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

⚠️ Внимание: При работе с XDTO убедитесь, что пространства имён в схеме и коде совпадают. Ошибка в URI приведёт к пустому файлу или исключению.

Как проверить корректность XDTO-схемы?

Для валидации схемы можно использовать внешние инструменты, например, XML-валидаторы вроде XML Validator (https://www.xmlvalidation.com/) или плагины для VS Code. В самой ошибки схемы отобразятся при попытке создать объект по некорректному XDTO-пакету.

4. Способ 3: Конструктор выгрузки данных (для типовых конфигураций)

Если вы работаете с типовой конфигурацией (например, 1С:Управление торговлей 11 или 1С:ERP), используйте встроенный Конструктор выгрузки данных. Он позволяет настраивать правила обмена без программирования:

  1. Откройте меню Администрирование → Обмен данными → Настройка обмена.
  2. Создайте новый обмен (например, ВыгрузкаНоменклатурыВXML).
  3. В конструкторе укажите:
    • 📁 Источник данных (справочник Номенклатура).
    • 📄 Формат файла — выберите XML.
    • 🔧 Правила выгрузки — настройте соответствие полей и XML-тегов.
  4. Сохраните настройку и выполните выгрузку.
  5. Преимущество этого метода — скорость настройки. Однако он подходит только для стандартных объектов и не позволяет гибко управлять структурой XML. Например, если нужно выгрузить данные с группировкой или дополнительными расчётами, придётся дописывать код в модуле обработки.

    Способ формирования XML Сложность Гибкость Когда использовать
    ЗаписьXML Низкая Средняя Простые структуры, небольшие объёмы данных
    XDTO Средняя Высокая Сложные иерархические данные, интеграция с внешними системами
    Конструктор выгрузки Низкая Низкая Типовые обмены в стандартных конфигурациях
    Внешние обработки Высокая Максимальная Уникальные форматы, нестандартные требования

    5. Типичные ошибки и как их избежать

    При формировании XML в 1С 8.3 пользователи часто сталкиваются с одними и теми же проблемами. Вот самые распространённые из них и способы их решения:

    • 🚨 Ошибка кодировки: вместо кириллицы в файле появляются знаки ???? или и.

      Решение: всегда указывайте кодировку "UTF-8" при открытии файла. Если данные читаются из внешнего источника (например, Excel), предварительно конвертируйте их в UTF-8.

    • 🚨 Незакрытые теги: XML не проходит валидацию из-за отсутствия закрывающих тегов.

      Решение: используйте ЗаписьXML.ЗаписатьКонецЭлемента для каждого открытого тега. Для упрощения можно обернуть запись в Попытка...Исключение.

    • 🚨 Специальные символы: знаки &, <, > ломают структуру XML.

      Решение: заменяйте их на сущности (&amp;, &lt;, &gt;) с помощью функции СтрЗаменить.

    • 🚨 Ошибки XDTO: при сериализации возникает исключение "Не найден тип XDTO".

      Решение: проверьте, что пространство имён в коде и схеме совпадают, и все типы описаны в XSD.

    ⚠️ Внимание: Если вы работаете с 1С:Предприятием в файловом варианте, убедитесь, что путь к файлу выгрузки доступен для записи. В противном случае возникнет ошибка "Отказано в доступе". Для сетевых папок проверьте права пользователя.

    💡

    Чтобы быстро найти незакрытые теги в большом XML-файле, откройте его в браузере (например, Chrome). Браузер подсветит первую ошибку и укажет строку, где она возникла.

    6. Оптимизация и ускорение выгрузки больших объёмов данных

    Если вам нужно выгрузить тысячи записей (например, весь справочник Контрагенты), стандартные методы могут работать слишком медленно. Вот несколько приёмов для ускорения:

    • Пакетная запись: вместо построчной записи в файл накапливайте данные в строковой переменной, а затем записывайте её целиком.
    • Отключение транзакций: если выгрузка идёт из базы, временно отключите автотранзакции (НачатьТранзакцию;ЗафиксироватьТранзакцию;).
    • Выборка порциями: используйте метод ВыбратьПорциями для выборки данных пачками по 100–500 записей.
    • Кэширование: если данные не меняются часто, кэшируйте результат выгрузки и обновляйте файл только при изменениях.

Пример оптимизированного кода для выгрузки большого справочника:

// Создаём буфер для накопления данных

БуферXML = Новый СтроковыйПоток;

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

ЗаписьXML.УстановитьСтроковыйПоток(БуферXML);

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

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

// Выгружаем данными порциями по 500 записей

Выборка = Справочники.Контрагенты.ВыбратьПорциями(500);

Пока Выборка.СледующаяПорция Цикл

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

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

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

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

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

КонецЦикла;

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"Контрагенты"

// Сохраняем результат в файл

БуферXML.Записать("C:\Export\Контрагенты.xml", КодировкаТекста.UTF8);

Этот подход ускоряет выгрузку в 3–5 раз по сравнению с построчной записью.

💡

Для выгрузки более 10 000 записей используйте пакетную обработку или специализированные инструменты вроде 1С:Конвертация данных. Они оптимизированы для работы с большими объёмами.

7. Проверка и валидация сформированного XML

Перед отправкой XML-файла в внешнюю систему обязательно проверьте его на корректность. Вот минимальный чек-лист:

  1. Валидация структуры: используйте онлайн-валидаторы (например, XML Validation от W3Schools) или инструменты вроде XML Spy.
  2. Проверка кодировки: откройте файл в Notepad++ и убедитесь, что кодировка определена как UTF-8 без BOM.
  3. Тестовая загрузка: если возможно, протестируйте загрузку файла в целевую систему (например, в личном кабинете ФНС или ЭДО).

Для автоматической проверки в можно использовать следующий код:

// Проверяем, что файл является корректным XML

Попытка

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

ЧтениеXML.ОткрытьФайл("C:\Export\Номенклатура.xml");

ЧтениеXML.ПрочитатьОбъявлениеXML; // Если ошибка, файл некорректен

Сообщить("XML корректен!");

Исключение

Сообщить("Ошибка в XML:" + ОписаниеОшибки);

КонецПопытки;

⚠️ Внимание: Некоторые системы (например, маркетплейсы) требуют строгого соответствия XSD-схеме, включая порядок тегов и атрибутов. Даже если XML валиден, он может быть отклонён из-за несоответствия схеме.

8. Готовые решения и внешние обработки

Если вам нужно регулярно формировать XML по сложным правилам, рассмотрите готовые решения:

  • 🔧 Универсальный обмен данными (от ): позволяет настраивать правила преобразования данных в XML/JSON без программирования.
  • 🔧 Конвертация данных 2.0/3.0: инструмент для миграции и обмена данными между базами, поддерживает выгрузку в XML.
  • 🔧 Обработки от партнёров: на сайте Infostart или 1С-Сообщество можно найти бесплатные и платные обработки для специфических задач (например, выгрузка для Wildberries или Озон).

Пример использования Универсального обмена данными:

  1. Установите обработку из каталога (Файл → Открыть → Добавить из файла).
  2. Создайте новое правило обмена, укажите источник (например, документ РеализацияТоваровУслуг).
  3. Настройте соответствие полей и XML-тегов.
  4. Выполните выгрузку и сохраните файл.

⚠️ Внимание: Перед использованием внешних обработок проверьте их совместимость с вашей версией 1С 8.3. Некоторые решения могут не работать в последних релизах платформы.

Где скачать проверенные обработки для XML?

Рекомендуем использовать официальные источники:

- Каталог решений на сайте (https://solutions.1c.ru/)

- Infostart (https://infostart.ru/)

- 1С-Сообщество (https://community.1c.ru/)

Избегайте скачивания обработок с непроверенных сайтов — они могут содержать вредоносный код.

FAQ: Частые вопросы по формированию XML в 1С 8.3

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

Да, в типовых конфигурациях (УТ 11, БП 3.0) есть встроенные обработки для выгрузки данных в XML. Например, для обмена с ФНС или ЭДО используйте меню Отчетность → Регламентированные отчёты. Также можно воспользоваться Конструктором выгрузки данных (см. раздел 4).

Как выгрузить в XML данные с вложенными табличными частями (например, заказ с позициями)?

Для иерархических структур удобнее использовать XDTO (раздел 3) или писать код с вложенными циклами. Пример для заказа с позициями:

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

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

// Выгружаем табличную часть"Товары"

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

Для Каждого СтрокаТовары Из Документ.Товары Цикл

ЗаписьXML.ЗаписатьНачалоЭлемента("Позиция");

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

ЗаписьXML.ЗаписатьАтрибут("Количество", СтрокаТовары.Количество);

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

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"Позиции"

ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"Заказ"

Почему при выгрузке в XML теряются русские буквы?

Этоная проблема с кодировкой. Решения:

  1. Укажите "UTF-8" при открытии файла: ЗаписьXML.ОткрытьФайл(...,"UTF-8").
  2. Если данные читаются из внешнего источника (например, DBF или Excel), предварительно конвертируйте их в UTF-8.
  3. Проверьте настройки региональных стандартов в (Администрирование → Настройки программы → Региональные).
Как автоматизировать выгрузку XML по расписанию?

Для автоматической выгрузки настройте регламентное задание:

  1. Создайте обработку с кодом формирования XML.
  2. В конфигураторе перейдите в Общие → Регламентные задания.
  3. Добавьте новое задание, укажите обработку и расписание (например, ежедневно в 23:00).
  4. Настройте отправку файла по FTP или email (если нужно).

Для отправки по FTP используйте объект FTPСоединение:

FTP = Новый FTPСоединение("ftp.example.com", 21,"user","password");

FTP.ЗагрузитьФайл("C:\Export\data.xml","/incoming/data.xml");

Какие есть альтернативы XML в 1С для обмена данными?

Если XML не подходит (например, из-за сложности парсинга), рассмотрите:

  • 📄 JSON: легче парсится, компактнее. В 1С 8.3 поддерживается через ЗаписьJSON/ЧтениеJSON.
  • 📄 CSV/Excel: удобно для табличных данных, но теряется структура.
  • 📄 Протокол oData: для интеграции с 1С:EDT или внешними системами.
  • 📄 Direct Connect: для обмена между базами без промежуточных файлов.

Пример выгрузки в JSON:

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

ЗаписьJSON.ОткрытьФайл("C:\Export\data.json");

ЗаписьJSON.ЗаписатьНачалоОбъекта;

ЗаписьJSON.ЗаписатьСвойство("Номер","000123");

ЗаписьJSON.ЗаписатьКонецОбъекта;

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