Как устроен XML в 1С и как с ним работать на практике

· 9 мин

Содержание

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

Открыть такой файл можно обычным «Блокнотом» — это читаемый текст с вложенными тегами. Но за простым видом стоит строгая структура: пространства имён, схемы, кодировка. Нарушишь их — приём данных упадёт с ошибкой. Ниже разберём, как платформа читает и пишет XML, какие механизмы для этого есть и где чаще всего спотыкаются.

Из чего состоит XML-файл

Файл начинается с пролога — строки вида <?xml version="1.0" encoding="UTF-8"?>. Она объявляет версию стандарта и кодировку. Дальше идёт ровно один корневой элемент, внутри которого вложены все остальные.

Базовые кирпичики такие:

  • 🧱 Элемент — пара тегов <Товар>…</Товар> или самозакрывающийся <Цена/>.
  • 🏷️ Атрибут — пара «имя=значение» внутри открывающего тега: <Товар Ид="42">.
  • 📝 Текст — значение между тегами: <Наименование>Стул офисный</Наименование>.
  • 🗂️ Пространство имён — префикс вроде xmlns:xs="…", который разводит одинаковые имена из разных словарей.

Пример фрагмента выгрузки:

<?xml version="1.0" encoding="UTF-8"?>
<Товары Дата="2026-10-07">
  <Товар Ид="42">
    <Наименование>Стул офисный</Наименование>
    <Цена Валюта="RUB">4500</Цена>
  </Товар>
</Товары>

XML различает регистр: <Товар> и <товар> — разные теги. Открывающий и закрывающий тег должны совпадать до буквы, иначе файл невалиден.

Пять символов в XML служебные, и в тексте их нельзя писать как есть — только через замену:

СимволКак записать
&&amp;
<&lt;
>&gt;
"&quot;
'&apos;

Когда данные формирует сама 1С через ЗаписьXML, замена идёт автоматически — вручную экранировать не нужно. Проблема вылезает, если текст с символом & (например, «ООО “Ромашка & Ко”») пришёл из внешней системы уже внутри готового куска XML. Тогда файл не пройдёт разбор. Длинные фрагменты с разметкой заворачивают в блок <![CDATA[ … ]]> — внутри него спецсимволы не разбираются.

Платформа не привязана к какому-то одному словарю тегов. Структуру задаёт либо прикладная схема (как в CommerceML), либо описание XDTO, либо сам разработчик, когда формирует файл построчно.

Чем 1С читает и пишет XML

В платформе три подхода к работе с XML, и выбор между ними — это вопрос объёма данных и удобства.

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

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\exchange\data.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Товары");
Запись.ЗаписатьАтрибут("Дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();

Чтение устроено зеркально: цикл перебирает узлы, а код реагирует на их тип.

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\exchange\data.xml");
Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        Сообщить(Чтение.Имя);
    КонецЕсли;
КонецЦикла;
Чтение.Закрыть();

DOM. Объекты ПостроительDOM, ДокументDOM и ЗаписьDOM загружают весь файл в оперативную память как дерево. По нему удобно ходить и искать узлы через XPath, но для крупных файлов это дорого — вся выгрузка оказывается в памяти разом.

Сериализация XDTO. Глобальный СериализаторXDTO превращает прикладной объект 1С — документ, элемент справочника, набор записей — в XML и обратно, без ручного перечисления полей.

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\exchange\nomenclature.xml");
СериализаторXDTO.ЗаписатьXML(Запись, ЭлементНоменклатуры);
Запись.Закрыть();

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

Обмен с сайтом по стандарту CommerceML

Выгрузка каталога в интернет-магазин идёт через открытый формат CommerceML (в русской документации — «КоммерцияМЛ»). Его понимают 1С-Битрикс и большинство популярных CMS. Обмен двусторонний: из 1С на сайт уходят товары и цены, с сайта в 1С возвращаются заказы.

Данные разложены по нескольким файлам:

ФайлЧто внутри
import.xmlКаталог: группы, товары, свойства, картинки
offers.xmlТорговые предложения: цены, остатки, характеристики
orders.xmlЗаказы покупателей, принятые с сайта

Логика тут простая: import.xml описывает сам товар (что это), offers.xml — его коммерческую часть (сколько стоит и сколько есть). Сопоставление полей между 1С и форматом выглядит так:

Сопоставление полей
Элемент справочника «Номенклатура»→Товар (import.xml)
Код или GUID товара→Ид
Тип цен→ТипЦены (offers.xml)
Остаток по складу→Количество (offers.xml)
Характеристика номенклатуры→Предложение с собственным Ид

Настройка обмена живёт в узле обмена с сайтом: в «Управлении торговлей» и «Комплексной автоматизации» это раздел обмена с сайтом, в «Бухгалтерии предприятия» — отдельная обработка обмена с сайтом (1С-Битрикс). В карточке узла задают адрес сайта, логин и пароль, типы цен и склады для выгрузки, расписание.

Ключевое поле связи — идентификатор товара (Ид). Именно по нему сайт и 1С понимают, что речь об одной и той же позиции при повторных выгрузках. Если идентификаторы «поедут», каталог задвоится.

XDTO и универсальный формат EnterpriseData

XDTO (XML Data Transfer Objects) — это механизм типизированного обмена. В отличие от «сырых» тегов, каждый элемент здесь привязан к типу: строка, дата, ссылка на объект, вложенная структура. Типы собраны в пакеты XDTO, а доступ к ним даёт фабрика XDTO.

Зачем это нужно: при типизированном обмене принимающая сторона сразу знает, что <Сумма> — число, а не текст, и может проверить файл на соответствие схеме ещё до загрузки. Ошибку ловят на входе, а не на середине переноса.

На XDTO построен EnterpriseData — универсальный формат, по которому синхронизируются типовые конфигурации: «Бухгалтерия» с «Зарплатой и управлением персоналом», «Управление торговлей» с «Бухгалтерией» и так далее. Когда вы настраиваете «Синхронизацию данных» между двумя базами 1С, под капотом гоняются как раз XML-пакеты EnterpriseData.

Плюс EnterpriseData в том, что конфигурации не обязаны знать внутреннее устройство друг друга — они договариваются через общий словарь документов и справочников. Обновили одну базу — обмен продолжает работать, пока формат совместим.

Типизация даёт ещё один бонус — проверку по схеме. У каждого формата XDTO есть описание допустимых элементов и их типов (XSD-схема). Принимающая сторона может сверить входящий файл со схемой и отбраковать его целиком, если структура не совпала, не доходя до загрузки в базу. Это бережёт данные: битый пакет не проходит частично, оставляя половину документов загруженной, а половину — нет.

На XDTO работают и веб-сервисы 1С. Когда одна система вызывает SOAP-сервис другой, запрос и ответ едут в виде XML, а их структуру описывает всё та же фабрика XDTO. Так 1С общается с банковскими и государственными сервисами, у которых опубликован формат обмена.

EnterpriseData подходит для обмена между базами 1С. Для связи с внешними системами — сайтом, банком, госсервисом — обычно берут их собственный формат (CommerceML, форматы ФНС, банковские XML).

Как настроить узел обмена в интерфейсе

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

  1. Откройте раздел Администрирование → Синхронизация данных и включите флажок синхронизации.
  2. Создайте новую настройку, выберите формат (для баз 1С — EnterpriseData) и способ связи: напрямую по сети, через каталог на диске или по FTP.
  3. Укажите каталог или адрес, куда складывать файлы обмена.
  4. Настройте правила: какие организации, склады и периоды выгружать.
  5. Задайте расписание в Администрирование → Обслуживание либо запускайте обмен вручную кнопкой синхронизации.

Для обмена через каталог на диске 1С кладёт XML-файлы в общую папку, а вторая база их оттуда забирает. Это самый прозрачный вариант для диагностики: файлы видно глазами.

Названия разделов немного отличаются между «Бухгалтерией», «ЗУП» и «Управлением торговлей», но верхний уровень — Администрирование — есть везде. Если синхронизации в меню нет, проверьте, что роль пользователя даёт к ней доступ.

После первой настройки полезно прогнать обмен вручную и посмотреть, что оба справочника «Номенклатура» и «Контрагенты» сошлись. Расхождения на старте лечатся проще, чем после недели автоматических выгрузок.

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

Частые ошибки при чтении и формировании XML

Большинство сбоев обмена — это не «1С сломалась», а несовпадение формата, кодировки или прав. Разберём по симптомам.

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

Отдельно про кодировку: это причина номер один по «кракозябрам». Правило простое — кодировка в прологе <?xml encoding="…"?> должна совпадать с тем, как файл реально сохранён на диске. При потоковой записи кодировку задают в ОткрытьФайл, и она же попадёт в объявление, если не вмешиваться вручную.

Большие файлы: как не упереться в память

Когда выгрузка измеряется сотнями тысяч строк, выбор механизма перестаёт быть делом вкуса.

  • 🚿 Только потоковое чтение. ЧтениеXML идёт по файлу узел за узлом и не держит его целиком в памяти. Для крупных обменов это единственный безопасный путь.
  • 🧩 Обрабатывайте порциями. Не копите всё прочитанное в одну коллекцию — записывайте в базу пачками и очищайте промежуточные данные.
  • ⚡ Fast Infoset. Платформа умеет двоичное представление XML (объекты ЧтениеFastInfoset / ЗаписьFastInfoset). Файл выходит компактнее и читается быстрее, но обе стороны должны его поддерживать.
  • 🗜️ Сжатие при передаче. XML хорошо жмётся — архивируйте файл перед отправкой по сети, это экономит трафик и время.

DOM на большом файле грузит всё дерево в память рабочего процесса. На сервере с несколькими активными сеансами это рискует уронить процесс по памяти — на объёмных выгрузках избегайте DOM.

Если обмен всё равно тяжёлый, дробите его по времени: выгружайте не весь каталог сразу, а изменения за период. В типовых обменах по планам обмена это работает «из коробки» — уходят только объекты, помеченные к выгрузке с прошлой синхронизации.

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

Можно ли открыть и поправить XML-файл обмена вручную?
Да, это обычный текст — открывается «Блокнотом» или любым редактором с подсветкой. Но правьте осторожно: лишний пробел в теге или сломанная кодировка сделают файл невалидным, и приём упадёт.
Чем XDTO отличается от обычного XML?
XDTO добавляет типизацию: каждый элемент привязан к типу (число, дата, ссылка), и файл можно проверить на соответствие схеме до загрузки. «Сырой» XML такой проверки не даёт — там всё строки.
В какой кодировке 1С формирует файлы обмена?
По умолчанию в типовых обменах — UTF-8. Главное, чтобы кодировка в объявлении <?xml?> совпадала с реальной кодировкой файла на диске, иначе будут «кракозябры».
Почему после выгрузки на сайте задвоились товары?
Чаще всего «поехали» идентификаторы (Ид): сайт не узнал старые позиции и создал новые. Проверьте, что при повторной выгрузке у товаров сохраняется тот же уникальный идентификатор.
CommerceML и EnterpriseData — это одно и то же?
Нет. CommerceML — формат для обмена с сайтами и интернет-магазинами. EnterpriseData — универсальный формат на базе XDTO для синхронизации между базами 1С. Задачи разные.