Формат XML в 1С:Предприятие — это не просто способ хранения данных, а мощный инструмент для обмена информацией между системами, миграции конфигураций и интеграции с внешними сервисами. Однако работа с XML-текстами часто вызывает сложности: от синтаксических ошибок до проблем с кодировкой или несоответствием схемы. Эта статья поможет разобраться, как правильно формировать, читать и обрабатывать XML-документы в 1С, избегая типичных ошибок.
Особенность XML в 1С заключается в том, что платформа предоставляет встроенные механизмы для работы с этим форматом — от простого чтения через ЧтениеXML до сложных преобразований с использованием XDTO и XSLT. Но даже опытные разработчики сталкиваются с нюансами: например, как корректно экранировать специальные символы или почему при обмене с некоторыми системами (например, Диадок или Контур) XML должен строго соответствовать XSD-схеме, иначе данные не пройдут валидацию.
В этой статье мы рассмотрим:
- 📌 Базовую структуру XML-документов и их представление в 1С.
- 🔧 Практические примеры чтения, записи и преобразования XML.
- ⚠️ Типичные ошибки и способы их устранения (от неверной кодировки до несоответствия схем).
- 🔄 Интеграцию с внешними системами: что требуют контрагенты и как адаптировать XML под их стандарты.
1. Структура XML в 1С: от тегов к объектам платформы
XML-документ в 1С — это иерархическая структура, где каждый элемент (тег) может содержать атрибуты, дочерние элементы или текстовое значение. Платформа 1С:Предприятие представляет XML как объект типа ДокументDOM, ЧтениеXML или ЗаписьXML, в зависимости от задачи.
Основные компоненты XML в контексте 1С:
- 📜 Корневой элемент: обязательный узел, который содержит все остальные данные. Например,
<КаталогТоваров>. - 🏷️ Теги (элементы): могут быть вложенными (например,
<Товар><Наименование>Монитор</Наименование></Товар>). - 🔑 Атрибуты: параметры элементов, например,
Ид="12345". - 📝 Текстовое содержимое: данные внутри тега, например,
<Цена>15000</Цена>.
В 1С для работы с XML используются следующие объекты:
| Объект | Назначение | Пример использования |
|---|---|---|
ЧтениеXML |
Парсинг XML-строки или файла | |
ЗаписьXML |
Формирование XML-документа | |
ДокументDOM |
Работа с XML как с деревом объектов | |
XDTO |
Работа со схемами XSD и валидация | |
⚠️ Внимание: При работе сДокументDOMучитывайте, что он загружает весь XML в память. Для больших файлов (более 50 МБ) используйте потоковое чтение черезЧтениеXML, чтобы избежать ошибок нехватки памяти.
2. Чтение XML в 1С: от строки к данным
Чтение XML в 1С начинается с создания объекта Чтение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 в 1С осуществляется с помощью объекта Запись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 в 1С можно разделить на три категории: синтаксические (некорректный формат), логические (несоответствие структуры ожидаемой) и технические (проблемы с кодировкой или памятью). Рассмотрим наиболее распространенные из них.
4.1. Ошибка: "Недопустимый символ в значении XML"
Эта ошибка возникает, когда в текстовом содержимом или атрибуте встречаются неэкранированные символы &, <, >, " или '. Решение — использовать метод ЭкранироватьСтрокуXML():
НеэкранированнаяСтрока = "Цена < 1000";
ЭкранированнаяСтрока = ЭкранироватьСтрокуXML(НеэкранированнаяСтрока);
// Результат: "Цена < 1000"
4.2. Ошибка: "Неверная кодировка XML"
Если при чтении XML вы видите "кракозябры" вместо кириллицы, проблема в несовпадении кодировки файла и ожидаемой кодировки в 1С. Решение:
- 📋 Убедитесь, что в объявлении 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 для обмена данными между 1С и другими системами: бухгалтерскими сервисами (Контур.Эльба, МойСклад), банками (СберБизнес, Тинькофф), маркетплейсами (Озон, 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
Для сложных задач обмена данными в 1С предусмотрены механизмы XDTO (работа со схемами XSD) и XSLT (преобразование XML). Эти инструменты позволяют:
- 🛠️ Валидировать XML по схеме перед отправкой.
- 🔄 Преобразовывать XML из одного формата в другой (например, из структуры 1С в формат ФНС).
- 📊 Сериализовать/десериализовать объекты 1С в 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 из 1С в формат, требуемый ФНС. Пример 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 в 1С:
Процессор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, а 1С пытается читать какwindows-1251).
Решение:
- Откройте XML-файл в текстовом редакторе и проверьте его на валидность (например, через
https://www.xmlvalidation.com/). - Убедитесь, что кодировка в объявлении XML совпадает с реальной кодировкой файла.
- Используйте
ЭкранироватьСтрокуXML()для текстовых полей.
Можно ли преобразовать JSON в XML в 1С без внешних библиотек?
Да, но это потребует ручной обработки. В 1С нет встроенного механизма для прямого преобразования JSON → XML, но вы можете:
- С