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

Мы рассмотрим не только базовые методы через ЗаписьXML, но и продвинутые техники с использованием XDTO, а также типичные ошибки, которые возникают при валидации сгенерированных файлов. Особое внимание уделено актуальным требованиям к формату (например, для обмена с ФНС, ЕГАИС или маркетплейсами), где структура XML жёстко регламентирована. Если вы ранее сталкивались с проблемами при выгрузке данных — здесь найдёте готовые решения.

Для удобства материал разбит на практические блоки: от подготовки данных до финальной проверки файла. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.23 (актуальной на момент публикации), но подойдут и для более ранних версий с учётом синтаксических особенностей. Приступим!

1. Подготовка данных для XML: что нужно знать до начала работы

Прежде чем приступать к формированию XML, необходимо чётко определить структуру будущего файла и источник данных. В 1С это может быть:

  • 📋 Справочник (например, номенклатура, контрагенты, сотрудники)
  • 📊 Документ (заказы, счета, акты выполненных работ)
  • 🗃️ Регистр сведений (остатки товаров, курсы валют)
  • 📈 Отчёт (оборотно-сальдовая ведомость, аналитика продаж)

Ключевой момент: XML — это иерархическая структура, поэтому данные из 1С должны быть организованы аналогично. Например, если вы выгружаете заказ покупателя, логично сделать корневой элемент <Order>, внутри которого будут вложены <Customer>, <Items> и т.д. Игнорирование этой иерархии — главная причина ошибок при валидации XML на стороне получателя.

Также заранее уточните: Требования к кодировке (обычно UTF-8 или windows-1251), Наличие обязательных атрибутов (например, Ид или ВерсияФормата), Формат дат и чисел (в XML даты часто передаются в виде YYYY-MM-DD, а не в привычном для 1С виде).

⚠️ Внимание: Если XML предназначен для государственных систем (например, Честный ЗНАК или Меркурий), проверьте актуальные схемы XSD на официальных ресурсах. Требования к структурам могут меняться чаще, чем обновления 1С.

2. Способы формирования XML в 1С: сравнение методов

В 1С:Предприятие есть несколько инструментов для работы с XML. Выбор зависит от сложности задачи и требований к производительности:

Метод Когда использовать Плюсы Минусы
ЗаписьXML Простые структуры, небольшие объёмы данных Простота, не требует дополнительных объектов Ручной контроль форматирования, сложно поддерживать большие файлы
XDTO (XML Data Type Objects) Сложные схемы, интеграция с веб-сервисами Автоматическая валидация по XSD, поддержка пространств имён Требует предварительной настройки пакетов XDTO
Потоковый запись (StreamWriter) Очень большие файлы (тысячи строк) Минимальное потребление памяти Сложнее в реализации, нет встроенной валидации
Внешние компоненты Специфические форматы (например, OFD или SigXML) Гибкость, поддержка нестандартных форматов Зависимость от сторонних библиотек, возможны проблемы с обновлениями

Для большинства задач достаточно встроенных средств — ЗаписьXML или XDTO. Рассмотрим их подробнее.

📊 Какой метод формирования XML вы используете чаще?
ЗаписьXML
XDTO
Потоковая запись
Внешние компоненты
Не формирую XML

3. Формирование XML через ЗаписьXML: пошаговая инструкция

Это самый универсальный способ, который работает во всех конфигурациях 1С. Алгоритм действий:

  1. Создайте объект ЗаписьXML:
    ЗаписьXML = Новый ЗаписьXML;
  2. Настройте параметры записи:
    ЗаписьXML.УстановитьСтроку;
    

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

    Здесь УстановитьСтроку указывает, что результат будет в виде строки (альтернатива — запись в файл).

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

    ЗаписьXML.ЗаписатьАтрибут("ВерсияСхемы","2.07");

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

    ЗаписьXML.ЗаписатьЭлемент("Наименование","Стул офисный");

    ЗаписьXML.ЗаписатьЭлемент("Цена", 1500);

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

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

  4. Получите результат:
    РезультатXML = ЗаписьXML.Закрыть;

Пример выше сгенерирует следующий XML:

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

<КаталогТоваров ВерсияСхемы="2.07">

<Товар>

<Наименование>Стул офисный</Наименование>

<Цена>1500</Цена>

</Товар>

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

Элементы открыты и закрыты парно|Атрибуты заключены в кавычки|Кодировка совпадает с требованиями|Данные экранированы (например, & вместо &)

-->

Типичные ошибки при использовании ЗаписьXML:

  • 🔴 Незакрытые элементы — забыли вызвать ЗаписатьКонецЭлемента.
  • 🔴 Неэкранированные символы — например, & должен быть заменён на &.
  • 🔴 Неправильная кодировка — если в XML есть кириллица, а файл сохранён в UTF-8 без BOM, могут возникнуть проблемы при чтении.
💡

Чтобы автоматически экранировать специальные символы, используйте метод ЗаписьXML.ЗаписатьТекст вместо прямой записи строк.

4. Работа с XDTO: когда без неё не обойтись

XDTO (XML Data Type Objects) — это механизм 1С для работы со структурами XML на основе схем XSD. Он незаменим, если:

  • 📄 Нужно сгенерировать XML по строгой схеме (например, для ФНС или ЕГАИС).
  • 🔄 Требуется двусторонний обмен данными (импорт/экспорт).
  • 🌐 Необходима поддержка пространств имён (xmlns).

Шаги для работы с XDTO:

  1. Импортируйте XSD-схему:

    Перейдите в Файл → Открыть... и выберите файл .xsd. 1С автоматически сгенерирует пакет XDTO.

  2. Создайте фабрику XDTO:
    ФабрикаXDTO = Новый ФабрикаXDTO;
    

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

  3. Постройте объектную модель:
    ОбъектXML = ФабрикаXDTO.Sоздать("ns1:Документ");
    

    ОбъектXML.Номер ="123";

    ОбъектXML.Дата = ТекущаяДата;

  4. Сериализуйте в XML:
    ЗаписьXML = Новый ЗаписьXML;
    

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

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

    РезультатXML = ЗаписьXML.Закрыть;

Преимущества XDTO:

  • ✅ Автоматическая валидация по схеме (1С сама проверит, что все обязательные поля заполнены).
  • ✅ Поддержка сложных типов данных (массивы, вложенные объекты).
  • ✅ Удобное чтение XML обратно в объекты 1С.
⚠️ Внимание: Если XSD-схема меняется (например, обновляется формат отчётности), не забудьте перезагрузить пакет XDTO в конфигураторе. Иначе 1С будет использовать устаревшую структуру.

5. Выгрузка данных из справочников и документов

Чаще всего XML формируется на основе данных из базы 1С. Рассмотрим двачных сценария:

5.1. Выгрузка справочника номенклатуры

Допустим, нужно экспортировать каталог товаров для интернет-магазина. Код может выглядеть так:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование,

| Номенклатура.Артикул КАК Артикул,

| Номенклатура.ЦенаПродажи КАК Цена

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

РезультатЗапроса = Запрос.Выполнить;

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

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

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

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

Пока РезультатЗапроса.Следующий Цикл

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

ЗаписьXML.ЗаписатьАтрибут("Ид", РезультатЗапроса.Ссылка.УникальныйИдентификатор);

ЗаписьXML.ЗаписатьЭлемент("Наименование", РезультатЗапроса.Наименование);

ЗаписьXML.ЗаписатьЭлемент("Артикул", РезультатЗапроса.Артикул);

ЗаписьXML.ЗаписатьЭлемент("Цена", РезультатЗапроса.Цена);

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

КонецЦикла;

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

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

5.2. Выгрузка документа"РеализацияТоваровУслуг"

Для документов важно сохранять не только данные, но и ссылки на связанные объекты (контрагенты, номенклатуру). Пример:

Док = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000123", ТекущаяДата);

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

ЗаписьXML.УстановитьФайл("C:\Export\order_123.xml","UTF-8");

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

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

ЗаписьXML.ЗаписатьАтрибут("Тип","РеализацияТоваровУслуг");

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

ЗаписьXML.ЗаписатьАтрибут("Дата", Формат(Док.Дата,"ДФ=yyyy-MM-dd"));

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

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

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

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

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

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

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

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

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

ЗаписьXML.ЗаписатьЭлемент("Цена", СтрокаТовара.Цена);

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

КонецЦикла;

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

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

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

💡

При выгрузке документов всегда включайте служебные поля (номер, дата, тип), даже если они не обязательны. Это упростит обработку файла на стороне получателя.

6. Проверка и валидация XML

Сгенерированный XML может содержать ошибки, которые приведут к отказу при загрузке в внешнюю систему. Основные способы проверки:

6.1. Встроенная валидация в 1С

Если используете XDTO, 1С автоматически проверит XML на соответствие схеме. Для ЗаписьXML придётся делать это вручную:

Попытка

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

ЧтениеXML.УстановитьСтроку(XMLСтрока);

ЧтениеXML.ПрочитатьОбъявлениеXML;

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

// Просто перебираем узлы для проверки синтаксиса

КонецЦикла;

Исключение

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

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

6.2. Внешние инструменты

Для глубокой проверки используйте:

  • 🌐 Online-валидаторы (например, XML Validation от W3Schools).
  • 💻 Локальные программы (XML Notepad, Oxygen XML Editor).
  • 📋 XSD-схемы (если есть, проверяйте соответствие через xmllint в Linux или специализированные утилиты).

Типичные ошибки валидации:

Ошибка Причина Решение
XML declaration allowed only at the start of the document Пробелы или символы до <?xml...?> Удалите лишние символы в начале файла
Undefined namespace prefix Не объявлено пространство имён (xmlns) Добавьте xmlns:префикс="URI" в корневой элемент
Element'X' is not declared Элемент не описан в XSD-схеме Проверьте имя элемента или обновите схему
Invalid character in the given encoding Несовпадение кодировки (например, UTF-8 vs windows-1251) Укажите правильную кодировку при записи XML
Как проверить XML на соответствие XSD в 1С?

1. Загрузите XSD-схему в конфигуратор (Файл → Открыть).

2. Создайте пакет XDTO на её основе.

3. Используйте метод ФабрикаXDTO.ПрочитатьXML — если структура не соответствует схеме, 1С выбросит исключение с описанием ошибки.

7. Оптимизация и ускорение формирования XML

Если выгружаемые данные занимают сотни мегабайт, стандартные методы могут работать слишком медленно. Рассмотрим способы оптимизации:

7.1. Потоковая запись для больших файлов

Вместо записи в строку используйте потоковую запись в файл:

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

ЗаписьXML.УстановитьФайл("C:\Export\large_file.xml","UTF-8");

// Далее формируем XML как обычно

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

Это снизит нагрузку на память, так как данные сразу пишутся на диск, а не хранятся в переменной.

7.2. Пакетная обработка данных

При выгрузке тысяч записей разбейте процесс на пакеты по 100–500 строк:

Запрос.Памятка.УстановитьПараметр("Пакет", 100);

РезультатЗапроса = Запрос.Выполнить;

Пока Истина Цикл

Выборка = РезультатЗапроса.Выбрать(Ложь, 100);

Если НЕ Выборка.Следующий Тогда

Прервать;

КонецЕсли;

// Обрабатываем пакет из 100 строк

КонецЦикла;

7.3. Кэширование часто используемых данных

Если в XML повторяются одни и те же справочные данные (например, единицы измерения), загрузите их заранее в массив:

ЕдиницыИзмерения = Новый Соответствие;

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

Результат = Запрос.Выполнить;

Пока Результат.Следующий Цикл

ЕдиницыИзмерения.Вставить(Результат.Ссылка, Результат.Наименование);

КонецЦикла;

УстановитьПривилегированныйРежим(Истина);

Но не забывайте вернуть режим обратно после завершения операции!-->

8. Типичные задачи и готовые решения

Разберём реальные кейсы, с которыми сталкиваются пользователи 1С.

8.1. Выгрузка прайс-листа для сайта

Требования: XML должен содержать наименование, артикул, цену, остаток и картинку товара.

Решение:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование,

| Номенклатура.Артикул КАК Артикул,

| Номенклатура.ЦенаПродажи КАК Цена,

| ОстаткиТоваров.КоличествоОстаток КАК Остаток,

| Номенклатура.Картинка КАК Картинка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров

| ПО Номенклатура.Ссылка = ОстаткиТоваров.Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления

| И Номенклатура.ВидыНоменклатуры.ЭтоГруппа = Ложь";

// Далее формируем XML как в примере выше, добавляя поле Картинка:

// ЗаписьXML.ЗаписатьЭлемент("Картинка", Base64ЗакодироватьДвоичныеДанные(Картинка.Получить));

8.2. Формирование УПД для Диадок/СБИС

Требования: XML должен соответствовать формату Универсального передаточного документа (УПД) версии 5.01.

Решение: Используйте готовый пакет XDTO для УПД (можно скачать с сайта 1С-ЭДО или Такском). Пример заполнения:

УПДОбъект = ФабрикаXDTO.Sоздать("http://www.consultant.ru/standard/edi/upd/5_01","УПД");

УПДОбъект.Функция ="21"; // Реализация

УПДОбъект.ИдФайл = Новый УникальныйИдентификатор;

УПДОбъект.ДатаИнфПр = Формат(ТекущаяДата,"ДФ=yyyy-MM-dd");

УПДОбъект.СвСчФакт.НомерСчФ = Док.Номер;

УПДОбъект.СвСчФакт.ДатаСчФ = Формат(Док.Дата,"ДФ=yyyy-MM-dd");

8.3. Обмен с 1С:УТ 11 и 1С:ERP

Требования: XML должен соответствовать формату обмена CommerceML 2.0.

Решение: Используйте стандартную обработку ВыгрузкаДанныхXML.epf (входит в поставку типовой конфигурации). Настройте параметры выгрузки:

  • 📌 Укажите версию формата (2.07 или 2.08).
  • 📌 Выберите выгружаемые справочники и документы.
  • 📌 Настройте фильтры (например, только активные товары).
💡

Для обмена между разными конфигурациями 1С (например, УТ и БП) всегда используйте типовой формат EnterpriseData. Он поддерживает максимальное количество объектов и минимизирует ошибки при загрузке.

FAQ: Ответы на частые вопросы

Как добавить пространство имён (xmlns) в XML?

При использовании ЗаписьXML пространство имён указывается как атрибут корневого элемента:

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

ЗаписьXML.ЗаписатьАтрибут("xmlns:ns1","http://example.com/schema");

Для XDTO пространства имён настраиваются в фабрике:

ФабрикаXDTO.ПространстваИмен.Добавить("http://example.com/schema","ns1");
Можно ли сформировать XML без программирования?

Да, в типовой конфигурации 1С:Управление торговлей 11 есть обработка ВыгрузкаДанныхXML.epf. Она позволяет выгрузить справочники и документы в формат CommerceML через графический интерфейс:

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

Для других конфигураций может потребоваться доработка.

Как экранировать специальные символы (&, <, >) в XML?

Используйте метод ЗаписьXML.ЗаписатьТекст — он автоматически заменяет:

  • &&
  • <<
  • >>
  • ""

Пример:

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

ЗаписьXML.ЗаписатьТекст("Товар & Аксессуары (набор <5 шт.>)");

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

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

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

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

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

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

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

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

ЗаписьXML.ЗаписатьЭлемент("Количество", Строка.Количество);

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

КонецЦикла;

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

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

Для сложных структур (например, спецификации номенклатуры) может потребоваться рекурсивная обработка.

Как автоматизировать выгрузку XML по расписанию?