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

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

1. Базовые способы формирования XML в 1С

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

Самый очевидный способ — использовать встроенные механизмы выгрузки через меню Файл → Сохранить как... или кнопку Выгрузить в формах справочников и документов. Например, в 1С:Бухгалтерии 3.0 можно сохранить отчет Оборотно-сальдовая ведомость в XML прямо из интерфейса. Однако у этого метода есть ограничения:

  • 📌 Формат XML будет «плоским» — без вложенных структур и атрибутов.
  • 📌 Нет контроля над именами тегов и пространствами имен (xmlns).
  • 📌 Подходит только для одноразовых задач — автоматизировать такой экспорт невозможно.

Более гибкий вариант — конструктор печатных форм. В режиме 1С:Предприятие откройте нужный документ (например, Реализация товаров), перейдите в Печать → Настроить печатную форму и выберите формат XML. Здесь можно:

  • 🔧 Задать структуру тегов через визуальный редактор.
  • 🔧 Добавить условия для выгрузки только нужных полей.
  • 🔧 Сохранить шаблон для повторного использования.
📊 Какой способ выгрузки XML вы используете чаще?
Ручная выгрузка через меню
Конструктор печатных форм
Программный код (ЗаписьXML)
XDTO-пакеты
Другое

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

2. Программное формирование XML с помощью ЗаписьXML

Для автоматизации выгрузки в 1С 8.3 предназначен объект ЗаписьXML. Он позволяет гибко управлять структурой файла, добавлять атрибуты, комментарии и пространства имен. Рассмотрим базовый пример выгрузки справочника Номенклатура:

Процедура ВыгрузитьНоменклатуруВXML(КаталогВыгрузки)

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

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

Запись.ОткрытьФайл(КаталогВыгрузки + "номенклатура.xml", "UTF-8");

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

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

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

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

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

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

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

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

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

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

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

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

Запись.ЗаписатьТекст(Выборка.Артикул);

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

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

КонецЦикла;

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

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

КонецПроцедуры

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

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

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

<Товар Ид="123e4567-e89b-12d3-a456-426614174000">

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

<Артикул>ST-001</Артикул>

</Товар>

...

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

Ключевые моменты при работе с ЗаписьXML:

  • 🔹 Всегда указывайте кодировку ("UTF-8") — это избавит от проблем с кириллицей.
  • 🔹 Используйте УникальныйИдентификатор() для ссылки на объекты — это гарантирует стабильность при обменах.
  • 🔹 Для больших выборок (более 10 000 записей) разбивайте выгрузку на пакеты, иначе возможны ошибки памяти.

Создать резервную копию базы|Проверить права доступа к каталогу выгрузки|Определить структуру будущего XML|Подготовить обработку ошибок (try-catch)|Протестировать на небольшой выборке-->

Если ваша схема XML требует пространств имен (xmlns), их можно добавить так:

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

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

3. Работа с XDTO: для сложных схем и стандартов обмена

Когда требуется формировать XML по строгим стандартам (например, УПД, Торг-12 или схемы ЭДО), удобнее использовать XDTO-пакеты. Этот механизм позволяет:

  • 📦 Привязываться к готовым схемам XSD.
  • 📦 Автоматически валидировать структуру перед выгрузкой.
  • 📦 Упрощать обмен с внешними системами (например, Диадок, СБИС).

Пример создания XDTO-пакета и выгрузки документа РеализацияТоваровУслуг:

1. Сначала импортируйте схему XSD в :

  1. Откройте Файл → Открыть... и выберите файл .xsd.
  2. В контекстном меню выберите Импортировать XDTO-пакет.
  3. Укажите имя пакета (например, ЭДО_УПД) и пространство имен.

2. Затем используйте пакет в коде:

Процедура ВыгрузитьУПДвXML(Документ, ПутьКФайлу)

// Загружаем XDTO-пакет

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

Пакет = ФабрикаXDTO.Пакет("ЭДО_УПД");

// Создаем объект документа по схеме

ДокументXDTO = Пакет.Создать("УниверсальныйПередаточныйДокумент");

// Заполняем данные из 1С

ДокументXDTO.Ид = Документ.УникальныйИдентификатор();

ДокументXDTO.Номер = Документ.Номер;

ДокументXDTO.Дата = Документ.Дата;

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

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

ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");

СериализаторXDTO = Новый СериализаторXDTO();

СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДокументXDTO);

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

КонецПроцедуры

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

Критерий ЗаписьXML XDTO
Сложность реализации Низкая Средняя
Поддержка XSD-схем Нет Да
Валидация данных Ручная Автоматическая
Производительность Высокая Средняя
💡

Если у вас нет готовой XSD-схемы, но есть пример XML от контрагента, используйте онлайн-сервисы вроде XMLGrid или Liquid XML Studio для генерации схемы по файлу.

XDTO особенно полезен при обмене с госсистемами (например, Честный ЗНАК или Меркурий), где требования к формату жестко регламентированы. Однако для простых задач (выгрузка справочников на сайт) этот метод может быть избыточным.

4. Типичные ошибки и их решение

Даже опытные разработчики сталкиваются с проблемами при формировании XML. Вот самые распространенные ошибки и способы их устранения:

1. Неправильная кодировка

Симптомы: вместо кириллицы в файле появляются знаки ???? или krakozjabry.

Решение: всегда явно указывайте кодировку "UTF-8" при открытии файла:

Запись.ОткрытьФайл(Путь, "UTF-8"); // А не "ANSI" или "Windows-1251"

2. Ошибки валидации по XSD

Симптомы: внешняя система отказывается принимать файл с сообщением вроде "Element 'Номер' is invalid".

Решение: проверьте:

  • 🔍 Соответствие имен тегов и атрибутов схеме (регистр важен!).
  • 🔍 Типы данных (например, дата должна быть в формате YYYY-MM-DD).
  • 🔍 Обязательность полей (в XSD могут быть элементы с minOccurs="1").

3. Переполнение памяти при выгрузке больших данных

Симптомы: «зависает» или выдает ошибку "Недостаточно памяти".

Решение: разбивайте выгрузку на порции по 5 000–10 000 записей:

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

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

// Каждые 10 000 записей закрываем текущий файл и открываем новый

Если Выборка.Счетчик % 10000 = 0 Тогда

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

НомерФайла = НомерФайла + 1;

Запись.ОткрытьФайл(Каталог + "часть_" + НомерФайла + ".xml", "UTF-8");

КонецЕсли;

КонецЦикла;

Как проверить XML на ошибки без внешних сервисов?

В 1С 8.3.20+ есть встроенный валидатор XDTO. Используйте код:

Валидатор = Новый ВалидаторXDTO();

Ошибки = Валидатор.Валидировать(ВашОбъектXDTO);

Если Ошибки.Количество() > 0 Тогда

Сообщить("Ошибки валидации: " + Ошибки.ПолучитьТекстОшибок());

КонецЕсли;

Это поможет найти проблемы до отправки файла контрагенту.

4. Проблемы с датами и числами

Симптомы: даты отображаются в неверном формате (например, DD.MM.YYYY вместо YYYY-MM-DD), а числа с плавающей точкой теряют точность.

Решение: преобразуйте данные перед записью:

// Для дат

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

// Для чисел

Запись.ЗаписатьТекст(Формат(Число, "ЧР=; ЧДЦ=15; ЧГ=0"));

💡

Всегда тестируйте сформированный XML в валидаторе (например, XML Validator от W3C) перед отправкой. Это сэкономит время на переделку!

5. Автоматизация выгрузки: расписания и фоновые задания

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

Способ 1: Регламентное задание

1. Откройте Администрирование → Регламентные задания.

2. Создайте новое задание с типом Выполнение кода на сервере.

3. Укажите расписание (например, ежедневно в 2:00) и код выгрузки:

Процедура Выполнить() Экспорт

ВыгрузитьНоменклатуруВXML("C:\Exchange\");

КонецПроцедуры

Способ 2: Фоновое задание

Для 1С:Предприятие 8.3.18+ доступны фоновые задания, которые не блокируют работу пользователей:

ФоновоеЗадание = ФоновыеЗадания.СоздатьВыполнениеКода("ВыгрузкаXML");

ФоновоеЗадание.Параметры.Вставить("Каталог", "C:\Exchange\");

ФоновоеЗадание.Выполнить();

Преимущества автоматизации:

  • ⏰ Исключаются ошибки из-за «человеческого фактора».
  • ⏰ Данные всегда актуальны (например, остатки на складе).
  • ⏰ Можно интегрировать с FTP или API для мгновенной отправки файлов.
📊 Как часто вам нужно формировать XML в 1С?
Ежедневно
Еженедельно
Ежемесячно
По запросу
Не формирую

Для отслеживания статуса выгрузки добавьте логирование:

Журнал = Новый ЖурналРегистрации("ВыгрузкаXML", Истина);

Журнал.Записать("Начало выгрузки", УровеньЖурналаРегистрации.Информация);

// ... код выгрузки ...

Журнал.Записать("Выгрузка завершена. Файл: " + ПутьКФайлу, УровеньЖурналаРегистрации.Успех);

6. Интеграция с внешними системами: FTP, API, ЭДО

Формирование XML — только половина задачи. Часто файл нужно сразу отправить контрагенту или загрузить в внешнюю систему. Рассмотрим популярные сценарии:

1. Отправка по FTP

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

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

FTP.Соединить();

FTP.ЗагрузитьФайл("номенклатура.xml", "/incoming/номенклатура.xml");

FTP.Отсоединить();

2. Отправка через HTTP (REST API)

Для интеграции с маркетплейсами (например, Ozon, Wildberries) или ЭДО-операторами используйте HTTPСоединение:

HTTP = Новый HTTPСоединение("api.edo.example.com", 443, "", "", Истина);

HTTP.УстановитьЗаголовок("Authorization", "Bearer " + ТокенДоступа);

HTTP.УстановитьЗаголовок("Content-Type", "application/xml");

Данные = Новый ДвоичныеДанные(ПутьКФайлу);

Ответ = HTTP.ОтправитьДляОбработки("/upload", Данные, "POST");

Если Ответ.КодСостояния <> 200 Тогда

Сообщить("Ошибка отправки: " + Ответ.ПолучитьТекст());

КонецЕсли;

3. Обмен через ЭДО (Диадок, СБИС, Контур)

Для работы с ЭДО обычно требуется:

  • 📄 Подписать XML электронной подписью (используйте ПодписьXML или внешние компоненты вроде КриптоПро).
  • 📄 Упаковать в архив (например, Zip или CAdES).
  • 📄 Отправить через API оператора или загрузить в личный кабинет.

Пример подписи XML с помощью КриптоПро:

Подпись = Новый ПодписьXML;

Подпись.УстановитьСертификат(Сертификат);

Подпись.ПодписатьФайл("документ.xml", "документ_signed.xml");

💡

Для тестирования обмена с ЭДО используйте песочницы операторов (например, Диадок Тест или СБИС Демо). Это бесплатно и безопасно для экспериментов.

Если вам нужно интегрироваться с 1С:EDT или 1С:Connect, рассмотрите использование стандартных обработок обмена, которые уже содержат готовые шаблоны для популярных форматов (например, CommerceML для обмена с сайтами).

7. Оптимизация производительности при работе с большими данными

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

1. Потоковая запись XML

Не формируйте весь XML в памяти — записывайте данные сразу в файл:

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

Запись.ОткрытьФайл(ПутьКФайлу, "UTF-8");

// Пишем заголовок

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

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

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

Выборка = Запрос.Выполнить().Выбрать();

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

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

// ... запись данных строки ...

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

КонецЦикла;

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

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

2. Использование временных таблиц

Если данные нужно предварительно обработать, используйте ВременнаяТаблица вместо массивов:

ВТ = Новый ВременнаяТаблица;

ВТ.ДобавитьКолонку("Наименование");

ВТ.ДобавитьКолонку("Количество");

// Заполняем данными

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

Запрос.Текст = "ВЫБРАТЬ Номенклатура.Наименование, Сумма(Остатки.Количество)

|ИЗ РегистрНакопления.ОстаткиТоваров КАК Остатки

|СВЕРНУТЬ ПО Номенклатура.Наименование";

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

// Выгружаем из ВТ в XML

Выборка = ВТ.Выбрать();

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

// Запись в XML

КонецЦикла;

3. Разделение на пакеты

Для очень больших выгрузок (более 100 000 записей) разбивайте данные на несколько файлов:

НомерПакeta = 1;

КоличествоЗаписейВПакете = 10000;

ТекущаяЗапись = 0;

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

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

Если ТекущаяЗапись % КоличествоЗаписейВПакете = 0 Тогда

Если Запись <> Неопределено Тогда

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

КонецЕсли;

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

Запись.ОткрытьФайл(Каталог + "пакет_" + НомерПакeta + ".xml", "UTF-8");

НомерПакeta = НомерПакeta + 1;

КонецЕсли;

// Запись данных

ТекущаяЗапись = ТекущаяЗапись + 1;

КонецЦикла;

4. Отключение транзакций

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

НачатьТранзакцию(); // Только если действительно нужно

Попытка

// Код выгрузки

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

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

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

💡

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

8. Примеры готовых решений для типовых задач

Рассмотрим готовые шаблоны кода для самых распространенных сценариев выгрузки XML в .

1. Выгрузка справочника контрагентов для Битрикс24

Процедура ВыгрузитьКонтрагентовДляБитрикс(ПутьКФайлу)

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

Запись.ОткрытьФайл(ПутьКФайлу, "UTF-8");

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

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

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

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

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

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

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

Запись.ЗаписатьЭлемент("инн", Выборка.ИНН);

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

КонецЦикла;

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

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

КонецПроцедуры

2. Формирование УПД для Диадок

Используем XDTO-пакет на основе схемы УПД 2.06:

Процедура ВыгрузитьУПДДляДиадок(Документ, ПутьКФайлу)

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

Пакет = ФабрикаXDTO.Пакет("Диадок.УПД_2_06");

ДокументXDTO = Пакет.Создать("УниверсальныйПередаточныйДокумент");

ДокументXDTO.ИдДок = Документ.УникальныйИдентификатор();

ДокументXDTO.НомерДок = Документ.Номер;

ДокументXDTO.ДатаДок = Формат(Документ.Дата, "ДФ=yyyy-MM-dd");

// Добавляем табличную часть

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

СтрокаXDTO = ДокументXDTO.Товары.Добавить();

СтрокаXDTO.Наименование = Строка.Номенклатура.Наименование;

СтрокаXDTO.Количество = Строка.Количество;

КонецЦикла;

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

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

ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");

СериализаторXDTO = Новый СериализаторXDTO();

СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ДокументXDTO);

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

КонецПроцедуры

3. Выгрузка остатков для Ozon Seller

Ozon требует строгий формат stocks.xml:

Процедура ВыгрузитьОстаткиДляOzon(ПутьКФайлу)

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

Запись.ОткрытьФайл(ПутьКФайлу, "UTF-8");

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

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

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

Запрос.Текст = "ВЫБРАТЬ

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

| СУММА(ОстаткиТоваров.КоличествоОстаток) КАК quantity

|ИЗ

| РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

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

|ГДЕ

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

|СГРУППИРОВАТЬ ПО

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

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

Выборка = Результат.Выбрать();

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

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

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

Запись.ЗаписатьЭлемент("stock", Выборка.quantity);

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