Чтение и разбор формата XML при разработке в 1С довольно часто встречающаяся задача. Механизмы платформы дают для этого несколько вариантов реализации. Например, чтение DOM модели документа и последовательный разбор его в коде. Я же буду рассматривать более универсальный метод, основанный на приведении входящего файла к стандарту, пригодного для сериализации в объект 1С средствами платформы.
Ключевым элементом этого процесса является схема преобразования XSL. По стандарту языка XSL написано много статей, я рекомендую перед дальнейшим прочтением ознакомиться с некоторыми из них, а так же изучить спецификацию формата XPath .
Итак, имеем некий XML, который мы хотим прочитать в таблицу, или иной объект 1С.
<?xml version="1.0" encoding="UTF-8"?>
<eDIMessage id="e6418b61-b40e-4e3f-b0c5-4f2596еd93f6" creationDateTime="2016-10-15T14:38:39Z">
<correctiveInvoice number="10-0000057" date="2016-10-01" type="Original">
<lineItems>
<lineItem>
<gtin>4670005047988</gtin>
<description>ЦВЕТЫ СПАТИФИЛЛУМ</description>
</lineItem>
<lineItem>
<gtin>4607015058314</gtin>
<description>ЦВЕТЫ ФИАЛКА МИКС</description>
</lineItem>
</lineItems>
</correctiveInvoice>
</eDIMessage>
В данном файле нас интересует табличная часть, заключенная в тэги <LineItem>. Для доступа к этой части будем использовать выражение xPath:
eDIMessage/correctiveInvoice/lineItems/lineItem
Это выражение будет являться основой схемы XLS
"<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<ValueTable xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<column>
<Name xsi:type="xs:string">Колонка1</Name>
<ValueType/>
</column>
<column>
<Name xsi:type="xs:string">Колонка2</Name>
<ValueType/>
</column>
<xsl:for-each select="eDIMessage/correctiveInvoice/lineItems/lineItem">
<row>
<Value xsi:type="xs:string">
<xsl:value-of select="gtin"/>
</Value>
<Value xsi:type="xs:string">
<xsl:value-of select="description"/>
</Value>
</row>
</xsl:for-each>
</ValueTable>
</xsl:template>
</xsl:stylesheet>"
Структура этой схемы скопирована с файла выгрузки 1С, содержащим сериализованую табличную часть, однако в нее добавлена инструкция процессору XML for-each, запускающая цикл перебора строк табличной части исходного файла, по указанному пути и инструкции value-of, которые выводят в цикл содержимое указанных тегов, в данном случае gtin и description.
Ниже приводится функция 1С, к которую в качестве параметров передается исходный документ XML и схема преобразования в виде строки.
Функция ПреобразоватьXMLвТЗ(СтрокаXML, СхемаПреобразования);
ПроцессорПреобразования = Новый ПреобразованиеXSL;
ПроцессорПреобразования.ЗагрузитьИзСтроки(СхемаПреобразования);
РезультатПреобразованияXML = ПроцессорПреобразования.ПреобразоватьИзСтроки(СтрокаXML);
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(РезультатПреобразованияXML);
ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Возврат ТЗ;
КонецФункции
функция возвращает таблицу значений, с колонками "Колонка1" и "Колонка2", в строках содержащие значения тегов gtin и description.