Преобразование XML в объекты 1С

30 Comments

  1. DitriX

    Плохо искали. Ищите по термину сериализация.

    Reply
  2. kentavr27

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

    1. После преобразования ЗначениеВСтрокуВнутр() занимает гораздо меньший объем, чем обычный XML

    2. Не нужно строить никаких схем. На одном конце загнал в строку, на другом получил из строки уже готовый объект (при сходной, но не абсолютно одинаковой, структуре данных). И это, действительно всего парой строк кода!

    Одно огорчает, что данный метод не доступен в мобильных приложениях. XML — это может быть и хорошо, но слишком уж много места занимает. При обмене большими объемами данных выжирает много трафика. А как запихнуть некий подобный механизм (с минимальным размером данных) в мобильное приложение — пока не знаю.

    Ну и к тому же еще настораживает оговорка СП: Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется. В связи с чем? -Загадка.

    Reply
  3. PrinzOfMunchen

    (1) DitriX, спасибо за информацию, обязательно поищу.

    P.S. Пользуясь случаем, огромное вам спасибо за ваши статьи и уроки по мобильной платформе. Они шикарны.).

    Reply
  4. PrinzOfMunchen

    (2) kentavr27, тут основная фишка не в использовании связки «ЗначениеИзСтрокиВнутр» <-> «ЗначениеВСтрокуВнутр» а именно XLS преобразование не наших xml-фалов в объекты 1С. Удобно и быстро. Вообще, пришлось воспользоваться когда нужно было загружать данные от http-сервиса, возвращающего xml-ку с большим объемом данных, где полезных для меня было минимум. Через ЧтениеXML было лениво загружать, писать кучу условий….вот и «придумал». )))

    Reply
  5. quick

    Хорошее решение для простых случаев.

    Я написал одно время модуль для таблиц и списков на python

    https://gist.github.com/WorldException/de7199f8dc9659656336

    Позволяет делать так

    v=V8Table([‘test1′,’test2′,’test3’])
    v.add([‘000′,’000’,’000″test»‘])
    print v.export().encode(‘cp1251’)
    

    А так же для 7-ки

    https://gist.github.com/WorldException/cdfce52e9da29437d724

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

    https://github.com/WorldException/v7py

    Reply
  6. b-dm

    Было бы здорово иметь такую обработку и для обычных форм!

    Reply
  7. PrinzOfMunchen

    (6) b-dm, есть и для обычных форм вариант. Вечером доберусь до домашнего компьютера и добавлю в публикацию.

    Reply
  8. the1

    Как по мне, так XSL штука еще более богомерзкая, чем XML. Сталкивался с ней лет 10 назад, когда еще 1С не занимался.

    П.С. Но за идею плюсую.

    Reply
  9. PrinzOfMunchen

    (6) b-dm, выложил обработку для обычных форм со строкой преобразования для 8.2.

    Reply
  10. monkbest

    Я помню в семерке методы «ЗначениеВСтрокуВнутр» и «ЗначениеИзСтрокиВнутр» жрали очень много оперативной памяти и падали с нехваткой памяти на боле менее больших данных. Я на их основе делал распределенку в 7.7, (в стандартном РИБе нельзя было фильтровать данные), совал элемент БД в список значений (структур в 7.7 не было), списки значений пихал в общий список значений и это чудо в «ЗначениеВСтрокуВнутр», получалось очень круто и на халяву, никакой зависимости от структуры БД. Но когда применил этот метод на более менее больших базах, сразу уперся в нехватку памяти. примерно пропорции, если правильно помню, были такие, если выходной текстовик 10Mb то оперативы сжиралось в момент преобразования почти 1Gb.

    Но это в момент преобразования в строку, при обратном все происходило мгновенно и без лишних затыков

    Reply
  11. vlad.frost

    Выдержка из Синтакс-помощника для методов ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр:

    Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется.
    Reply
  12. Yashazz

    Забавный способ. За идею плюсую.

    Reply
  13. AlexiyI

    А обратно в исходный XML преобразовать можно?

    По поводу шаблонов преобразования: можно тестить онлайн, например тут

    Reply
  14. PrinzOfMunchen

    (13) AlexiyI, можно, но зачем? Если нужно объект преобразовать в xml, есть типовая сериализация.

    Да таких сайтов полно. Во вложенных обработках можно сразу увидеть результат в виде таблицы значений, кроме того же самого функционала по онлайн-преобразованию.

    Reply
  15. AlexiyI

    (14) если мы можем XML быстро преобразовать по шаблону в строку, а затем в таблицу, то думаю, было бы полезно так же преобразовать таблицу в строку и обратно в XML. Но похоже, метода обратного преобразования у ПреобразованиеXSL нет.

    Reply
  16. PrinzOfMunchen

    (15) AlexiyI,

    преобразовать таблицу в строку

    ?

    Зачем нам этот лишний этап? Можно сразу из таблицы получить XML:

    Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«xml»);
    НоваяЗаписьXML = Новый ЗаписьXML();
    НоваяЗаписьXML.ОткрытьФайл(ИмяВременногоФайла);
    ТаблицаЗначений = Новый ТаблицаЗначений;
    ТаблицаЗначений.Колонки.Добавить(«ИмяКолонки»);
    НоваяСтрока = ТаблицаЗначений.Добавить();
    НоваяСтрока.ИмяКолонки = «Пример содержания колонки»;
    СериализаторXDTO.ЗаписатьXML(НоваяЗаписьXML, ТаблицаЗначений, НазначениеТипаXML.Явное);
    

    Показать

    И все. На выходе XML. А уж его, если сильно хочется, преобразуйте как душе угодно.

    Reply
  17. AlexiyI
    Reply
  18. tarassov

    Я ранее поднимал эту же тему на форуме, в том числе показал, как получать из XML с помощью XSL-преобразования XDTO соответствующий таблиые значений.

    Пожалуйста посмотрите Читаем XML, хочется получить ТаблицаЗначений через XDTO и сравните

    Reply
  19. AlexiyI

    (18) tarassov, именно так я и хотел сделать сначала :), но не знаю правил преобразования Сериализатора XDTO. А со ЗначениеВСтрокуВнутр() понять логику преобразования методом проб и ошибок проще, и можно обойтись без документации.

    Знал бы к чему преобразовывать, пошел бы и я этим путем, но преобразовывать в таблицу, думаю, не совсем по феншую, т.к. структура XML может быть очень разнообразной, с глубокой вложенностью — в таблице без дублирования данных не обойтись. Я так понимаю, тема с сериализатором XDTO до конца не раскрыта? По ссылке кидает непонятно куда так что оставлю здесь.

    Reply
  20. AlexiyI

    Ах да, я сравнил… Мой шаблон преобразует любую XML с любой вложенностью, а не только «плоскую» и с одними атрибутами. Ну, не совсем любую: если тег <phones> будет в одном месте массивом, в другом структурой, в третьем строкой, то не сработает. Мой метод лучше :), ничего личного, просто бизнес :).

    Reply
  21. AlexiyI
    Reply
  22. AlexiyI

    Код не такой в стрзаменить() 🙂 . При отправке комментария символы «больше» и «меньше» заменились на обратные.

    Т.е. в стрзаменить меняем «[амперсант]lt;» на «<«, а «[амперсант]gt;» на «>».

    Reply
  23. PrinzOfMunchen

    (17) AlexiyI, Сильно не тестил, но работа видимо немаленькая проделана. )) Соберите эти правила для преобразования по типовым объектам, какой символ в строковом представлении объекта за что отвечает. Только учитывайте, что на разных платформах, немного по разному выглядят сериализованные строки. Было бы интересено взглянуть на такое. Мини-документация. )

    Reply
  24. AlexiyI

    (23) я использую всего 3 типа: массив, структура и строка. Структура xml для сериализатора XDTO оказалась проще, чем структура строки внутр.

    1. Строковое значение: <Value xsi:type=»xs:string»>строка значения</Value>.

    2. Структура: <Value xsi:type=»Structure»> элементы структуры</Value>.

    3. Элемент структуры: <Property name=»ИмяКлюча»> <Value xsi:type=»любой_тип»>значение элемента структуры</Value> </Property>.

    4. Массив: <Value xsi:type=»Array»> элементы массива </Value>. Элементы массива выглядят так: <Value/><Value/><Value/><Value/>… Значения <Value/> могут описываться как написано в п. 1, 2, 4, т.е. строка, структура и массив могут выступать в качестве элементов массива.

    Пара нюансов:

    1. В выложенном мной тексте шаблона символы «[амперсант]lt;» и «[амперсант]gt;» автоматически заменились на «<» и «>«. Т.е. перед применением данного шаблона в тегах <xsl:text> нужно заменить «<» и «>» на «[амперсант]lt;» и «[амперсант]gt;«.

    2. Я совсем забыл про возможные атрибуты тегов xml. Думаю, некоторой доработкой шаблона можно каждое значение тега дополнять структурой с предопределенным именем, например «tag_attributes«, и заполнять его всеми атрибутами.

    Reply
  25. PrinzOfMunchen

    (24) AlexiyI,

    Структура xml для сериализатора XDTO

    Интересно. Надо будет посмотреть.

    Будет время, попробую заняться.

    Reply
  26. jobkostya1c8

    Полезный материал. Надо внимательно все просмотреть и проверить в конфигураторе.

    Reply
  27. slawanix

    Автор, поделись пожалуйста источником, прочитав который я смогу расшифровать твою строку преобразования, и нарисовать свою строку под свою задачу. Если не трудно) И ведь есть еще некий XPath, он ведь тоже решает аналогичные задачи, да?

    Reply
  28. PrinzOfMunchen

    (27) slawanix, смотрел курсы по XML и XSLT. Думаю полно таких в интернете. )

    Reply
  29. kote

    (10)

    .. если правильно помню, были такие, если выходной текстовик 10Mb то оперативы сжиралось в момент преобразования почти 1Gb

    1Сv8 в этом отношении радует — память уже не расходуется. Так что можно опять применить этот приём.

    Reply
  30. slawanix

    Ок. Спасибо)

    Reply

Leave a Comment

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