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

Особенность XML в заключается в том, что платформа предоставляет встроенные механизмы для работы с этим форматом — от простого чтения через ЧтениеXML до сложных преобразований с использованием XDTO и XSLT. Но даже опытные разработчики сталкиваются с нюансами: например, как корректно экранировать специальные символы или почему при обмене с некоторыми системами (например, Диадок или Контур) XML должен строго соответствовать XSD-схеме, иначе данные не пройдут валидацию.

В этой статье мы рассмотрим:

  • 📌 Базовую структуру XML-документов и их представление в .
  • 🔧 Практические примеры чтения, записи и преобразования XML.
  • ⚠️ Типичные ошибки и способы их устранения (от неверной кодировки до несоответствия схем).
  • 🔄 Интеграцию с внешними системами: что требуют контрагенты и как адаптировать XML под их стандарты.
📊 Как часто вы работаете с XML в 1С?
Ежедневно
Несколько раз в неделю
Редико
Никогда

1. Структура XML в 1С: от тегов к объектам платформы

XML-документ в — это иерархическая структура, где каждый элемент (тег) может содержать атрибуты, дочерние элементы или текстовое значение. Платформа 1С:Предприятие представляет XML как объект типа ДокументDOM, ЧтениеXML или ЗаписьXML, в зависимости от задачи.

Основные компоненты XML в контексте :

  • 📜 Корневой элемент: обязательный узел, который содержит все остальные данные. Например, <КаталогТоваров>.
  • 🏷️ Теги (элементы): могут быть вложенными (например, <Товар><Наименование>Монитор</Наименование></Товар>).
  • 🔑 Атрибуты: параметры элементов, например, Ид="12345".
  • 📝 Текстовое содержимое: данные внутри тега, например, <Цена>15000</Цена>.

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

Объект Назначение Пример использования
ЧтениеXML Парсинг XML-строки или файла
Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\data.xml");

ЗаписьXML Формирование XML-документа
Запись = Новый ЗаписьXML;

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

ДокументDOM Работа с XML как с деревом объектов
Документ = Новый ДокументDOM;

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

XDTO Работа со схемами XSD и валидация
Фабрика = Новый ФабрикаXDTO;

Схема = Фабрика.Схема("http://example.com/schema");

⚠️ Внимание: При работе с ДокументDOM учитывайте, что он загружает весь XML в память. Для больших файлов (более 50 МБ) используйте потоковое чтение через ЧтениеXML, чтобы избежать ошибок нехватки памяти.

2. Чтение XML в 1С: от строки к данным

Чтение XML в начинается с создания объекта ЧтениеXML. Этот объект позволяет последовательно обходить элементы документа, извлекая данные. Рассмотрим базовый пример:

Предположим, у нас есть XML-файл с каталогом товаров:

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

<Каталог>

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

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

<Цена>15000</Цена>

</Товар>

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

<Наименование>Клавиатура</Наименование>

<Цена>2000</Цена>

</Товар>

</Каталог>

Чтобы прочитать этот файл и загрузить данные в таблицу значений, используем следующий код:

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

Чтение.ОткрытьФайл("C:\catalog.xml");

// Пропускаем объявление XML и корневой элемент

Чтение.Прочитать();

Чтение.Прочитать();

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

Товары.Колонки.Добавить("Ид");

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

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

Пока Чтение.ТипУзла() <> ТипУзлаXML.КонецЭлемента Цикл

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

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

Чтение.Прочитать(); // Переходим к первому дочернему элементу

Наименование = "";

Цена = 0;

Пока Чтение.ТипУзла() <> ТипУзлаXML.КонецЭлемента Цикл

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

Наименование = Чтение.Значение;

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

Цена = Чтение.Значение;

КонецЕсли;

Чтение.Прочитать();

КонецЦикла;

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

НоваяСтрока.Ид = Ид;

НоваяСтрока.Наименование = Наименование;

НоваяСтрока.Цена = Цена;

КонецЕсли;

Чтение.Прочитать();

КонецЦикла;

1. Создать объект ЧтениеXML

2. Открыть файл или строку с помощью ОткрытьФайл() или УстановитьСтроку()

3. Пропустить объявление XML и корневой элемент

4. Организовать цикл по узлам с проверкой ТипУзла()

5. Извлечь данные из атрибутов и текстовых значений

-->

3. Запись XML в 1С: формируем документ по правилам

Запись XML в осуществляется с помощью объекта ЗаписьXML. Этот процесс требует внимания к деталям: необходимо корректно открывать и закрывать теги, экранировать специальные символы (например, &, <, >) и следить за кодировкой.

Пример формирования XML-документа с каталогом товаров:

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

Запись.УстановитьСтроку();

Запись.ЗаписатьОбъявлениеXML(); // <?xml version="1.0" encoding="utf-8"?>

// Открываем корневой элемент

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

// Добавляем первый товар

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

Запись.ЗаписатьАтрибут("Ид", "1");

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

Запись.ЗаписатьТекст("Монитор 24\"");

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

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

Запись.ЗаписатьТекст("15000");

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

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

// Добавляем второй товар

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

Запись.ЗаписатьАтрибут("Ид", "2");

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

Запись.ЗаписатьТекст("Клавиатура");

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

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

Запись.ЗаписатьТекст("2000");

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

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

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

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

Результат = Запись.Закрыть();

Сообщить(Результат);

Особое внимание уделите:

  • 🔹 Экранированию символов: например, кавычка в Монитор 24" должна быть заменена на " или записана как "\" (в зависимости от контекста).
  • 🔹 Кодировке: если в XML есть кириллица, убедитесь, что кодировка указана как utf-8 или windows-1251 (в зависимости от требований системы-получателя).
  • 🔹 Порядку тегов: некоторые системы (например, 1С:EDT или Контур.Диадок) требуют строгого соблюдения последовательности элементов.
💡

Если XML-документ предназначен для обмена с внешней системой, всегда уточняйте у контрагента требования к структуре и кодировке. Например, ФНС для отчетности требует windows-1251, а Диадокutf-8.

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

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

4.1. Ошибка: "Недопустимый символ в значении XML"

Эта ошибка возникает, когда в текстовом содержимом или атрибуте встречаются неэкранированные символы &, <, >, " или '. Решение — использовать метод ЭкранироватьСтрокуXML():

НеэкранированнаяСтрока = "Цена < 1000";

ЭкранированнаяСтрока = ЭкранироватьСтрокуXML(НеэкранированнаяСтрока);

// Результат: "Цена &lt; 1000"

4.2. Ошибка: "Неверная кодировка XML"

Если при чтении XML вы видите "кракозябры" вместо кириллицы, проблема в несовпадении кодировки файла и ожидаемой кодировки в . Решение:

  • 📋 Убедитесь, что в объявлении XML указана правильная кодировка: <?xml version="1.0" encoding="utf-8"?>.
  • 📋 При чтении файла явно укажите кодировку: Чтение.ОткрытьФайл("file.xml", "utf-8");.
  • 📋 Если файл в windows-1251, используйте КодировкаТекста.ANSI.

4.3. Ошибка: "Несоответствие структуры XML схеме XSD"

Многие внешние системы (например, Контур.Диадок или СБИС) требуют, чтобы XML строго соответствовал заданной схеме XSD. Если структура не совпадает, обмен данными будет отклонен. Решение:

  • 🔍 Используйте ФабрикаXDTO для валидации XML по схеме:
Фабрика = Новый ФабрикаXDTO;

Схема = Фабрика.Схема("http://example.com/schema.xsd");

Валидатор = Фабрика.СоздатьВалидатор();

Если Не Валидатор.Валидировать(ДокументXML) Тогда

Сообщить("Ошибка валидации: " + Валидатор.ПолучитьОшибки());

КонецЕсли;

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

5. Обмен данными: XML как мост между 1С и внешними системами

XML — это стандарт de facto для обмена данными между и другими системами: бухгалтерскими сервисами (Контур.Эльба, МойСклад), банками (СберБизнес, Тинькофф), маркетплейсами (Озон, Wildberries) и госорганами (ФНС, ПФР). Однако каждая система предъявляет свои требования к структуре XML.

Рассмотрим ключевые нюансы интеграции:

Система Требования к XML Типичные проблемы
Контур.Диадок Строгая схема XSD, обязательные атрибуты Ид и ВерсияФормата Отказ из-за отсутствия обязательных тегов или неверной сигнатуры
ФНС (отчетность) Кодировка windows-1251, обязательное объявление XML Ошибки при валидации из-за неверных дат или сумм
Озон (маркетплейс) JSON внутри XML (например, в теге <AdditionalData>) Проблемы с экранированием кавычек в JSON-блоках
СберБизнес Подпись XML с помощью ГОСТ Р 34.10-2012 Ошибки при проверке электронной подписи

Пример адаптации XML под требования Контур.Диадок:

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

<Файл ВерсияСхемы="5.01">

<Документ Ид="123" Тип="СчетФактура" ВерсияФормата="5.01">

<Контрагент ИНН="1234567890" КПП="123456789" Наименование="ООО Ромашка"/>

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

<Строка НомерСтроки="1" Наименование="Товар1" Количество="2" Цена="1000"/>

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

</Документ>

</Файл>

Обратите внимание на:

  • 🔸 Обязательные атрибуты ВерсияСхемы и ВерсияФормата.
  • 🔸 Структуру тегов: например, <ТабличнаяЧасть> должна содержать <Строка> с определенными атрибутами.
  • 🔸 Формат данных: суммы указываются без разделителей тысяч, даты — в формате ГГГГ-ММ-ДД.
Что делать, если XML отклоняется контрагентом?

1. Запросите у контрагента пример корректного XML и схему XSD.

2. Сравните ваш XML с примером с помощью инструментов вроде XML Notepad или Oxygen XML Editor.

3. Проверьте XML на валидность с помощью онлайн-сервисов (например, https://www.xmlvalidation.com/).

4. Убедитесь, что все обязательные поля заполнены, а данные соответствуют ожидаемым типам (например, числовое поле не содержит букв).

6. Продвинутые техники: XDTO, XSLT и преобразование XML

Для сложных задач обмена данными в предусмотрены механизмы XDTO (работа со схемами XSD) и XSLT (преобразование XML). Эти инструменты позволяют:

  • 🛠️ Валидировать XML по схеме перед отправкой.
  • 🔄 Преобразовывать XML из одного формата в другой (например, из структуры в формат ФНС).
  • 📊 Сериализовать/десериализовать объекты в XML и обратно.

6.1. Валидация XML с помощью XDTO

Если вам нужно убедиться, что XML соответствует схеме XSD, используйте следующий код:

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

Пакет = Фабрика.Пакет("http://example.com/schema");

Схема = Пакет.Схемы.Получить("schema.xsd");

Валидатор = Фабрика.СоздатьВалидатор();

ДокументXML = Фабрика.ПрочитатьXML(Новый ЧтениеXML(Новый СтроковыйПоток(XMLСтрока)));

Если Не Валидатор.Валидировать(ДокументXML) Тогда

Ошибки = Валидатор.ПолучитьОшибки();

Для Каждого Ошибка Из Ошибки Цикл

Сообщить(Ошибка.Сообщение);

КонецЦикла;

Иначе

Сообщить("XML соответствует схеме!");

КонецЕсли;

6.2. Преобразование XML с помощью XSLT

XSLT позволяет трансформировать XML из одного формата в другой. Например, преобразовать XML из в формат, требуемый ФНС. Пример XSLT-шаблона для простого преобразования:

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

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

<xsl:template match="/Каталог">

<Файл ВерсияСхемы="1.0">

<xsl:for-each select="Товар">

<Документ Ид="{@Ид}">

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

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

</Документ>

</xsl:for-each>

</Файл>

</xsl:template>

</xsl:stylesheet>

Применение XSLT в :

ПроцессорXSLT = Новый ПроцессорXSLT;

ПроцессорXSLT.ЗагрузитьШаблон(Новый ЧтениеXML(Новый СтроковыйПоток(XSLTШаблон)));

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

Сообщить(Результат);

⚠️ Внимание: При использовании XSLT учитывайте, что некоторые конструкции (например, xsl:for-each) могут значительно замедлить обработку больших XML-файлов. Для оптимизации используйте xsl:key или разбивайте обработку на части.

7. Практические примеры: от простого к сложному

7.1. Экспорт справочника контрагентов в XML

Задача: выгрузить справочник Контрагенты в XML-файл с структурой:

<Контрагенты>

<Контрагент Ид="1" ИНН="1234567890">

<Наименование>ООО Ромашка</Наименование>

<Адрес>г. Москва, ул. Ленина, 1</Адрес>

</Контрагент>

</Контрагенты>

Решение:

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

Запись.УстановитьФайл("C:\contragents.xml");

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

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

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

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

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

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

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

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

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

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

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

Запись.ЗаписатьТекст(Выборка.Адрес);

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

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

КонецЦикла;

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

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

7.2. Импорт курсов валют из XML ЦБ РФ

Задача: загрузить курсы валют из XML-файла Центробанка и обновить справочник Валюты.

XML от ЦБ РФ имеет структуру:

<ValCurs Date="01.01.2023" name="Foreign Currency Market">

<Valute ID="R01235">

<NumCode>840</NumCode>

<CharCode>USD</CharCode>

<Nominal>1</Nominal>

<Name>Доллар США</Name>

<Value>70,1234</Value>

</Valute>

</ValCurs>

Решение:

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

Чтение.ОткрытьФайл("C:\cbr.xml");

// Пропускаем объявление XML и корневой элемент

Чтение.Прочитать();

Чтение.Прочитать();

ДатаКурсов = Чтение.ЗначениеАтрибута("Date");

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

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

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

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

Если Чтение.ТипУзла() = ТипУзлаXML.КонецЭлемента Тогда

Прервать;

КонецЕсли;

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

КодВалюты = Чтение.Значение;

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

Курс = Заменить(Чтение.Значение, ",", ".");

КонецЕсли;

КонецЦикла;

Валюта = Справочники.Валюты.НайтиПоКоду(КодВалюты);

Если Валюта.Пустая() Тогда

Валюта = Справочники.Валюты.СоздатьЭлемент();

Валюта.Код = КодВалюты;

КонецЕсли;

Валюта.Наименование = СокрЛП(Чтение.ЗначениеАтрибута("Name"));

Валюта.Курс = Курс;

Валюта.ДатаКурса = ДатаКурсов;

Валюта.Записать();

КонецЕсли;

КонецЦикла;

💡

При работе с XML от внешних источников (например, ЦБ РФ или ФНС) всегда проверяйте актуальность структуры документа. Форматы могут меняться без предварительного уведомления, что приведет к ошибкам при парсинге.

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

Как исправить ошибку "Неверный формат XML" при чтении файла?

Ошибка "Неверный формат XML" обычно возникает из-за:

  • 🔸 Отсутствия объявления XML (<?xml version="1.0"?>).
  • 🔸 Неэкранированных специальных символов (&, <, >).
  • 🔸 Несовпадения кодировки (например, файл в utf-8, а пытается читать как windows-1251).

Решение:

  1. Откройте XML-файл в текстовом редакторе и проверьте его на валидность (например, через https://www.xmlvalidation.com/).
  2. Убедитесь, что кодировка в объявлении XML совпадает с реальной кодировкой файла.
  3. Используйте ЭкранироватьСтрокуXML() для текстовых полей.
Можно ли преобразовать JSON в XML в 1С без внешних библиотек?

Да, но это потребует ручной обработки. В нет встроенного механизма для прямого преобразования JSON → XML, но вы можете:

  1. С