Преобразование XML в таблицу значений или иной объект 1С методом XSL преобразования

24.10.19

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

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

Чтение и разбор формата 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. 

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    138319    764    292    

405

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.230.x) и БП 3.0 (3.0.156.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    21912    144    40    

104

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    70482    174    146    

117

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 Бухгалтерский учет Управленческий учет Платные (руб)

Переход и перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:ERP Управление предприятием 2.5 и 1С:Комплексную автоматизацию 2.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.227.x), ERP 2.5 (2.5.16.x), КА 2.5 (2.5.16.x) .

28000 руб.

24.06.2020    62449    51    27    

81

SALE! %

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 27000 руб.

24.04.2015    192605    143    241    

274

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

В продаже с 2015 года | Воспользовались более 287 предприятий! | Перенос данных из УПП 1.3 в БП 3.0 | из КА 1.1 в БП 3.0 | Переносятся документы, начальные остатки и вся справочная информация | Сэкономьте свое время - используйте готовое решение для перехода! | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

39500 руб.

25.02.2015    169822    294    253    

374

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

14580 руб.

18.02.2016    184666    573    509    

516

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3.87.x и УТ 11.5.16.x

28000 руб.

23.07.2020    48536    208    64    

170
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. w.r. 650 24.10.19 17:10 Сейчас в теме
На самом деле можно через

ФабрикаXDTO.ПрочитатьXML(ЧтениеXML)


если у тебя структура XML представляет собой таблицу с более чем с 1 строкой, то вернётся тебе объект СписокXDTO, по которому можно пройтись циклом Для каждого. И это без всякой схемы XLS
Xershi; Merkalov; Sergafan10; 18101986; tormozit; cleaner_it; PLAstic; Andreeei; +8 Ответить
2. kraspila 90 24.10.19 17:13 Сейчас в теме
(1) если объект несложный и статичный, то такой метод тоже применим.
3. w.r. 650 24.10.19 17:17 Сейчас в теме
(2) если сложный, тогда лучше нарисовать XSD схему и с помощью неё уже делать преобразование. Но мне лично хватает ФабрикиXDTO без схемы. Потом просто работаешь со структурой объекта по именам полей
18101986; cleaner_it; Andreeei; +3 Ответить
14. capitan 2547 25.10.19 10:56 Сейчас в теме
(1)Согласен. Решение красивое, но мудреное.
К тому же зачастую в xml бывает СписокXDTO, а бывает ОбъектXDTO в одном и том же месте.
Тогда такое преобразование может и не взлететь.
15. kraspila 90 25.10.19 11:17 Сейчас в теме
(14) в том и прелесть что удалось миновать XDTO и сразу отправить всё в таблицу, в вашем частном случае мы получим таблицу с одной строкой. Решение дает нам устойчивость в том случае, если поставщик XML изменил его структуру.
16. capitan 2547 25.10.19 11:19 Сейчас в теме
(15)Наверное да.
Плюса в любом случае заслуживает )
starik-2005; +1 Ответить
19. w.r. 650 25.10.19 19:31 Сейчас в теме
(15) сомнительная прелесть рисовать для каждого отдельного случая XLS схемы. Намного проще XDTO разобрать
18. w.r. 650 25.10.19 19:29 Сейчас в теме
(14) ОбъектXDTO когда количество строк <= 1, во всех остальных случаях будет СписокXDTO
4. rabid_otter 134 24.10.19 17:28 Сейчас в теме
5. kraspila 90 24.10.19 17:29 Сейчас в теме
(4) по скорости очень эффективно, но на больших файлах не тестировалось
6. rabid_otter 134 24.10.19 17:31 Сейчас в теме
(5) да, видел такое преобразование в типовых. прикольно, сделали бы разрабы платформы 1С такое же, но платформенное, и чтобы на веб-клиентах и тонких клиентах всяких работало, не было бы им цены.
7. kraspila 90 24.10.19 17:32 Сейчас в теме
(6) это средствами платформы и делается, просто макет xsl надо написать
8. rabid_otter 134 24.10.19 17:40 Сейчас в теме
(7) да, согласен, просто это муторно.
PLAstic; w.r.; +2 Ответить
9. w.r. 650 24.10.19 18:55 Сейчас в теме
(7) причём если для создания XSD схемы в платформе есть инструмент, хоть и корявенький, в виде XDTO-пакета в конфигураторе, то для создания XSL схемы нет ничего
10. rabid_otter 134 24.10.19 20:47 Сейчас в теме
(9) да что уж там десериализацию из JSON в вебклиенте не смогли. ну такое...
11. PerlAmutor 130 25.10.19 06:50 Сейчас в теме
(10) Тоже был в шоке, когда уже после реализации обработки, увидел, что "СериализаторXDTO.ПрочитатьJSON" не доступен в Web-клиенте:

Доступность: 

Тонкий клиент, сервер, толстый клиент, внешнее соединение. 


Технология пришедшая в 1С из Web, не работает в Web...
Aleskey_K; +1 Ответить
12. ktb 622 25.10.19 07:08 Сейчас в теме
(10)(11) Не могу себе представить сценарий, в котором нужно читать json на клиенте.
13. rabid_otter 134 25.10.19 10:17 Сейчас в теме
(12) самое простое, делаю в поле HTML документа делаешь JSON.stringify, в 1с забираешь в событии при нажатии на поле HTML. мне кажется для расшифровки результата не надо постоянно лезть на сервер, это же интерфейс ёпт.
30. ntemny 62 01.10.20 14:50 Сейчас в теме
(5)Прямой разбор из чтенияxml быстрее чем преобразование процентов на 30, я проверял. Аналогичные задачи стояли. А если это все внутри базы 1С туда сюда гуляет, то все по скорости уделывает прямая работа с ТЗ. Преобразование очень медленное и поддерживает стандарт 1.1 только.
17. starik-2005 3062 25.10.19 12:33 Сейчас в теме
Статья плохая, но разбирается очень хорошая вещь. Я бы автору порекомендовал бы рассмотреть преобразование XSLT более развернуто, хотя многим действительно нужен кейс, даже такой примитивный.
Yashazz; cleaner_it; A_Max; PLAstic; +4 Ответить
20. PLAstic 295 28.10.19 08:40 Сейчас в теме
Как написали в аналогичной теме 6 лет назад,
Технология XSLT в вэбе, где и предполагалось основное применение, "не взлетела". Поддержка XSLT в браузерах появилась в IE6, и с тех пор не обновлялась лет десять. Год назад один из последних "могикан" - mail.ru отказалась от использования XSLT в своем почтовом сервисе.
Желающих развивать эту технологию уже давно не наблюдается.

Слабо представляю, какие уникальные выгоды от использования XSLT можно получить. Защита от изменения формата поставщиком? Так ведь для этого и нужны XSD-схемы. Пришедший пакет не читается? Пришло время лезть в текст и смотреть, что изменилось. Меняем схему XSD и логику анализа - и всё, работаем дальше.
ixijixi; cleaner_it; +2 Ответить
21. A_Max 20 28.10.19 11:12 Сейчас в теме
Делал аналогичную загрузку, но для упрощения сделал "сериализацию" в массив структур.
Удобно, что на выходе получается готовый 1Совский объект.
kraspila; +1 Ответить
22. kraspila 90 28.10.19 11:15 Сейчас в теме
(21) задача ставилась сверить два XML файла по ключевым полям. Для этого хорошо подходит таблица.
23. A_Max 20 28.10.19 11:20 Сейчас в теме
(22) Я понимаю. Понятно, что зависит от задачи. Ну и по скорости очень порадовало.

Вообще проводил анализ сериализованных представлений разных объектов и смотрел, что лучше подходит. Кстати очень полезно оказалось глянуть на табличный документ, для себя добавил функционал по сворачиванию/разворачиванию нужных групп.
kraspila; +1 Ответить
24. kraspila 90 28.10.19 11:23 Сейчас в теме
(23) натолкнули меня на мысль, действительно, можно файлы просто привести к единому виду и сравнить, минуя любое преобразование. Это что касается моего прикладного случая
26. fomix 33 11.11.19 17:48 Сейчас в теме
(22) XML файл - текст. 1С в режиме Предприятия либо Конфигуратора - "Сравнить файлы...". Либо простенькая обработка сравнения текстов - вот и все решение!
27. kraspila 90 12.11.19 10:36 Сейчас в теме
(26)
Прикрепленные файлы:
25. Olenevod 33 28.10.19 21:30 Сейчас в теме
Статьи уже были на эту тему, поэтому как бы совсем ничего нового, однако немного с другой стороны (возможно это тоже необходимо, чтобы это стало более понятным и как-то шло в массы).
Но вот полезней было бы если некий конструктор простой был бы реализован, который позволяет создавать шаблоны XSLT.
28. serg__k 79 28.04.20 18:47 Сейчас в теме
Спасибо, очень пригодилось, скорость впечатлила
29. unichkin 1572 01.09.20 09:00 Сейчас в теме
Спасибо за статью! Нарвался на подводный камень, может кому пригодится, оставлю здесь.
Если в схеме указан namespace, то в xsl следует префиксовать выборки (без этого не взлетит, я вчера долго думал, почему не пашет). Пример из статьи описал ниже. И еще: в статье используется таблица с типизацией строк, а не колонок. Если задавать тип в колонке, то при отсутствующем значении будет пустое значение этого типа, а не "Неопределено" (см. на XML ниже - убрал "ЦВЕТЫ СПАТИФИЛЛУМ" из первого lineItem, без типизации колонок в выходной таблице будет неопределено, а с XSL из этого же сообщения - пустая строка).

XML c NAMESPACE


XSL


Текст XML выгруженной таблицы значений с строками простых типов
strafer; kraspila; ivangrant; mity1982; +4 Ответить
33. strafer 28.10.21 16:05 Сейчас в теме
(29)
DateQualifiers

Спасибо вам огромное за описание, мне очень помогло в случае если есть namespace. На всякий случай сюда допишу такой пример.
Исходный файл (урезал), это обмен с SalesWorks.


Схема преобразования


Это на случай когда кому-то надо получать значения аттрибутов.
31. ivangrant 10 09.02.21 08:37 Сейчас в теме
Спасибо. Очень помогла ваша статья.
32. kraspila 90 09.02.21 08:48 Сейчас в теме
(31) рад что удалось помочь
Оставьте свое сообщение