Обработка, демонстрирующая работу процедур и функций по преобразованию XML файла в дерево значений, а также в переменную типа структура.
Возникала необходимость чтения обработки XML файлов неизвестной структуры, вот написал процедуры, которые преобразуют XML файл любой в дерево значений, а также считывают и преобразуют данные в переменную типа структура причем типы переменных преобразуются в соответствии с требованиями, Дата, Булево, Число, Строка
Процедура ПрочитатьУзелВСтруктуру(Об, СтруктураДерево)
Если ТипЗнч(Об) = Тип("СписокXDTO") Тогда
Для Каждого Ст ИЗ Об Цикл
Если ТипЗнч(Ст) = Тип("СписокXDTO") ИЛИ ТипЗнч(Ст) = Тип("ОбъектXDTO") Тогда
Если НЕ СтруктураДерево.Свойство(Об.ВладеющееСвойство.Имя) ТОгда
СтруктураДерево.Вставить(Об.ВладеющееСвойство.Имя,Новый Массив);
КонецЕсли;
_РезультатВетки = Новый Структура;
ПрочитатьУзелВСтруктуру(Ст, _РезультатВетки);
СтруктураДерево[Об.ВладеющееСвойство.Имя].Добавить(_РезультатВетки);
Иначе
СтруктураДерево.Вставить(Об.ВладеющееСвойство.Имя,Неопределено);
СтруктураДерево[Об.ВладеющееСвойство.Имя] = _ПолучитьВТипеДанногоЭлемента(Ст);
КонецЕсли;
КонецЦикла;
Иначе
Для Каждого Ст ИЗ Об.Свойства() Цикл
Если ТипЗнч(Об[Ст.Имя]) = Тип("СписокXDTO") Тогда
Если НЕ СтруктураДерево.Свойство(ст.Имя) ТОгда
СтруктураДерево.Вставить(Ст.Имя,Новый Массив);
КонецЕсли;
_РезультатВетки = Новый Структура;
ПрочитатьУзелВСтруктуру(Об[Ст.Имя], _РезультатВетки);
СтруктураДерево[Ст.Имя].Добавить(_РезультатВетки);
ИначеЕсли ТипЗнч(Об[Ст.Имя]) = Тип("ОбъектXDTO") Тогда
Если НЕ СтруктураДерево.Свойство(ст.Имя) ТОгда
СтруктураДерево.Вставить(Ст.Имя,Новый Структура);
КонецЕсли;
ПрочитатьУзелВСтруктуру(Об[Ст.Имя], СтруктураДерево[Ст.Имя]);
Иначе
СтруктураДерево.Вставить(Ст.Имя,Неопределено);
СтруктураДерево[Ст.Имя] = _ПолучитьВТипеДанногоЭлемента(Об[Ст.Имя]);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Возможно, что кому нибудь эти данные будут интересны
Тестировалась на платформе 1С:Предприятие 8.3 (8.3.15).
Конфигурация 1С не имеет значения.
В типовых, xml2деревоЗначений:
Дерево значений это хорошо, но у меня основная цель стояла создать переменную структуры а не дерево значений, а так спасибо!
(2) создание структуры тоже есть. плохо искали
модуль ИнтеграцияВЕТИС, 1С:ERP Управление предприятием 2 (2.4.9.82)
// Преобразует объект XDTO в структуру
//
// Параметры:
// ОбъектXDTO — ОбъектXDTO — Объект XDTO.
//
// Возвращаемое значение:
// Структура — Структура объекта.
//
Функция ОбъектXDTOВСтруктуру(ОбъектXDTO, ПараметрыПреобразования = Неопределено) Экспорт
Структура = Новый Структура;
ТипОбъектаXDTO = ОбъектXDTO.Тип();
Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл
ИмяСвойства = Свойство.Имя;
ЗначениеСвойства = ОбъектXDTO[ИмяСвойства];
Если ТипЗнч(ЗначениеСвойства) = Тип(«ОбъектXDTO») Тогда
Структура.Вставить(ИмяСвойства, ОбъектXDTOВСтруктуру(ЗначениеСвойства, ПараметрыПреобразования));
ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип(«СписокXDTO») Тогда
Структура.Вставить(ИмяСвойства, Новый Массив);
Для Индекс = 0 По ЗначениеСвойства.Количество() — 1 Цикл
ЭлементСписка = ЗначениеСвойства.Получить(Индекс);
Если ТипЗнч(ЭлементСписка) = Тип(«ОбъектXDTO») Тогда
Структура[ИмяСвойства].Добавить(ОбъектXDTOВСтруктуру(ЭлементСписка, ПараметрыПреобразования));
Иначе
Структура[ИмяСвойства].Добавить(ЭлементСписка);
КонецЕсли;
КонецЦикла;
Иначе
Структура.Вставить(ИмяСвойства, ЗначениеСвойства);
Если ПараметрыПреобразования <> Неопределено
И ПараметрыПреобразования.НайтиИдентификаторы
И Свойство.Тип = ПараметрыПреобразования.ТипUUID Тогда
РезультатПоиска = ПараметрыПреобразования.ТипыИдентификаторов[ТипОбъектаXDTO];
Если РезультатПоиска <> Неопределено
И РезультатПоиска.ИмяПоля = ИмяСвойства Тогда
ПараметрыПреобразования.Идентификаторы[РезультатПоиска.ИмяТаблицы].Вставить(ЗначениеСвойства, РезультатПоиска.ПустоеЗначение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Структура;
КонецФункции
Спасибо, бывает))))
Где-то я это уже видел (даже имена переменных аналогичные) ))))
Увы не брал оттуда, тем более у меня перевод в структуру , и вывод в макет не дерева а структуру в группировке
(6) да всё это баяны чудовищные, самоочевидность же и элементарно всё
Я такое ещё в 2007 году делал)
А вот интересно, озаботился ли кто-нибудь xslt-преобразованием между хмл и джейсоном, туда и обратно? Тогда можно будет сериализацию и преобразование гонять более просто)
(2) Если интересно преобразую из произвольного шаблона в виде дерева значения в xml.
https://infostart.ru/public/964582/
(9)
Ну вряд ли через XDTO, а в дерево на паскале я такое еще в 1997 делал )))
(11)
Если склероз не изменяет, то на XDTO делал тоже. А насчёт паскаля — ну да, 1995 год, Турбо-Паскаль 5.0, золотая юность)
(12)
Это ж уровень 7.7 в 2019-м (ну может быть 8.0) — никакого ООП. Борланд Паскаль 7.0 вышел, если мне не изменяет память, в 92-м. На нем уже по RTM PM 286 можно было писать, была доступна вся память, но адресов переменных можно было выделить только 2#k8SjZc9Dxk16.
Вы еще Basic вспомните я на нем в начале 90х прогу писал для склада ИСКРА 1030м была 086
(13)
Вы еще Basic вспомните я на нем в начале 90х прогу писал для склада ИСКРА 1030м была 086
(13) Первая ООП появилась в 5.5, а нормальная да, в 7.0, но уж не будем оффтопить)
Вероятно вы должны были написать еще текст функции _ПолучитьВТипеДанногоЭлемента
Показать
(17) Эта из обработки и есть, как бы вопрос преобразования типов понятен был, я старался именно структуру показать. А то что Вы вырезали процедуру и вставили сюда, ну спасибо ))))