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

Эта статья поможет разобраться, как читать и записывать XML в 1С 8.3, настраивать обмен с внешними системами, обрабатывать типичные ошибки и оптимизировать производительность. Мы рассмотрим как ручные методы через встроенный язык, так и автоматизированные инструменты — УниверсальныеФорматыОбменаДанными, ЗаписьXML/ЧтениеXML, а также интеграцию с веб-сервисами. Особое внимание уделим обмену с 1С:Бухгалтерией и 1С:УТ через XML, так как это наиболее востребованные сценарии среди пользователей.

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

1. Основы XML в 1С: структура и терминология

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

<Каталог>

<Товар>

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

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

<Цена>18000</Цена>

</Товар>

</Каталог>

В для работы с XML используются следующие ключевые объекты:

  • 📄 ЗаписьXML — класс для создания XML-файлов.
  • 📖 ЧтениеXML — класс для парсинга существующих файлов.
  • 🔄 XDTO — механизм для работы с XSD-схемами (валидация и генерация структур).
  • 🔗 УниверсальныеФорматыОбменаДанными — стандартный функционал для обмена между конфигурациями .

Важно отличать простой XML (произвольная структура) от типизированного (с привязкой к XSD-схеме). Последний чаще используется в госотчётности (например, СБИС или Контур.Диадок), где требуется строгая валидация.

📊 Какой формат обмена вы используете чаще?
XML
JSON
CSV
Excel
Другой

2. Чтение XML в 1С: пошаговая инструкция

Рассмотрим, как загрузить данные из XML в 1С 8.3 на примере файла с товарами. Предположим, у нас есть файл catalog.xml следующей структуры:

<Каталог>

<Товар Ид="1">

<Наименование>Ноутбук</Наименование>

<Цена>50000</Цена>

</Товар>

<Товар Ид="2">

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

<Цена>30000</Цена>

</Товар>

</Каталог>

Для чтения файла используем объект ЧтениеXML:

// Подключаем файл

ПутьКФайлу = "C:\obmen\catalog.xml";

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл(ПутьКФайлу);

// Обрабатываем узлы

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

Если Чтение.Имя = "Товар" Тогда

Ид = Чтение.ЗначениеАтрибута("Ид");

ИначеЕсли Чтение.Имя = "Наименование" Тогда

Наименование = Чтение.ПрочитатьТекст();

ИначеЕсли Чтение.Имя = "Цена" Тогда

Цена = Чтение.ПрочитатьТекст();

КонецЕсли;

КонецЕсли;

КонецЦикла;

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

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

☑️ Подготовка к чтению XML

Выполнено: 0 / 4
⚠️ Внимание: Если XML-файл содержит кириллицу, убедитесь, что он сохранён в кодировке UTF-8. В противном случае может неправильно интерпретировать символы, что приведёт к ошибкам при чтении.

3. Запись XML в 1С: создание файлов обмена

Для генерации XML в используется объект ЗаписьXML. Рассмотрим пример создания файла со списком контрагентов:

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

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

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

// Записываем корневой элемент

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

// Добавляем данных (например, из справочника)

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

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

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

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

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

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

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

КонецЦикла;

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

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

Ключевые моменты:

  • 📌 Всегда указывайте кодировку ("UTF-8") при открытии файла.
  • 🔄 Используйте ЗаписатьАтрибут() для добавления атрибутов тега (например, Ид="123").
  • 📝 Для больших файлов (>10 000 строк) используйте потоковую запись через ЗаписьXML.ОткрытьПоток().
⚠️ Внимание: При записи дат в XML используйте формат ГГГГ-ММ-ДД (например, 2026-05-20). В противном случае внешняя система может некорректно интерпретировать данные.

4. Обмен данными между конфигурациями 1С через XML

Для обмена между разными базами (например, 1С:Бухгалтерия и 1С:ЗУП) удобно использовать стандартный механизм УниверсальныеФорматыОбменаДанными. Он позволяет:

  • 🔄 Экспортировать справочники и документы в XML.
  • 📥 Импортировать данные с автоматическим сопоставлением объектов.
  • 🔍 Контролировать версии обмена.

Пример выгрузки справочника Номенклатура:

// Создаём пакет обмена

Пакет = Новый ПакетОбмена();

Пакет.ИмяФайла = "nomenklatura.xml";

// Добавляем данные

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

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

Пакет.ДобавитьОбъект(Выборка.Ссылка);

КонецЦикла;

// Записываем в файл

Пакет.Записать();

Для импорта используйте метод Прочитать():

Пакет = Новый ПакетОбмена();

Пакет.Прочитать("C:\obmen\nomenklatura.xml");

Пакет.Загрузить();

Преимущества этого подхода:

Способ обмена Плюсы Минусы
УниверсальныеФорматыОбменаДанными Автоматическое сопоставление объектов, контроль версий Требует одинаковых конфигураций или ручной настройки правил
Ручной ЗаписьXML/ЧтениеXML Гибкость, работа с любыми структурами Трудоёмкость при сложных схемах
XDTOXSD-схемой) Валидация, поддержка стандартов (например, УПД) Сложность настройки для новичков
💡

Если обмен происходит регулярно, настройте регламентное задание в для автоматической выгрузки XML по расписанию (например, ежедневно в 23:00).

5. Обработка ошибок при работе с XML

Типичные ошибки при работе с XML в и способы их решения:

  • 🚨 Ошибка при чтении XML: неверный формат — проверьте кодировку файла и наличие закрывающих тегов.
  • 🚨 Атрибут не найден — убедитесь, что имя атрибута указано верно (регистр имеет значение!).
  • 🚨 Несоответствие типов данных — например, попытка записать число в текстовом поле.

Для отладки используйте конструкцию Попытка...Исключение:

Попытка

ЧтениеXML.ОткрытьФайл(ПутьКФайлу);

// ... код чтения ...

Исключение

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

ЗаписатьЛог(ОписаниеОшибки()); // Для анализа

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

Если ошибка связана с XSD-валидацией, проверьте:

  • 🔍 Соответствие структуры XML схеме.
  • 🔍 Наличие обязательных полей.
  • 🔍 Формат данных (например, дата должна быть в YYYY-MM-DD).
Как проверить XML на валидность?

Используйте онлайн-валидаторы (например, XMLValidation) или встроенные средства через XDTOПакеты.ПрочитатьXML() с указанием схемы XSD.

6. Оптимизация работы с большими XML-файлами

При обработке файлов объёмом >100 МБ стандартные методы ЧтениеXML/ЗаписьXML могут работать медленно. Для ускорения используйте:

  • 🚀 Потоковую обработку — чтение/запись данных порциями.
  • 🚀 DOM-парсинг (для сложных структур) через XDTOМодель.
  • 🚀 Разбивку на части — обработку файла в несколько этапов.

Пример потокового чтения:

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл(ПутьКФайлу);

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

// Обрабатываем только нужные узлы

Если Чтение.Имя = "Товар" Тогда

Данные = ОбработатьТовар(Чтение);

ЗаписатьВБазу(Данные);

КонецЕсли;

КонецЕсли;

КонецЦикла;

Для записи больших файлов используйте ЗаписьXML.ОткрытьПоток():

Поток = Новый ЗаписьДвоичныхДанных();

Поток.ОткрытьФайл("big_file.xml");

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

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

// ... запись данных ...

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

⚠️ Внимание: При потоковой обработке избегайте хранения всех данных в памяти. Используйте временные таблицы или запись в базу по мере чтения.
💡

Для файлов >1 ГБ рассмотрите возможность использования внешних инструментов (например, Python или C#) для предварительной обработки XML перед загрузкой в .

7. Интеграция с веб-сервисами через XML (SOAP)

поддерживает обмен данными с веб-сервисами по протоколу SOAP, который часто использует XML для передачи данных. Например, для отправки данных в ФНС или ПФР.

Пример вызова SOAP-сервиса:

// Создаём HTTP-соединение

HTTPСоединение = Новый HTTPСоединение("https://service.example.com/wsdl");

// Формируем XML-запрос

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

Запрос.ОткрытьСтроку();

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

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

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

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

Запрос.ЗаписатьТекст("Parameter", "Value");

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

// ... закрываем теги ...

XMLСтрока = Запрос.Закрыть();

// Отправляем запрос

Ответ = HTTPСоединение.Постить("/endpoint", XMLСтрока);

// Обрабатываем ответ

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьСтроку(Ответ.ПолучитьТекст());

Особенности работы с SOAP:

  • 🔌 Требуется WSDL-описание сервиса для генерации прокси-классов в .
  • 🔐 Часто нужна аутентификация (например, через HTTP-заголовки или WS-Security).
  • 📡 Для отладки используйте Postman или SoapUI.

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

Рассмотрим реальные сценарии использования XML в :

Задача Решение Пример кода
Выгрузка справочника Номенклатура для сайта ЗаписьXML + цикл по справочнику
Запись.ЗаписатьНачалоЭлемента("Товар");

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

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

Импорт курсов валют из ЦБ РФ Парсинг XML с сайта ЦБ через ЧтениеXML
Если Чтение.Имя = "Valute" Тогда

КодВалюты = Чтение.ЗначениеАтрибута("ID");

Наименование = Чтение.ПрочитатьТекст("Name");

КонецЕсли;

Обмен с 1С:Бухгалтерией (выгрузка документов) УниверсальныеФорматыОбменаДанными
Пакет.ДобавитьДокумент(Документ.ПоступлениеТоваров);

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

  • 📁 Выбирать путь к файлу.
  • 🔄 Настраивать фильтры (например, только активные товары).
  • ⚙️ Указывать формат даты/чисел.
💡

Для обмена с 1С:УТ 11 и 1С:ERP используйте стандартные обработки "ВыгрузкаЗагрузкаДанныхXML", которые идут в комплекте с конфигурацией.

FAQ: Частые вопросы по работе с XML в 1С

Как преобразовать XML в таблицу значений?

Используйте цикл чтения ЧтениеXML и динамически добавляйте строки в ТаблицаЗначений:

ТЗ = Новый ТаблицаЗначений();

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

ТЗ.Колонки.Добавить("Цена");

Пока Чтение.Прочитать() Цикл

Если Чтение.Имя = "Товар" Тогда

Строка = ТЗ.Добавить();

Строка.Наименование = Чтение.ПрочитатьТекст("Наименование");

Строка.Цена = Чтение.ПрочитатьТекст("Цена");

КонецЕсли;

КонецЦикла;

Можно ли редактировать XML прямо в 1С без выгрузки?

Да, с помощью объекта XDTOМодель или DOM-парсера. Например:

Документ = Новый DOMДокумент();

Документ.Загрузить("file.xml");

Узел = Документ.ПолучитьЭлементыПоИмени("Цена")[0];

Узел.ТекстовоеСодержимое = "25000";

Документ.Сохранить("file_updated.xml");

Но для простых правок удобнее использовать внешние редакторы (например, Notepad++ с плагином XML Tools).

Как валидировать XML по XSD-схеме в 1С?

Используйте механизм XDTO:

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

Фабрика.ПространстваИмен.Добавить("http://example.com/schema", "file.xsd");

Пакет = Фабрика.SчитатьXML(Новый ПотокВПамяти(XMLСтрока));

Если структура не соответствует схеме, будет выброшено исключение.

Какие альтернативы XML есть в 1С?

В зависимости от задачи:

  • 📄 JSON — для обмена с веб-приложениями (используйте ЧтениеJSON/ЗаписьJSON).
  • 📑 CSV — для простых табличных данных (например, прайс-листы).
  • 📊 Excel — через ЧтениеТабличногоДокумента.

XML остаётся предпочтительным для сложных иерархических структур и госотчётности.

Как ускорить обмен данными между двумя базами 1С?

Рекомендации:

  • 🚀 Используйте прямое подключение через COM-соединение вместо XML.
  • 🚀 Настройте регламентные задания на ночное время.
  • 🚀 Применяйте инкрементальную выгрузку (только изменённые данные).
  • 🚀 Для больших объёмов используйте распределённую инфобазу.