Как устроен XML в 1С и как с ним работать на практике
Содержание
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 служебные, и в тексте их нельзя писать как есть — только через замену:
| Символ | Как записать |
|---|---|
& | & |
< | < |
> | > |
" | " |
' | ' |
Когда данные формирует сама 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С и форматом выглядит так:
Настройка обмена живёт в узле обмена с сайтом: в «Управлении торговлей» и «Комплексной автоматизации» это раздел обмена с сайтом, в «Бухгалтерии предприятия» — отдельная обработка обмена с сайтом (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С — EnterpriseData) и способ связи: напрямую по сети, через каталог на диске или по FTP.
- Укажите каталог или адрес, куда складывать файлы обмена.
- Настройте правила: какие организации, склады и периоды выгружать.
- Задайте расписание в
Администрирование → Обслуживаниелибо запускайте обмен вручную кнопкой синхронизации.
Для обмена через каталог на диске 1С кладёт XML-файлы в общую папку, а вторая база их оттуда забирает. Это самый прозрачный вариант для диагностики: файлы видно глазами.
Названия разделов немного отличаются между «Бухгалтерией», «ЗУП» и «Управлением торговлей», но верхний уровень — Администрирование — есть везде. Если синхронизации в меню нет, проверьте, что роль пользователя даёт к ней доступ.
После первой настройки полезно прогнать обмен вручную и посмотреть, что оба справочника «Номенклатура» и «Контрагенты» сошлись. Расхождения на старте лечатся проще, чем после недели автоматических выгрузок.
Если обмен настроен, но данные не доходят, смотрите в двух местах. Первое — физический файл XML в каталоге обмена: он есть, он дописан до конца, в нём видны нужные объекты. Второе — журнал регистрации принимающей базы: при сбое загрузки там останется текст ошибки с именем файла и типом объекта, на котором разбор остановился. Этого обычно хватает, чтобы понять, формат виноват, права на папку или несовпадение версий.
Частые ошибки при чтении и формировании XML
Большинство сбоев обмена — это не «1С сломалась», а несовпадение формата, кодировки или прав. Разберём по симптомам.
Отдельно про кодировку: это причина номер один по «кракозябрам». Правило простое — кодировка в прологе <?xml encoding="…"?> должна совпадать с тем, как файл реально сохранён на диске. При потоковой записи кодировку задают в ОткрытьФайл, и она же попадёт в объявление, если не вмешиваться вручную.
Большие файлы: как не упереться в память
Когда выгрузка измеряется сотнями тысяч строк, выбор механизма перестаёт быть делом вкуса.
- 🚿 Только потоковое чтение.
ЧтениеXMLидёт по файлу узел за узлом и не держит его целиком в памяти. Для крупных обменов это единственный безопасный путь. - 🧩 Обрабатывайте порциями. Не копите всё прочитанное в одну коллекцию — записывайте в базу пачками и очищайте промежуточные данные.
- ⚡ Fast Infoset. Платформа умеет двоичное представление XML (объекты
ЧтениеFastInfoset/ЗаписьFastInfoset). Файл выходит компактнее и читается быстрее, но обе стороны должны его поддерживать. - 🗜️ Сжатие при передаче. XML хорошо жмётся — архивируйте файл перед отправкой по сети, это экономит трафик и время.
DOM на большом файле грузит всё дерево в память рабочего процесса. На сервере с несколькими активными сеансами это рискует уронить процесс по памяти — на объёмных выгрузках избегайте DOM.
Если обмен всё равно тяжёлый, дробите его по времени: выгружайте не весь каталог сразу, а изменения за период. В типовых обменах по планам обмена это работает «из коробки» — уходят только объекты, помеченные к выгрузке с прошлой синхронизации.
Частые вопросы
Можно ли открыть и поправить XML-файл обмена вручную?
Чем XDTO отличается от обычного XML?
В какой кодировке 1С формирует файлы обмена?
<?xml?> совпадала с реальной кодировкой файла на диске, иначе будут «кракозябры».Почему после выгрузки на сайте задвоились товары?
Ид): сайт не узнал старые позиции и создал новые. Проверьте, что при повторной выгрузке у товаров сохраняется тот же уникальный идентификатор.