Выгрузка и загрузка XML в 1С: три способа и рабочий код

· 9 мин

Содержание

Формат XML в 1С делается тремя путями: типовым обменом по правилам конвертации, обработкой «Универсальный обмен данными в формате XML» или своим кодом на ЗаписьXML. Первый подходит, когда у обеих баз типовые конфигурации. Второй выручает при переносе справочников и документов между своими базами. Третий нужен для внешних систем: банк-клиент, сайт, склад, учётная программа без готового коннектора.

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

Какой способ выбрать для обмена данными в XML

Сначала определите, кто на другом конце. От этого зависит всё остальное.

СпособКогда подходитРиски
Обмен по правилам конвертации (типовой)Обе стороны на типовых конфигурациях 1С, есть готовые правилаПравила привязаны к версиям, после обновления нужна проверка
Универсальный обмен в формате XMLПеренос данных между базами 1С, в том числе разных конфигурацийНужны правила обмена, без них файл не загрузится
Свой код: ЗаписьXML / ЧтениеXMLВнешняя система с собственной схемой, ничего типового нетВсё на вас: структура, кодировка, проверка ошибок
Выгрузка через ПостроительDOMНужно собрать дерево, править узлы перед записьюДольше работает на больших объёмах

Если есть готовое типовое решение для вашей пары программ, берите его. Свой код оправдан, когда формат диктует внешняя сторона.

Чем XML удобен для обмена

  • 📄 Это обычный текст. Файл открывается в любом редакторе, ошибку видно глазами.
  • 🧱 Структура задаётся тегами, вложенность читается сразу.
  • 🔁 Один формат работает в обе стороны: выгрузили из одной базы, загрузили в другую.
  • 🔌 Понимают почти все системы, от банков до маркетплейсов.

Минусы тоже есть. Файл раздут тегами, на больших выгрузках он тяжелее CSV. Нет типов данных: число и дата приходят строкой, их приведение остаётся на вашем коде.

Как сделать XML в 1С: обмен по правилам конвертации

Типовой путь работает через план обмена. Вы настраиваете узел, указываете каталог для файлов и запускаете обмен. Платформа сама формирует файл сообщения.

  1. Откройте раздел администрирования и найдите настройку синхронизации данных. Точное название пункта зависит от конфигурации, поэтому пользуйтесь поиском по форме: введите слово «синхронизация» или «обмен».
  2. Создайте новую настройку и выберите программу-партнёр из списка.
  3. Укажите способ обмена: каталог на диске, FTP или электронная почта. Для начала берите локальный каталог.
  4. Задайте правила: какие объекты выгружать и с какой даты.
  5. Запустите синхронизацию. В каталоге появится файл с расширением .xml.

Для проверки откройте файл в текстовом редакторе. Первая строка должна быть декларацией, дальше корневой элемент сообщения.

<?xml version="1.0" encoding="UTF-8"?>
<Message>
  <Header>
    <Format>http://v8.1c.ru/edi/edi_stnd/EnterpriseData/1.0</Format>
  </Header>
  <Body>
    <!-- объекты обмена -->
  </Body>
</Message>

Правила обмена нельзя править «на живой» базе. Скопируйте базу, проверьте изменения там и только потом переносите.

Универсальный обмен: когда нужен именно он

Обработка «Универсальный обмен данными в формате XML» входит в состав типовых конфигураций или поставляется отдельно с правилами. Она выгружает выбранные объекты в файл и загружает их в другую базу.

Порядок такой:

  1. Откройте обработку через меню открытия внешних файлов или раздел обмена данными.
  2. На вкладке выгрузки загрузите файл правил обмена.
  3. Отметьте объекты: справочники, документы, регистры.
  4. Укажите имя файла выгрузки и нажмите кнопку выгрузки.
  5. В целевой базе откройте ту же обработку, на вкладке загрузки выберите файл и запустите.

Перед загрузкой в рабочую базу сделайте копию информационной базы. Загрузка перезаписывает объекты с тем же уникальным идентификатором.

Как создать XML-файл в 1С своим кодом

Когда типового решения нет, файл собирается программно. Основной объект — ЗаписьXML. Он пишет поток элементов и сам заботится об экранировании служебных символов.

Простая выгрузка справочника

Пример выгружает контрагентов с ИНН и наименованием. Подойдёт для любой конфигурации, где есть справочник Контрагенты.

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

    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();

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

    Выборка = Справочники.Контрагенты.Выбрать();
    Пока Выборка.Следующий() Цикл
        Если Выборка.ЭтоГруппа Тогда
            Продолжить;
        КонецЕсли;

        ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");
        ЗаписьXML.ЗаписатьАтрибут("Код", Выборка.Код);

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

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

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

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

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

На выходе получится примерно такой файл:

<?xml version="1.0" encoding="UTF-8"?>
<Контрагенты>
  <Контрагент Код="000000001">
    <Наименование>ООО Ромашка</Наименование>
    <ИНН>7701234567</ИНН>
  </Контрагент>
</Контрагенты>

Имена тегов по-русски допустимы, но внешние системы чаще ждут латиницу. Если схему диктует партнёр, берите его названия один в один.

Запись чисел и дат

Это самое частое место, где ломается обмен. В XML всё текст, поэтому формат нужно задать явно.

  • 🔢 Числа: функция XMLСтрока(Значение) даёт точку как разделитель, без пробелов между разрядами.
  • 📅 Даты: тот же XMLСтрока выдаёт ISO-формат вида 2026-10-06T00:00:00.
  • ✅ Булево: пишется как true или false.
ЗаписьXML.ЗаписатьНачалоЭлемента("Сумма");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Выборка.Сумма));
ЗаписьXML.ЗаписатьКонецЭлемента();

Не используйте Строка(Число). Она вернёт «1 234,50» с неразрывным пробелом и запятой, и принимающая сторона не разберёт значение.

Когда нужен ПостроительDOM

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

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Чтение.Закрыть();

Узлы = Документ.ПолучитьЭлементыПоИмени("ИНН");
Для Каждого Узел Из Узлы Цикл
    Сообщить(Узел.ТекстовоеСодержимое);
КонецЦикла;

Так удобно быстро пройтись по всем тегам с нужным именем, не выстраивая цикл по потоку.

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

Как прочитать XML-файл в 1С

Загрузка зеркальна выгрузке: открываете файл, идёте по узлам и забираете значения.

Процедура ЗагрузитьКонтрагентов(ИмяФайла)

    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);

    Пока Чтение.Прочитать() Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента
            И Чтение.Имя = "Контрагент" Тогда

            Код = Чтение.ПолучитьАтрибут("Код");
            Наименование = "";
            ИНН = "";

            Пока Чтение.Прочитать() Цикл
                Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента
                    И Чтение.Имя = "Контрагент" Тогда
                    Прервать;
                КонецЕсли;
                Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                    Имя = Чтение.Имя;
                    Чтение.Прочитать();
                    Если Имя = "Наименование" Тогда
                        Наименование = Чтение.Значение;
                    ИначеЕсли Имя = "ИНН" Тогда
                        ИНН = Чтение.Значение;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;

            // здесь поиск по ИНН и создание элемента справочника
        КонецЕсли;
    КонецЦикла;

    Чтение.Закрыть();

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

Перед созданием элемента ищите существующий по ИНН или коду. Иначе повторная загрузка того же файла наплодит дублей.

Контроль структуры до загрузки

Файл от партнёра лучше проверить по схеме XSD, если она у вас есть. Платформа умеет читать файл с проверкой на соответствие схеме, а ошибку выдаёт с номером строки. Это дешевле, чем разбирать полузагруженные данные.

Схема файла: как описать структуру до написания кода

Хороший обмен начинается с таблицы соответствия. Составьте её до того, как откроете конфигуратор: что в 1С, как называется тег, какой формат значения.

Сопоставление полей
Наименование→Тег Наименование, строка
ИНН→Тег ИНН, десять или двенадцать цифр текстом
Код→Атрибут Код элемента Контрагент
Дата документа→Тег Дата, формат ISO через XMLСтрока
Сумма→Тег Сумма, точка как разделитель
Ссылка на объект→Уникальный идентификатор, строка

Атрибут или вложенный тег

Оба варианта законны. Практическое правило простое:

  • 🏷️ Атрибут — для коротких идентифицирующих значений: код, номер, признак.
  • 📦 Вложенный тег — для текста, длинных значений и всего, что может повторяться.
  • 🧩 Если схему дал партнёр, ваше мнение не учитывается: делайте как в образце.

Пространства имён

Если в файле есть xmlns, имена тегов привязаны к пространству. При записи используйте перегрузку ЗаписатьНачалоЭлемента с указанием пространства имён, при чтении сравнивайте Чтение.ИмяПространстваИмён. Частая ошибка: тег на месте, а код его не находит, потому что пространство не совпало.

Большие файлы

Выгрузка на 200 тысяч элементов потоковым способом идёт заметно быстрее и не съедает память. Если файл перевалил за сотни мегабайт, разбивайте его по периодам: один файл на месяц. Принимающей стороне так проще, а при сбое перегружать нужно только один кусок.

Подготовка и порядок работ

Чтобы не переделывать выгрузку, пройдите шаги перед запуском.

Перед первой выгрузкой XML
Выполнено: 0 / 6

Типичные ошибки при работе с XML в 1С

Ниже то, что встречается чаще всего. Тексты ошибок приведены в том виде, как их показывает платформа.

Диагностика: выберите симптом

Спецсимволы в тексте

Знаки <, >, & в содержимом нельзя писать как есть. ЗаписьXML.ЗаписатьТекст экранирует их сам, поэтому собирать XML склейкой строк не стоит. Типичная причина «битого» файла — именно ручная сборка вида "<Имя>" + Наименование + "</Имя>", где в названии встретился амперсанд.

Если файл не открывается или не грузится

Идите от простого к сложному:

  1. 🔍 Откройте файл в браузере. Он покажет строку и позицию первой синтаксической ошибки.
  2. 📝 Проверьте кодировку в текстовом редакторе, в строке состояния обычно видно, какая выбрана.
  3. 🧪 Загрузите уменьшенный файл с одним-двумя объектами. Если прошёл, проблема в конкретной записи.
  4. 🗂️ Проверьте, что в принимающей базе есть все справочники, на которые ссылаются объекты файла.
  5. 🧰 Если ничего не помогло, запишите значения в журнал и сверьте с образцом по тегам.

Для разбора, какой вариант под вашу ситуацию, воспользуйтесь схемой.

Что у вас на другой стороне обмена?

Как не получить проблем при обмене

  • 🛡️ Выгружайте и загружайте в тестовую базу, пока обмен не отлажен.
  • 🧾 Ведите журнал: что выгружено, сколько объектов, когда.
  • 🔑 Используйте уникальный идентификатор как ключ, а не наименование: названия меняют.
  • 📏 Делите большие выгрузки на пакеты по периодам или по объёму.
  • 🔄 После обновления конфигурации проверяйте правила обмена. Структура объектов могла измениться.
Какой способ обмена данными вы используете чаще всего?

Частые вопросы

В какой кодировке сохранять XML-файл из 1С?
В UTF-8, если принимающая сторона не требует другого. Кодировка задаётся вторым параметром ОткрытьФайл, и она же попадает в декларацию файла.
Можно ли выгрузить табличную часть документа в XML?
Да. Внутри элемента документа открывайте вложенный элемент для каждой строки и пишите её реквизиты в цикле по табличной части.
Как выгрузить XML в строку, а не в файл?
Вызовите УстановитьСтроку вместо ОткрытьФайл, запишите элементы как обычно и заберите текст результатом метода Закрыть. Так удобно передавать данные в веб-сервис.
Чем XML лучше CSV для обмена?
Он хранит вложенность: документ со строками, справочник с реквизитами и табличными частями. В CSV такие данные приходится разворачивать в плоскую таблицу.
Нужно ли ставить дополнительные компоненты для работы с XML?
Нет. ЗаписьXML, ЧтениеXML и ПостроительDOM входят в платформу 1С:Предприятие 8.3 и доступны без установки.
Как открыть XML-файл, чтобы посмотреть структуру?
Подойдёт браузер или любой текстовый редактор. Для больших файлов лучше редактор, который показывает дерево узлов.