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

17.11.16

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
ЗагрузитьВДерево.epf
.epf 6,79Kb
87 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

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

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

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

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

См. также

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

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

38000 руб.

15.12.2021    33361    251    64    

190

Перенос данных 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    187334    355    287    

415

SALE! 10%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 24870 руб.

12.06.2017    159378    953    317    

479

НДС 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    8000    85    0    

80

Перенос данных 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    62284    80    130    

78

Перенос данных 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    201839    670    543    

561

Перенос данных 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    67119    312    94    

251
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4609 19.11.16 17:23 Сейчас в теме
Довольно просто для клиента. На сервере будет работать? Ведь строго говоря, вы читаете XML не в дерево значений, а в реквизит формы ДанныеФормыДерево
2. starik-2005 3234 19.11.16 23:07 Сейчас в теме
Это серверные процедуры. Просто в дерево тоже можно прочитать немного изменив код.
3. karpik666 4299 22.11.16 17:23 Сейчас в теме
(2) starik-2005, может они и серверные, но явно в коде используется данныеФормыДерево, а не дерево значений, поэтому ваш код будет работать только в контексте вызываемой формы, но не в общем модуле.
4. starik-2005 3234 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 3234 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 3234 28.11.16 22:16 Сейчас в теме
(11) как показал гугл, такая возможность есть. Видел в паре источников - сейчас не вспомню, в каких.
27. Sashares 33 02.10.24 12:00 Сейчас в теме
(12) ТекстИзЗначения = ОбъектXDTO.Последовательность().ПолучитьТекст(0);
starik-2005; +1 Ответить
20. kasper076 116 17.09.18 12:41 Сейчас в теме
(11) нужно создать правильный пакет XDTO. Например такой, как во вложении. В нем значение элемента имеет тип число, а атрибут строка.
Прикрепленные файлы:
Схема.xsd
7. cartograph 23.11.16 11:42 Сейчас в теме
8. starik-2005 3234 23.11.16 12:13 Сейчас в теме
(7) cartograph, ну там просто чтение, а тут в дерево раскладывает прочитанное рекурсивненько. Не чувствуете разницу?
9. infostart user 20 23.11.16 12:29 Сейчас в теме
рекурсия, вложенные циклы - есть куда оптимизировать. кажись уже такие штуки на инфостарте не раз публиковали
10. starik-2005 3234 23.11.16 13:05 Сейчас в теме
(9) infostart user, в данном конкретном случае оптимизировать, поверьте, особо некуда - вложенные циклы тут как раз уместны. А рекурсия - это вообще один из немногих способов организовать цикл в функциональном программировании, хотя, конечно, 1С тут в плане функциональности весьма ограничена.

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

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

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


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

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

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

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