gifts2017

Быстрое преобразование XML в Таблицу значений

Опубликовал diver.sun diver.sun (diver.sun) в раздел Обмен - Обмен через XML

Разработчики которые начинают интегрировать 1С8 с внешними системами достаточно часто сталкиваются с необходимость чтения XML. В свое время для унификации обработки чтения была создана обработка разворачивающая дерево XML по определенному узловому элементу в таблицу значения, где имена колонок являются по сути путем к данным XPATH.

Но такая схема устраивала всех только до определенного предела,  по мере роста объёмов разбираемых файлов скорость перестала устраивать даже самых терпеливых пользователей, и этот механизм был переписан на C#, для передачи результата в 1с использовалась функция "ЗначениеИзФайла". Приложение является консольным, принимающим на вход следующие параметры:
1. Путь к XML файлу

2. Имя узлового элемента (элемент который развернётся в строку таблицы значений,)

3. Имя файла в который будет записано сериализованное представление таблицы значений

4. Суб путь....необязательный параметр, в случае если надо указать в какой ветке XML искать узловые элементы

 

 В случае если утилитка вложена в качестве макета в обработку то её можно вызвать следующей функцией

 

Функция ПрочитататьВТЧXMLИерархВнеш(пСТрДанных,пТЗ,пИмяУзловогоЭлемента,пСубпуть = "") Экспорт
лПуть = КаталогВременныхФайлов()+"CreatingTZFor1C.exe";
Попытка
ЭтотОбъект.ПолучитьМакет("CreatingTZFor1C").Записать(лПуть);
Исключение
лФайл = Новый Файл(лПуть);
Если НЕ лФайл.Существует() Тогда
Возврат Неопределено;
КонецЕсли;
КонецПопытки;

лВремФайл = ПолучитьИмяВременногоФайла("xml");
лЗаписьТекста = Новый ЗаписьТекста(лВремФайл);
лЗаписьТекста.Записать(пСТрДанных);
лЗаписьТекста.Закрыть();

лВремРезФайл = ПолучитьИмяВременногоФайла("data");
лТЧ = Новый ТаблицаЗначений;
ЗначениеВФайл(лВремРезФайл,лТЧ);

Если ПустаяСтрока(пСубпуть) Тогда
лКоманда = """"+лПуть+""" """+лВремФайл+""" """+пИмяУзловогоЭлемента+""" """+лВремРезФайл+"""";
Иначе
лКоманда = """"+лПуть+""" """+лВремФайл+""" """+пИмяУзловогоЭлемента+""" """+лВремРезФайл+""" """+пСубпуть+"""";
КонецЕсли;
//КомандаСистемы(лКоманда,КаталогВременныхФайлов());
ЗапуститьПриложение(лКоманда,КаталогВременныхФайлов(), Истина);

пТЗ = ЗначениеИзФайла(лВремРезФайл);
Возврат лВремРезФайл;
КонецФункции

 

И собственно вызов 

ТЧДанных = Новый таблицазначений;

//лСтрРез - Строка с XML

//Policy - Имя узла разворачиваемого в строку

ПрочитататьВТЧXMLИерархВнеш(лСтрРез,ТЧДанных,"Policy");

 

Такой финт ушами позволяет из XML файла весом более 17 МБ за 10 секунд положить в таблицу значений 6000 строк и 2700 колонок. Так что польза очевидна :-)

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

Наименование Файл Версия Размер Кол. Скачив.
CreatingTZFor1C.exe
.exe 10,50Kb
19.04.13
126
.exe 10,50Kb 126 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. ziga soft (kiko_r) 20.04.13 20:19
Огромный респект!!! сэкономленное время позволило решить задачу, вместо провала!!
2. Кирилл Краснов (kirillkr) 20.04.13 21:17
Лучше не exe'шник выложить, а исходники.
3. Андрей Крутских (K_A_O) 25.04.13 14:50
xslt преобразование можно прямо в 1С сделать - скорость будет почти такой же
4. diver.sun diver.sun (diver.sun) 25.04.13 15:13
(3) K_A_O, Не спорю, но надо будет сначала разобрать структуру загружаемого документа, а это время и нервы.
5. Олег Каратаев (Kyrales) 14.05.13 04:47
Тоже самое преобразование в таблицу значения есть тут http://infostart.ru/public/124196/

Также по итогу получение дбф-файла
6. Владимир Конырев (Vladimir_Konyrev) 09.02.14 11:54
У меня exe-ик не запускается, появляется и закрывается.
7. diver.sun diver.sun (diver.sun) 04.03.14 13:08
Каким образом можете передать разбираемый файлик...
8. Wladimir (Zloslaw) 20.07.14 18:30
Да, исходники были б в тему
9. Andrey Tey (Bitnikov) 11.03.15 15:23
Скачал ради интереса.

Ждал результата 11 минут и закрыл окно.
В моем случае не имеет смысла, ибо разработанная мной процедурка 1С с ОТКРЫТЫМ кодом отработала за 22 минуты. Закрытый код и менее 2-х кратной выгоды по времени убивает все возможные будущие плюсы.

FYI.
Автор, если интересно отловить и исправить, проверю и отпишусь по просьбе.

Детали:
Запускал под XP в cmd.
Файлик Бондовой загрузки от НРД SIR (bonds) весом 38МБ, 780 тыс строк в xml, результат должен быть 56 тыс строк таблицы значений.
10. Данила Елистратов (CagoBHuK) 24.04.15 15:10
Используйте XSL и СериализаторXDTO - работать будет мгновенно.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа