Преобразование 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. 

См. также

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 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 22572 руб.

12.06.2017    134915    722    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 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 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68410    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

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

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34166    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

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

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

28000 25200 руб.

23.07.2020    46281    196    64    

157

Перенос данных из Парус 10 в ЗГУ ред.3

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

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9204    9    8    

10

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

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

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

28000 25200 руб.

15.12.2021    20232    132    38    

90

SALE! 10%

Перенос данных из БП 3.0 в УНФ 3.0 / УНФ 1.6. Переносятся остатки, документы и справочная информация

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

В продаже с 2018г. | Воспользовались более 41 предприятия! | Правила конвертации (КД 2) для переноса данных из БП 3 в УНФ | Переносятся все виды документов, начальные остатки и вся возможная справочная информация | Есть фильтр по организациям | Оперативно обновляем на новые релизы | Оказываем техподдержку | В комплект файлов входит инструкция, авторская версия обработки "Универсальный обмен...", актуальные правила переноса данных и архив старых версий переноса | Учет в БП 3 должен быть корректным, некорректные данные не переносятся | Можно бесплатно проверить на вашем сервере до покупки!

50722 45650 руб.

10.07.2018    67438    41    122    

46

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

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

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150700    367    375    

501
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. w.r. 643 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. 643 24.10.19 17:17 Сейчас в теме
(2) если сложный, тогда лучше нарисовать XSD схему и с помощью неё уже делать преобразование. Но мне лично хватает ФабрикиXDTO без схемы. Потом просто работаешь со структурой объекта по именам полей
18101986; cleaner_it; Andreeei; +3 Ответить
14. capitan 2466 25.10.19 10:56 Сейчас в теме
(1)Согласен. Решение красивое, но мудреное.
К тому же зачастую в xml бывает СписокXDTO, а бывает ОбъектXDTO в одном и том же месте.
Тогда такое преобразование может и не взлететь.
15. kraspila 90 25.10.19 11:17 Сейчас в теме
(14) в том и прелесть что удалось миновать XDTO и сразу отправить всё в таблицу, в вашем частном случае мы получим таблицу с одной строкой. Решение дает нам устойчивость в том случае, если поставщик XML изменил его структуру.
16. capitan 2466 25.10.19 11:19 Сейчас в теме
(15)Наверное да.
Плюса в любом случае заслуживает )
starik-2005; +1 Ответить
19. w.r. 643 25.10.19 19:31 Сейчас в теме
(15) сомнительная прелесть рисовать для каждого отдельного случая XLS схемы. Намного проще XDTO разобрать
18. w.r. 643 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. 643 24.10.19 18:55 Сейчас в теме
(7) причём если для создания XSD схемы в платформе есть инструмент, хоть и корявенький, в виде XDTO-пакета в конфигураторе, то для создания XSL схемы нет ничего
10. rabid_otter 134 24.10.19 20:47 Сейчас в теме
(9) да что уж там десериализацию из JSON в вебклиенте не смогли. ну такое...
11. PerlAmutor 129 25.10.19 06:50 Сейчас в теме
(10) Тоже был в шоке, когда уже после реализации обработки, увидел, что "СериализаторXDTO.ПрочитатьJSON" не доступен в Web-клиенте:

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

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


Технология пришедшая в 1С из Web, не работает в Web...
Aleskey_K; +1 Ответить
12. ktb 618 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 3033 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 19 28.10.19 11:12 Сейчас в теме
Делал аналогичную загрузку, но для упрощения сделал "сериализацию" в массив структур.
Удобно, что на выходе получается готовый 1Совский объект.
kraspila; +1 Ответить
22. kraspila 90 28.10.19 11:15 Сейчас в теме
(21) задача ставилась сверить два XML файла по ключевым полям. Для этого хорошо подходит таблица.
23. A_Max 19 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 1559 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) рад что удалось помочь
Оставьте свое сообщение