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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

НДС 22% Учетные задачи ККМ Файловый обмен (TXT, XML, DBF), FTP 1С 8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Бухгалтерский учет Налоговый учет НДС Платные (руб)

Готовое обновление для конфигурации 1С:Управление торговлей 10.3, 1С:Комплексная автоматизация 1.1 , 1С:Управление производственным предприятием 1.3 обеспечивающее полную поддержку новой ставки НДС 22%. Для 1С:УТ 10.3 реализована поддержка печати чеков ККМ, а также Правила обмена с 1С:БП 3.0. Решение встраивает необходимые изменения в перечисления и документы, включая торговые операции и печатные формы.

12200 руб.

16.12.2025    6958    81    0    

75

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

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

50050 руб.

25.02.2015    180699    350    283    

410

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

22650 руб.

12.06.2017    157457    942    306    

475

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

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

38000 руб.

15.12.2021    32289    239    61    

179

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    61006    77    128    

74

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

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

38000 руб.

23.07.2020    65581    305    83    

244

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

Перенос данных из ЗУП 3 в ЗУП 3 | из ЗУП 3 в КА 2 | из ЗУП 3 в ERP | Оперативно обновляется при выходе новых релизов 1С | Готовые правила конвертации (КД 2) для перехода с "ЗУП 3" на "УП ред. 3" / "КА, ред. 2" / "ERP, ред. 2" |Переносится нормативно-справочная информация и документы с движениями

55200 руб.

11.01.2021    37036    33    56    

35

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

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

16531 руб.

18.02.2016    198643    660    543    

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

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


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

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

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


Технология пришедшая в 1С из Web, не работает в Web...
mefalcon; Aleskey_K; +2 Ответить
12. ktb 692 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 63 01.10.20 14:50 Сейчас в теме
(5)Прямой разбор из чтенияxml быстрее чем преобразование процентов на 30, я проверял. Аналогичные задачи стояли. А если это все внутри базы 1С туда сюда гуляет, то все по скорости уделывает прямая работа с ТЗ. Преобразование очень медленное и поддерживает стандарт 1.1 только.
17. starik-2005 3211 25.10.19 12:33 Сейчас в теме
Статья плохая, но разбирается очень хорошая вещь. Я бы автору порекомендовал бы рассмотреть преобразование XSLT более развернуто, хотя многим действительно нужен кейс, даже такой примитивный.
Yashazz; cleaner_it; A_Max; PLAstic; +4 Ответить
20. PLAstic 296 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 133 28.10.19 11:15 Сейчас в теме
(21) задача ставилась сверить два XML файла по ключевым полям. Для этого хорошо подходит таблица.
23. A_Max 20 28.10.19 11:20 Сейчас в теме
(22) Я понимаю. Понятно, что зависит от задачи. Ну и по скорости очень порадовало.

Вообще проводил анализ сериализованных представлений разных объектов и смотрел, что лучше подходит. Кстати очень полезно оказалось глянуть на табличный документ, для себя добавил функционал по сворачиванию/разворачиванию нужных групп.
kraspila; +1 Ответить
24. kraspila 133 28.10.19 11:23 Сейчас в теме
(23) натолкнули меня на мысль, действительно, можно файлы просто привести к единому виду и сравнить, минуя любое преобразование. Это что касается моего прикладного случая
26. fomix 33 11.11.19 17:48 Сейчас в теме
(22) XML файл - текст. 1С в режиме Предприятия либо Конфигуратора - "Сравнить файлы...". Либо простенькая обработка сравнения текстов - вот и все решение!
27. kraspila 133 12.11.19 10:36 Сейчас в теме
(26)
Прикрепленные файлы:
25. Olenevod 36 28.10.19 21:30 Сейчас в теме
Статьи уже были на эту тему, поэтому как бы совсем ничего нового, однако немного с другой стороны (возможно это тоже необходимо, чтобы это стало более понятным и как-то шло в массы).
Но вот полезней было бы если некий конструктор простой был бы реализован, который позволяет создавать шаблоны XSLT.
28. serg__k 79 28.04.20 18:47 Сейчас в теме
Спасибо, очень пригодилось, скорость впечатлила
29. unichkin 1622 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 11 09.02.21 08:37 Сейчас в теме
Спасибо. Очень помогла ваша статья.
32. kraspila 133 09.02.21 08:48 Сейчас в теме
(31) рад что удалось помочь
Для отправки сообщения требуется регистрация/авторизация