Загрузка XML в дерево значений

17.11.16

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

Случайно наткнулся на статью с алгоритмом загрузки XML-строки в дерево значений и подумал, а не проще ли сделать это через механизм XDTO рекурсивно. На мой взгляд, решение получилось неплохое - даже атрибуты грузит..

Скачать файлы

Наименование Файл Версия Размер
ЗагрузитьВДерево.epf
.epf 6,79Kb
77
.epf 6,79Kb 77 Скачать

Добрый всем день, ночь и прочие времена суток, когда 1С-ники читают данный сайт.

Иногда (может даже часто) нужно загрузить XML в дерево значений. Вот как можно это сделать через механизм XDTO:

Процедура ПоместитьВДерево(Текст)
	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(Текст);
	Об = ФабрикаXDTO.ПрочитатьXML(Чтение);
	
	Строка = Дерево.ПолучитьЭлементы().Добавить();
	Строка.Узел = "Корневой узел";
	ПрочитатьУзел(Об, Строка);
КонецПроцедуры

Процедура ПрочитатьУзел(Об, лДерево)
	Если ТипЗнч(Об) = Тип("СписокXDTO") Тогда 
		Для Каждого Ст ИЗ Об Цикл
			Строка = лДерево.ПолучитьЭлементы().Добавить();
			Строка.Узел = Об.ВладеющееСвойство;
			Если ТипЗнч(Ст) = Тип("СписокXDTO") ИЛИ ТипЗнч(Ст) = Тип("ОбъектXDTO") Тогда
				ПрочитатьУзел(Ст, Строка);
			Иначе
				Строка.Элемент = Ст;
			КонецЕсли;
		КонецЦикла;
	Иначе
		Для Каждого Ст ИЗ Об.Свойства() Цикл
			Строка = лДерево.ПолучитьЭлементы().Добавить();
			Строка.Узел = Ст.Имя;
			Если ТипЗнч(Об[Ст.Имя]) = Тип("СписокXDTO") ИЛИ ТипЗнч(Об[Ст.Имя]) = Тип("ОбъектXDTO") Тогда
				ПрочитатьУзел(Об[Ст.Имя], Строка);
			Иначе
				Строка.Элемент = Об[Ст.Имя];
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

В данном случае у нас на управляемой форме есть дерево с двумя строковыми колонками "Узел" и "Значение". В процедуру "ПоместитьВДерево" нужно передать текст прочитанного XML-файла, после чего оный загрузится в дерево значений.

XDTO дерево значений загрузка

См. также

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    134930    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    68414    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    34168    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    46288    196    64    

158

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

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

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

60000 руб.

05.10.2022    9207    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    20244    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    67442    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    150710    367    375    

501
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4670 19.11.16 17:23 Сейчас в теме
Довольно просто для клиента. На сервере будет работать? Ведь строго говоря, вы читаете XML не в дерево значений, а в реквизит формы ДанныеФормыДерево
2. starik-2005 3033 19.11.16 23:07 Сейчас в теме
Это серверные процедуры. Просто в дерево тоже можно прочитать немного изменив код.
3. karpik666 3760 22.11.16 17:23 Сейчас в теме
(2) starik-2005, может они и серверные, но явно в коде используется данныеФормыДерево, а не дерево значений, поэтому ваш код будет работать только в контексте вызываемой формы, но не в общем модуле.
4. starik-2005 3033 22.11.16 20:07 Сейчас в теме
(3) karpik666, ну это чтобы у читателей была возможность подумать. Я за светлое коммунистическое будущее мыслителей и творцов, а не за общество потребительского кредитования...
adhocprog; +1 Ответить
5. genayo 23.11.16 08:19 Сейчас в теме
Вот такой XML, не загружаются значения, только атрибуты:

<Table:Record name="CustPickingExportDC" row="1">
<Table:Field name="SalesId">ФН000000053</Table:Field>
<Table:Field name="PickingListId">ФН000000053</Table:Field>
<Table:Field name="CustAccount">000000661</Table:Field>
<Table:Field name="ConsigneeAccount">000000755</Table:Field>
<Table:Field name="InventLocationId"/>
<Table:Field name="DeliveryDate">2016-11-23</Table:Field>
<Table:Field name="ManDate"/>
<Table:Field name="ItemId">ББ00065B125</Table:Field>
<Table:Field name="InventQty">3</Table:Field>
<Table:Field name="SalesUnit">кг</Table:Field>
<Table:Field name="SalesQty">18</Table:Field>
</Table:Record>
6. starik-2005 3033 23.11.16 11:14 Сейчас в теме
(5) genayo, да, при наличии "Namespace prefix" файл не грузится. Но если его убрать, то все работает:

Также заметил, что при наличии атрибутов у элемента и значение элемента - строка, а не вложенный контейнер, то я не нашел, как получить текст самого элемента у XDTO.
Прикрепленные файлы:
11. genayo 23.11.16 13:37 Сейчас в теме
(6) Вот и я не нашел как чисто через фабрику XDTO такой XML прочитать, пришлось использовать комбинацию XDTO и DOM, что на больших файлах несколько печально. Может, есть идеи как проще такой XML прочитать?
12. starik-2005 3033 28.11.16 22:16 Сейчас в теме
(11) как показал гугл, такая возможность есть. Видел в паре источников - сейчас не вспомню, в каких.
20. kasper076 101 17.09.18 12:41 Сейчас в теме
(11) нужно создать правильный пакет XDTO. Например такой, как во вложении. В нем значение элемента имеет тип число, а атрибут строка.
Прикрепленные файлы:
Схема.xsd
7. cartograph 23.11.16 11:42 Сейчас в теме
8. starik-2005 3033 23.11.16 12:13 Сейчас в теме
(7) cartograph, ну там просто чтение, а тут в дерево раскладывает прочитанное рекурсивненько. Не чувствуете разницу?
9. infostart user 20 23.11.16 12:29 Сейчас в теме
рекурсия, вложенные циклы - есть куда оптимизировать. кажись уже такие штуки на инфостарте не раз публиковали
10. starik-2005 3033 23.11.16 13:05 Сейчас в теме
(9) infostart user, в данном конкретном случае оптимизировать, поверьте, особо некуда - вложенные циклы тут как раз уместны. А рекурсия - это вообще один из немногих способов организовать цикл в функциональном программировании, хотя, конечно, 1С тут в плане функциональности весьма ограничена.

Но если Вы предложите вариант оптимизации - велкам! ))
13. boln 1040 24.06.17 18:07 Сейчас в теме
Случайно наткнулся на статью с алгоритмом загрузки XML-строки в дерево значений
Не на эту, случайно?
http://infostart.ru/public/14610/
14. starik-2005 3033 24.06.17 21:29 Сейчас в теме
(13)
Не на эту, случайно?
Неа.
15. starik-2005 3033 21.05.18 11:32 Сейчас в теме
Господа, внезапно узнал, как получить текст элемента при наличии атрибутов из объекта XDTO. Если интересно - могу написать еще одну статью на эту тему.
16. МихаилМ 22.05.18 10:23 Сейчас в теме
(15) также интересно через xslt
17. rozer 306 14.09.18 17:11 Сейчас в теме
можно проще просто последовательно читать

код в форме


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
	Длг = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Длг.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", ЭтаФорма, "Открыть"));
КонецПроцедуры

&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДопПараметры) Экспорт
	Если НЕ Результат = Неопределено Тогда 
		ЧтениеXMLВДерево(Результат[0])
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ЧтениеXMLВДерево(Путь)
	XMLФайл = Новый ЧтениеXML;
	XMLФайл.ОткрытьФайл(Путь);
	ОбъектОбработка = РеквизитФормыВЗначение("Объект");
	ОбъектОбработка.ПрочитатьXMLПоТегам(XMLФайл, ОбъектОбработка.Дерево.Строки);
	ЗначениеВРеквизитФормы(ОбъектОбработка, "Объект");
	XMLФайл.Закрыть();
КонецФункции

Показать


код в модуле

Процедура ПрочитатьXMLПоТегам(XMLФайл, ТекущийНаборСтрок) Экспорт
    Пока XMLФайл.Прочитать() Цикл
		Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
            НоваяСтрока.Имя = XMLФайл.Имя;
            НоваяСтрока.Значение = "";
			Пока XMLФайл.ПрочитатьАтрибут() Цикл
				НоваяСтрокаАтрибут = НоваяСтрока.Строки.Добавить();
	            НоваяСтрокаАтрибут.Имя = XMLФайл.Имя;
	            НоваяСтрокаАтрибут.Значение = СокрЛП(XMLФайл.Значение);
			КонецЦикла;
			ПрочитатьXMLПоТегам(XMLФайл, НоваяСтрока.Строки);

		ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
			
            Возврат;
			
		ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
			
            ТекущийНаборСтрок.Родитель.Значение = СокрЛП(XMLФайл.Значение);
			
        Иначе
			
            Сообщить("Тип узла: " + XMLФайл.ТипУзла + " НЕ ОБРАБОТАН", СтатусСообщения.Важное);
			
        Конецесли;
    КонецЦикла;
КонецПроцедуры
Показать


и еще ваш код при более чем одном узле зачем-то лепит лишнюю строку
результат разбора
файл
18. starik-2005 3033 14.09.18 17:23 Сейчас в теме
(17)
можно проще просто последовательно читать
На Инфостарте масса обработок, которые делают подобное.

По поводу текущей обработки, то она рекурсивно преобразует в дерево именно прочитанный XDTO-объект.

По поводу списка, то, полагаю, нужно посмотреть, как прочитался сам файл в объект XDTO.. У меня в коде при наличии списка XDTO в свойстве это свойство сначала создается. Решить можно просто - проверять, что в свойстве список и не создавать для него отдельную ветку дерева, а разворачивать в текущую.
19. rozer 306 14.09.18 18:45 Сейчас в теме
(18)
Решить можно просто - проверять, что в свойстве список и не создавать для него отдельную ветку дерева, а разворачивать в текущую.


это понятно ) просто думал бага а это фича )
21. RocKeR_13 1317 26.09.18 16:57 Сейчас в теме
В данном случае у нас на управляемой форме есть дерево с двумя строковыми колонками "Узел" и "Значение".

Ну судя по коду и скрину должно быть
"Узел" и "Элемент"

Больше придирка, а по делу - спасибо)
22. starik-2005 3033 26.09.18 17:03 Сейчас в теме
(21)
Ну судя по коду и скрину должно быть
Истину глаголишь )))
23. gnom13 27.09.18 16:21 Сейчас в теме
Почему то тут не принимают во внимание что если у вас серверная база данных то это работать не будет.
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДопПараметры) Экспорт
    Если НЕ Результат = Неопределено Тогда 
        ЧтениеXMLВДерево(Результат[0])
    КонецЕсли;
КонецПроцедуры

В этой процедуре Результат[0] передаётся с клиентской машины. На сервере этого пути не будет Выдаст ошибку.
24. starik-2005 3033 28.09.18 10:40 Сейчас в теме
(23)
В этой процедуре Результат[0] передаётся с клиентской машины. На сервере этого пути не будет Выдаст ошибку.
На сервере нет, но данная процедура, если мне не изменяет память, клиентская, которая читает текст и передает его в:
Процедура ПоместитьВДерево(Текст)
	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(Текст);
	Об = ФабрикаXDTO.ПрочитатьXML(Чтение);
	
	Строка = Дерево.ПолучитьЭлементы().Добавить();
	Строка.Узел = "Корневой узел";
	ПрочитатьУзел(Об, Строка);
КонецПроцедуры
Показать
25. TariK 21.08.20 10:16 Сейчас в теме
Добрый день! Как испраивить ошибку?
Прикрепленные файлы:
26. starik-2005 3033 08.10.20 14:11 Сейчас в теме
(25) все зависит от условий, в которых она возникла.
Оставьте свое сообщение