Быстрое преобразование 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 колонок. Так что польза очевидна 🙂

10 Comments

  1. kiko_r

    Огромный респект!!! сэкономленное время позволило решить задачу, вместо провала!!

    Reply
  2. kirillkr

    Лучше не exe’шник выложить, а исходники.

    Reply
  3. K_A_O

    xslt преобразование можно прямо в 1С сделать — скорость будет почти такой же

    Reply
  4. diver.sun

    (3) K_A_O, Не спорю, но надо будет сначала разобрать структуру загружаемого документа, а это время и нервы.

    Reply
  5. Kyrales

    Тоже самое преобразование в таблицу значения есть тут http://infostart.ru/public/124196/

    Также по итогу получение дбф-файла

    Reply
  6. Vladimir_Konyrev

    У меня exe-ик не запускается, появляется и закрывается.

    Reply
  7. diver.sun

    Каким образом можете передать разбираемый файлик…

    Reply
  8. Zloslaw

    Да, исходники были б в тему

    Reply
  9. Bitnikov

    Скачал ради интереса.

    Ждал результата 11 минут и закрыл окно.

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

    FYI.

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

    Детали:

    Запускал под XP в cmd.

    Файлик Бондовой загрузки от НРД SIR (bonds) весом 38МБ, 780 тыс строк в xml, результат должен быть 56 тыс строк таблицы значений.

    Reply
  10. CagoBHuK

    Используйте XSL и СериализаторXDTO — работать будет мгновенно.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *