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

В этой статье вы найдёте не только пошаговые инструкции для разных версий 1С 8.3 и 8.2, но и разбор типичных ошибок (например, Ошибка при записи XML: Недопустимый символ), а также способы автоматизации экспорта через встроенный язык. Особое внимание уделено экспорту данных с сохранением структуры иерархических справочников — проблема, с которой сталкиваются 78% пользователей при первой попытке выгрузки.

Если вам нужно передать данные в ФСС, ПФР, или синхронизировать с интернет-магазином на Bitrix или Shop-Script — эта инструкция поможет избежать часов дебаггинга и потери данных.

📊 С какой целью вы экспортируете данные из 1С в XML?
Отчетность в госорганы
Интеграция с сайтом
Обмен с другой 1С
Резервное копирование
Другое

1. Подготовка данных к экспорту: что нужно проверить перед сохранением

Прежде чем сохранять данные в XML, убедитесь, что они соответствуют требованиям целевой системы. Например, ФНС и ПФР предъявляют жесткие требования к структуре файлов: отсутствие пустых тегов, обязательные атрибуты, конкретные форматы дат (ДД.ММ.ГГГГ или ГГГГ-ММ-ДД).

Основные моменты для проверки:

  • 📌 Кодировка символов: по умолчанию использует windows-1251, но многие внешние системы требуют UTF-8. Это критично при работе с кириллицей!
  • 🗃️ Структура данных: иерархические справочники (например, Номенклатура с группами) в XML сохраняются как вложенные теги. Если структура нарушена, файл может не пройти валидацию.
  • 🔢 Типы данных: даты, числа с плавающей точкой и булевы значения (Истина/Ложь) в XML преобразуются по-разному. Например, Истина может стать 1 или true — это зависит от настройки экспорта.
  • 🔒 Права доступа: если выгружаете данные из 1С:ЗУП или 1С:Бухгалтерия, убедитесь, что у вашей роли есть права на чтение всех необходимых объектов (например, РегистрыНакопления.Зарплата).

Для проверки структуры будущего XML-файла можно использовать XSD-схемы (если они предоставлены целевой системой). В есть встроенный механизм валидации по XSD — он доступен через объект ЧтениеXML с параметром УстановитьСхему().

💡

Если вы экспортируете данные для ФНС или ПФР, скачайте актуальные XSD-схемы с их официальных сайтов и проверьте XML перед отправкой. Это сэкономит время на исправление ошибок валидации.

2. Способы сохранения в XML: ручной экспорт vs программный

В 1С:Предприятие есть два основных способа сохранения данных в XML:

  1. Ручной экспорт через меню Файл → Сохранить как... (доступен для большинства объектов: справочников, документов, отчетов).
  2. Программный экспорт с использованием встроенного языка (методы ЗаписатьXML(), ЗаписатьXDTO() и др.).

Ручной экспорт подходит для разовых операций, но имеет ограничения:

  • 🚫 Нет контроля над структурой XML (теги формируются автоматически по именам реквизитов).
  • 🚫 Нельзя задать пространство имен (xmlns), что критично для некоторых госсистем.
  • 🚫 Ограниченный выбор кодировки (обычно только windows-1251).

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

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

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

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

ЗаписьXML.ЗаписатьОбъект(Док);

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

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

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

Пакет = ФабрикаXDTO.Пакеты().Добавить("http://example.com/ns");

ТипОбъекта = Пакет.Типы().Добавить("КаталогНоменклатуры");

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

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

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

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

Чем отличается ЗаписатьXML() от ЗаписатьXDTO()?

Метод ЗаписатьXML() сохраняет объект "как есть", используя имена реквизитов 1С в качестве тегов. Это просто, но негибко.

ЗаписатьXDTO() позволяет задать произвольную структуру XML через пакеты XDTO, что критично для интеграции со стандартизированными форматами (например, УПД или Торг-12 в электронном виде).

3. Пошаговая инструкция: как сохранить справочник в XML

Рассмотрим самый распространенный сценарий — выгрузку справочника (например, Контрагенты или Номенклатура) в XML. Для этого:

  1. Откройте справочник в режиме 1С:Предприятие (не в конфигураторе!).
  2. Выделите нужные элементы (или оставьте все, если требуется полная выгрузка).
  3. Перейдите в меню Файл → Сохранить как....
  4. Выберите формат XML-документ (*.xml).
  5. Укажите путь для сохранения (например, C:\Export\Контрагенты.xml).
  6. Нажмите "Сохранить" и дождитесь завершения операции.

Если справочник иерархический (например, Номенклатура с группами и подгруппами), в XML он сохранится со вложенной структурой:

<Справочник.Номенклатура>

<Элемент>

<Наименование>Товары</Наименование>

<ЭтоГруппа>1</ЭтоГруппа>

<Элементы>

<Элемент>

<Наименование>Электроника</Наименование>

<ЭтоГруппа>1</ЭтоГруппа>

<Элементы>...</Элементы>

</Элемент>

</Элементы>

</Элемент>

</Справочник.Номенклатура>

🔹 Убедиться, что все обязательные реквизиты заполнены

🔹 Проверить права на чтение справочника

🔹 Очистить кэш 1С (если данные не обновляются)

🔹 Закрыть все формы справочника перед экспортом-->

4. Экспорт документов в XML: нюансы для бухгалтерских форм

Документы (например, ПоступлениеТоваровУслуг, СчетФактураВыданный) экспортируются в XML аналогично справочникам, но с рядом особенностей:

  • 📄 Табличные части (например, список товаров в РеализацияТоваровУслуг) сохраняются как вложенные теги <Товары><Товар>...</Товар></Товары>.
  • 💰 Суммы и валюты: если документ многовалютный, в XML попадают все курсы и суммы в базовой валюте. Это может увеличить размер файла.
  • 🔗 Ссылки на другие объекты: например, поле Контрагент в документе сохранится как ссылка вида <Контрагент>{UUID}</Контрагент>, а не как наименование.

Для бухгалтерских документов (например, СчетФактура) часто требуется подпись и печать в электронном виде. В этом случае XML должен соответствовать формату ФНС (например, Формат 5.01 для счетов-фактур). Пример структуры:

<Файл>

<Документ>

<СвСчФакт>

<НомерСчФ>123</НомерСчФ>

<ДатаСчФ>2026-05-20</ДатаСчФ>

<СуммаВсего>10000.00</СуммаВсего>

</СвСчФакт>

<ТабличнаяЧасть>...</ТабличнаяЧасть>

</Документ>

</Файл>

Если выгружаемый документ содержит печатные формы (например, УПД или Торг-12), их можно сохранить отдельно через метод ПечатнаяФорма().Сохранить():

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

ПФ = Док.ПечатнаяФорма();

ПФ.Сохранить("C:\Export\УПД_123.pdf"); // или в XML, если форма поддерживает

💡

Для документов, отправляемых в госорганы, всегда проверяйте актуальность формата XML на сайте ФНС или ПФР. Например, формат счетов-фактур обновлялся в 2023 и 2026 годах.

5. Распространенные ошибки и их решения

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

Ошибка Причина Решение
Ошибка при записи XML: Недопустимый символ В данных есть символы, не поддерживаемые кодировкой (например, ©, ® или неразрывный пробел). Используйте UTF-8 или очистите данные от спецсимволов через СтрЗаменить().
Ошибка сериализации: Циклическая ссылка Объект ссылается сам на себя (например, документ ссылается на себя в табличной части). Используйте параметр СериализоватьПомеченные = Истина или исключите циклические ссылки вручную.
XML-файл не проходит валидацию по XSD Структура файла не соответствует схеме (отсутствуют обязательные теги или атрибуты). Проверьте XSD-схему и скорректируйте код экспорта или используйте XDTO.
Файл не открывается: XML-декларация отсутствует Файл сохранен без заголовка <?xml version="1.0"?>. Добавьте заголовок вручную или используйте ЗаписьXML.ЗаписатьОбъявлениеXML().

Если ошибка связана с большим объемом данных (например, выгрузка справочника с 50 000 элементов), разбейте экспорт на части:

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

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

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

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

ЗаписьXML.ОткрытьФайл("C:\Export\part_" + Выборка.Счетчик + ".xml");

КонецЕсли;

ЗаписьXML.ЗаписатьОбъект(Выборка);

КонецЦикла;

💡

Для отладки XML используйте бесплатные инструменты вроде XML Notepad или Oxygen XML Editor. Они покажут ошибки структуры и кодировки.

6. Автоматизация экспорта: как настроить регулярную выгрузку

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

  • 🕒 Регламентные задания: настройте задание в Администрирование → Регламентные задания, которое будет запускать обработку экспорта по расписанию.
  • 🤖 Внешние обработки: создайте обработку с кнопкой "Экспорт в XML" и запускайте ее вручную или по событию (например, после проведения документа).
  • 🔄 Обмен данными: используйте планы обмена (ОбменДаннымиXML) для синхронизации с другой базой или внешней системой.

Пример кода для регламентного задания (выгрузка ЗаказыПокупателей в XML каждый день в 23:00):

Процедура ВыгрузитьЗаказыВXML() Экспорт

Каталог = "C:\Export\Orders\";

Если Не Каталог.Существует() Тогда

Каталог.Создать();

КонецЕсли;

Выборка = Документы.ЗаказПокупателя.ВыбратьПомеченные();

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

ЗаписьXML.ОткрытьФайл(Каталог + "orders_" + ТекущаяДата() + ".xml", "UTF-8");

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

ЗаписьXML.ЗаписатьОбъект(Выборка);

КонецЦикла;

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

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

Для интеграции с 1С-Битрикс, Shop-Script или другими CMS можно использовать REST API или HTTP-сервисы. Пример отправки XML на сервер:

HTTPСоединение = Новый HTTPСоединение("api.example.com", 80);

HTTPЗапрос = Новый HTTPЗапрос("/upload/xml");

HTTPЗапрос.УстановитьТелоИзФайла("C:\Export\orders.xml");

Ответ = HTTPСоединение.ВыполнитьЗапрос(HTTPЗапрос);

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

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

КонецЕсли;

💡

При настройке автоматического экспорта всегда тестируйте процесс на копии базы. Ошибки в коде могут заблокировать работу пользователей!

7. Оптимизация XML-файлов: как уменьшить размер и ускорить обработку

Большие XML-файлы (например, выгрузка каталога номенклатуры с 100 000 позиций) могут занимать гигабайты и медленно обрабатываться. Чтобы оптимизировать их:

  • 🗜️ Сжатие: используйте ZipАрхив для упаковки XML перед отправкой:
    Zip = Новый ZipАрхив;
    

    Zip.Добавить("C:\Export\catalog.xml", "catalog.xml");

    Zip.Закрыть("C:\Export\catalog.zip");

  • 🧹 Очистка данных: удаляйте ненужные реквизиты (например, Комментарий или ПометкаУдаления) перед экспортом.
  • 🔄 Постраничная выгрузка: разбивайте данные на части (например, по 10 000 записей в файле).
  • 📌 Использование ссылок: вместо дублирования данных (например, информации о контрагенте в каждом документе) используйте ссылки на внешние файлы.

Для ускорения чтения XML в целевой системе можно:

  • Использовать SAX-парсер вместо DOM (он не грузит весь файл в память).
  • Отключить валидацию по XSD, если она не обязательна.
  • Применять XSLT-преобразования для конвертации XML в более удобный формат.

Пример XSLT для преобразования XML с данными о номенклатуре в упрощенный формат:

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/Справочник.Номенклатура">

<Каталог>

<xsl:for-each select="Элемент">

<Товар>

<Наименование><xsl:value-of select="Наименование"/></Наименование>

<Цена><xsl:value-of select="Цена"/></Цена>

</Товар>

</xsl:for-each>

</Каталог>

</xsl:template>

</xsl:stylesheet>

Как применить XSLT в 1С?

Используйте объект ПреобразованиеXSLT:

XSLT = Новый ПреобразованиеXSLT;

XSLT.Загрузить("C:\Templates\transform.xslt");

Результат = XSLT.Преобразовать(ИсходныйXML);

8. Безопасность: как защитить данные в XML

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

  • 🔐 Шифрование: используйте ШифрованиеXML (доступно в 1С 8.3.20+) или внешние инструменты вроде OpenSSL.
  • 👤 Ограничение доступа: сохраняйте файлы в защищенные папки с правами только для администраторов.
  • 🗑️ Очистка метаданных: удаляйте из XML служебную информацию (например, версии , имена пользователей).
  • 📜 Электронная подпись: для документов, отправляемых в госорганы, используйте КриптоПро или встроенные механизмы .

Пример шифрования XML с помощью КриптоПро:

Шифрование = Новый ШифрованиеXML;

Шифрование.УстановитьСертификат(ПолучитьСертификатПоОтпечатку("..."));

Шифрование.ЗашифроватьФайл("C:\Export\data.xml", "C:\Export\data_enc.xml");

Для удаления метаданных из XML можно использовать регулярные выражения:

ТекстXML = Новый ЧтениеТекста("C:\Export\data.xml");

Строка = ТекстXML.Прочитать();

Строка = СтрЗаменить(Строка, "<Версия1С>8.3.22</Версия1С>", "");

ЗаписьТекста = Новый ЗаписьТекста("C:\Export\data_clean.xml");

ЗаписьТекста.Записать(Строка);

Чтение = Новый ЧтениеДвоичныхДанных("C:\Export\large.xml");

Запись = Новый ЗаписьДвоичныхДанных("C:\Export\large_enc.xml");

Пока Чтение.ПрочитатьБлок(Блок, 1024) > 0 Цикл

Запись.ЗаписатьБлок(ШифроватьБлок(Блок));

КонецЦикла;

-->

⚠️ Внимание: При экспорте данных в госорганы (например, ФНС или ПФР) проверьте актуальные требования к формату и шифрованию на их официальных сайтах. Правила могут меняться ежегодно!

FAQ: Частые вопросы по экспорту XML из 1С

Как сохранить отчет (например, оборотно-сальдовую ведомость) в XML?

Отчеты сохраняются в XML аналогично справочникам: откройте отчет, сформируйте его, затем выберите Файл → Сохранить как → XML-документ. Для сложных отчетов (например, Анализ субконто) может потребоваться программный экспорт через ТабличныйДокумент.ЗаписатьXML().

Пример кода:

Отчет = Отчеты.ОборотноСальдоваяВедомость.Создать();

Отчет.Сформировать();

ТабДок = Отчет.ТабличныйДокумент;

ТабДок.ЗаписатьXML("C:\Export\ОСВ.xml");

Можно ли сохранить в XML данные из регистра накопления?

Да, но только программно. Регистры накопления (например, РегистрНакопления.ТоварыНаСкладах) не имеют интерфейса для ручного экспорта. Используйте код:

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

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

Выборка = РегистрыНакопления.ТоварыНаСкладах.Выбрать();

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

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

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

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

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

КонецЦикла;

Почему в XML вместо кириллицы отображаются знаки вопроса?

Это проблема с кодировкой. По умолчанию сохраняет XML в windows-1251, но многие программы ожидают UTF-8. Решение:

  1. Явно укажите кодировку при сохранении: ЗаписьXML.ОткрытьФайл(..., "UTF-8").
  2. Если файл уже сохранен, конвертируйте его через Notepad++ или iconv:
iconv -f windows-1251 -t utf-8 input.xml > output.xml
Как экспортировать в XML данные с картинками (например, каталог номенклатуры с фото)?

XML не предназначен для хранения бинарных данных, но есть два варианта:

  1. Ссылки на файлы: сохраните изображения в папку, а в XML запишите пути:
    <Товар>
    

    <Наименование>Монитор</Наименование>

    <Фото>C:\Export\Images\monitor1.jpg</Фото>

    </Товар>

  2. Base64: закодируйте изображение в текст:
    Base64Строка = Base64Строка(Картинка.ПолучитьДвоичныеДанные());
    

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

Можно ли автоматически отправлять XML по email после экспорта?

Да, используйте встроенный механизм Почта или ИнтернетПочта:

Почта = Новый Почта;

Сообщение = Почта.СоздатьСообщение();

Сообщение.Текст = "Выгрузка данных на " + ТекущаяДата();

Сообщение.Вложения.Добавить("C:\Export\data.xml");

Почта.Отправить(Сообщение, "recipient@example.com");

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

Если Не Почта.Отправить(Сообщение) Тогда

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

КонецЕсли;