Преобразование 1С->JSON->1С для обменов, Web-сервисов




Небольшая библиотека функций по преобразованию данных из 1С в строку JSON и обратно.
Удобна для обмена данными между двумя базами 1С.
Позволяет преобразовывать в строку и обратно любые типы данных, для которых доступна XML-сериализация + объекты 1С (справочники, документы, ПВХ, ПВР).
Ссылки и объекты при передаче преобразуются из адресного пространства одной базы в адресное пространство другой базы по UID.

За основу брались функции преобразования из JSON и UnJSON в 1С

Добавлена поддержка любых XML-сериализуемых типов (ссылочных типов 1С, дат, перечислений, двоичных данных, хранилище значений и др)  + объектов 1С (справочников, документов, ПВХ, ПВР). При передачи объектов полное соответствие структур баз отправителя и получателя не обязательно. Совпадающие реквизиты заполняются, не совпадающие игнорируются. Если объект в базе приемнике найден, то он перезаполняется, иначе создается новый.

Преобразование простым обходом коллекций и обратное преобразование разбором строки. Возможно, для 8.3.6 можно будет переписать разбор через встроенные функции по работе с JSON для более быстрой работы.

Работа аналогична исходной обработке. Есть 2 функции: преобразование из строки в JSON и обратное из JSON в строку.
1. В первой базе выполняем команду «СтрокаJSON = JSON(Значение)»;
2. Строковое значение «СтрокаJSON» передаем в другую базу любым способом (через файл, веб-сервис, .COM);
3. Во второй базе выполняем обратное преобразование «Значение = UnJSON(СтрокаJSON)»;

Для использования достаточно перенести функции из модуля обработки в общий модуль и дополнительно указать соответствие между типами ссылок в двух базах.

#Область ПрограммныйИнтерфейс

Функция JSON(Значение) Экспорт

СоответствиеХМЛ = Новый Соответствие;
// СоответствиеХМЛ.Вставить(Тип("Тип этой 1С базы"),"Тип 1С базы получателя");
СоответствиеХМЛ.Вставить(Тип("Дата"),"Дата");
СоответствиеХМЛ.Вставить(Тип("ВидДвиженияНакопления"),"ВидДвиженияНакопления");
СоответствиеХМЛ.Вставить(Тип("ДвоичныеДанные"),"ДвоичныеДанные");
СоответствиеХМЛ.Вставить(Тип("ХранилищеЗначения"),"ХранилищеЗначения");
СоответствиеХМЛ.Вставить(Тип("УникальныйИдентификатор"),"УникальныйИдентификатор");
СоответствиеХМЛ.Вставить(Тип("ВидСчета"),"ВидСчета");
СоответствиеХМЛ.Вставить(Тип("ДокументСсылка.Поступление"),"ДокументСсылка.ПоступлениеТоваровУслуг");

СоответствиеОбъектов = Новый Соответствие;
//  ДЛЯ УКАЗАННЫХ ТУТ ОБЪЕКТОВ ОБЯЗАТЕЛЬНО УКАЗАНИЕ СООТВЕТСТВИЯ ССЫЛОК В СТРУКТУРЕ СоответствиеХМЛ
// СоответствиеОбъектов.Вставить(Тип("Тип объекта этой 1С базы"),"Конструктор нового объекта базы получателя");
СоответствиеОбъектов.Вставить(Тип("ДокументОбъект.Поступление"),"Документы.ПоступлениеТоваровУслуг.СоздатьДокумент()");

СоответствиеТипов = Новый Структура("СоответствиеХМЛ,СоответствиеОбъектов",СоответствиеХМЛ,СоответствиеОбъектов);
Возврат НеФорматированныйJSON(Значение,СоответствиеТипов);
КонецФункции

Функция UnJSON(СтрJSON) Экспорт
Перем Значение;

Если ПолучитьЗначениеJSON(СтрJSON,Значение)=0 Тогда
Возврат Значение
КонецЕсли;
Возврат Неопределено
КонецФункции

#КонецОбласти 


У обработки есть форма с несколькими примерами для проверки преобразования.


В приложении 2 варианта обработки. Первая преобразует только XML-сериализуемых типы, вторая также  объекты 1С (справочники, документы, ПВХ, ПВР).

UPD. Пример использования:
1. Выгрузка/загрузка данных в формате JSON для отличающихся конфигураций (Такси+ОФ) — универсальная обработка по переносу данных между любыми конфигурациями.

53 Comments

  1. vano-ekt
  2. ekaruk

    (1) vano-ekt, В 8.3.6 будет всего лишь добавлена возможность потокового чтения,

    преобразования простых типов (строка, булево и др). Никаких встроенных функций по преобразованию в JSON типов 1С новшество пока не предусматривает (хотя возможно еще добавят).

    Теоретически новая платформа позволит работать с JSON на порядок быстрее,чем при работе со строкой.

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

    Собственно, это видно в самом анонсе на примере подразделения организации.

    Когда появится возможность, я, возможно, поменяю в этой же библиотеке работу со строкой на работу с типами JSON. Но сам интерфейс и принцип работы не изменится абсолютно.

    Reply
  3. vano-ekt

    Так я к тому что стоит ли торопиться?)



    При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата.



    Дальнейшее развитие

    Мы думаем над тем, чтобы предоставить вам возможность сериализации в JSON прикладных типов 1С:Предприятия: ссылок, объектов, наборов записей и т.д. Поэтому есть вероятность появления ещё одного, третьего уровня средств работы с JSON. Этот уровень позволит вам преобразовывать в JSON любые типы 1С:Предприятия, для которых поддерживается XDTO-сериализация в XML.

    Reply
  4. ekaruk

    (3) vano-ekt, Так никто и не торопится.

    Я просто выложила то, что уже корректно работает на любой платформе.

    Дальше посмотрим, что там еще придумают.

    Reply
  5. vano-ekt

    (4) ага, быстрее б родили 🙂 при больших нагрузках алгоритм с ИС заметно ресурсы ест 🙂

    Reply
  6. Serginio

    (2) Можно это реализовать и на нет, предварительно описав классы

    http://msdn.microsoft.com/ru-ru/library/bb412179(v=vs.110).aspx

    и

    http://infostart.ru/public/238584/

    Reply
  7. kser87

    c 8.3.6 Json будет поддерживаться на уровне платформы.

    Reply
  8. vabue

    Кто-нибудь тестировал что быстрее в мире 1С, разбор JSON или XML? А генерация?

    Reply
  9. ekaruk

    (9) vabue, Не тестировала. Думаю, на текущий момент в мире 1С быстрее ХМЛ. Просто потому, что 1С работае.т с ним средствами платформы. С JSON работа выполняется как со строкой. Имеет смысл проверять разве что с 8.3.6.

    Из плюсов JSON — он компактнее.

    Reply
  10. Rustig

    (1) спасибо за ссылку, интересная информация.

    не знаете, статьи «Заметки из Зазеркалья» дублируются в диски ИТС?

    Хотелось бы видеть такого рода статьи в разделах ИТС-дисках.

    Reply
  11. ZLENKO

    (9) vabue, «Кто-нибудь тестировал что быстрее в мире 1С, разбор JSON или XML? А генерация?»

    Голосую за XDTO 🙂 Сериализация мгновенная, десериализация очень быстрая!

    Можно десериализацию делать используя неймспейс другой базы для обмена между разными конфигурациями.

    Reply
  12. a.podobin

    (9) vabue, имеется такое мнение http://habrahabr.ru/post/189812/

    Reply
  13. Serginio

    (12) В Мире Net да и вообще сейчас модно использовать protobuf

    http://www.forum.mista.ru/topic.php?id=722310#53

    Reply
  14. vabue

    (13) a.podobin, Ну, тут две разных структуры данных. Да и интересовало разработчика именно загрузка на сайт, а не выгрузка из 1С.

    (12) ZLENKO.PRO, Есть ли поддержка XDTO в гетерогенных системах? Например, в тех же ESB?

    (10) Надо будет провести эксперимент 🙂

    Reply
  15. bendarik

    А почему не вышло нормально обрабатывать значения с типом «Дата»?

    На сколько я понимаю, Вы добавляете тип «Дата» в «СоответствиеХМЛ» и после работаете с ним как с не примитивным типом.

    При сериализации у Вас получается избыточная конструкция:

    «Период»:{

    «Type»:»Дата»,

    «UID»:»2014-11-03T14:29:06″

    }

    когда должно быть:

    «Период»:»2014-11-03T14:29:06″

    Reply
  16. ekaruk

    (16) bendarik, Она не избыточная.

    Теоретически у нас может быть текстовое поле, в котором указано значение «2014-11-03T14:29:06».

    При сериализации мы должны сохранить его текстом, а не преобразовать в дату.

    Такое представление гарантирует идентичность исходных и полученных данных.

    Reply
  17. bendarik

    (17) согласен, что во имя идентичности исходных и полученных данных необходимо дополнительное описание свойств значений НО…

    но, к примеру, я использую (де)сериализацию JSON для уменьшения размера передаваемых пакетов при обмене через web-сервисы и было бы ибеально даты обрабатывать как примитивные типы без дополнительного описания типа, т.к. это лишние байтики (мелочь, а приятно).

    Например, дату можно было бы сериализовать как и сейчас в формате XML, но без кавычек:

    «Период»:2014-11-03T14:29:06

    К слову, Ваша публикация подтолкнула начитаться и решиться переписать обмены с XML на JSON 😉

    Reply
  18. bendarik

    (17) Вы аналогично поступаете со значениями типа «булево», записывая их без кавычек как true или false. Вероятно, что дату так же можно считать.

    Но лучше попробовать и написать, что вышло

    Reply
  19. ekaruk

    (18) bendarik,

    «Период»:2014-11-03T14:29:06

    Именно в таком формате нельзя. Двоеточие это разделитель. Хотя, конечно, какой-то формат можно было подобрать.

    Я пошла по простому пути. Думаю, не принципиально.

    По переписыванию рекоммендую подождать 8.3.6. Гораздо быстрее будет работать на платформенных механизмах, чем на строковых функциях.

    Reply
  20. Serginio

    http://snippets.artvolk.sumy.ua/view/167/daty-v-formate-iso-8601-pri-json-serializacii-v-aspnet-mvc

    Сериализатор JSON, используемый в ASP.NET MVC по умолчанию сериализует даты в строки подобного вида:

    «/Date(1299741864000)/»

    Причины подробно объясняются авторами: в спецификации JSON не определён тип данных для даты и времени, а выбранный для ASP.NET MVC формат удобен для JavaScript-клиентов.

    Reply
  21. Serginio

    http://msdn.microsoft.com/ru-ru/library/bb412170(v=vs.110).aspx

    Формат DateTime при передаче по линиям связи

    Значения типа DateTime представляются строками JSON вида «/Date(700000+0500)/», где первое число (в данном случае 700000) — это число миллисекунд в часовом поясе GMT по обычному (не летнему) времени, прошедшее с 1 января 1970 г. Это число может быть отрицательным для представления более раннего времени. Часть строки «+0500» является необязательной и показывает, что это время в формате Local, т. е. при десериализации оно должно быть преобразовано в местный часовой пояс. Если эта часть строки отсутствует, время десериализуется как Utc. Собственно число (в данном случае «0500») и его знак (+ или -) игнорируются.

    При сериализации времен формата DateTime, Local и Unspecified времена записываются со смещением, а время формата Utc записывается без смещения.

    JavaScript-код клиента ASP.NET AJAX автоматически преобразует такие строки в экземпляры DateTime JavaScript. При наличии других строк аналогичного вида, не принадлежащих к типу DateTime в .NET, они также преобразуются.

    Преобразование происходит только при условии, что символы «/» предваряются escape-знаками (т. е. JSON-фрагмент выглядит так: «/Date(700000+0500)/»); по этой причине JSON-кодировщик WCF (реализуемый привязкой WebHttpBinding) всегда предваряет символ «/» escape-знаком.
    Reply
  22. phsin

    А для 7.7 есть что-нибудь похожее?

    Reply
  23. Elisy

    По скорости, если кому-то интересно. Сериализация Json работает очень медленно по сравнению с XML-сериализацией.

    Оптимизация делалась для веб-сайта http://www.oboi.kg

    На данных из примерно 5 тысяч записей таблицы значений перевод в XML уменьшил время обработки со 120 секунд (2 минуты) до 4 секунд.

    Reply
  24. ekaruk

    (24) Elisy, (25) Serginio, XML и JSON это всего лишь форматы текстового представления данных.

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

    Можно найти примеры разницы скорости на ПОРЯДКИ при использовании одних и тех же форматов.

    То, что написанная Васей библиотека на PHP для работы с XML в 100 раз быстрее, чем написанная Петей на Python библиотека для работы с JSON, абсолютно ничего не говорит о скорости форматов.

    Имеет смысл обсуждать скорости работы библиотек, но не имеет смысла обсуждать скорости форматов.

    Фреймворк 1С-Предприятие на текущий момент имеет встроенные библиотеки для работы с XML, поэтому стандартная сериализация в XML через XDTO-типы в любом случае будет быстрее любой JSON-сериализации через строку.

    С выходом 8.3.6 можно будет говорить о сравнении скорости стандартных библиотек XML и JSON.

    Сейчас обсуждени скорости, на мой взгляд, смысла особого не имеет.

    Reply
  25. Serginio

    (26) Не совсем так. Я еще упоминал Protobuf и вот появляются новые форматы например MsgPack http://en.wikipedia.org/wiki/MessagePack

    При этом это не всегда текстовая сериализация. Бинарная она и компактнее и быстрее доступ. Например в XML сериализации проблема с циклическими ссылками http://www.forum.mista.ru/topic.php?id=687222#15

    поэтому ищутся компактные и более продвинутые форматы.

    А в 1С куча чего нет, так что например наполную приходится использовать например Net

    Reply
  26. ekaruk

    (27) Serginio, Разумеется, бинарное представление компактнее текстового.

    Но у текстового есть огромное преимущество, которое перекрывает этот недостаток — его можно открыть любым текстовым редактором и просмотреть.

    На самом деле для большинства решаемых в 1С задач быстродействие +/- несколько секунд и даже пару минут не критично абосолютно. С учетом постоянных изменений, скорость разработки и простота модификации и поиска ошибок часто важнее, чем быстродействие.

    Трата времени на ускорение в несколько секунд путем усложнения кода просто нерентабельна.

    Reply
  27. Serginio

    (28) Угу. Помню пришлось переписать универсальный обмен на обмен через сериализацию ОбъектовXDTO . Бывают разные объемы где потери секунд превращаются в часы. Все зависит от задачи. По твоей логике XML сериализация лучше всех, однако приходится писать Json сериализацию, так как нужно общаться с сайтами которые используют именно такой вариант обмена. А затем и для ProtoBuf. Ты можешь считать как угодно, а программисты для высоконагруженных серверов выбирают более быстрые и компактные алгоритмы сериализации. Вот ты уже столкнулась с тем, что при каждом вызове Вэб сервиса 1С происходит инициализация сессии и тебя это напрягает. А представь, что нужно обрабатывать десятки или сотни тысяч обращений в секунду.

    Reply
  28. ekaruk

    (29) Serginio, Есть разные задачи.

    Бывает, что критичны и милисекунды. Такие задачи я тоже решала.

    Но реально в 95% случаев трата времени разработчика на ускорение просто нерентабельна.

    Лучше сделать проще и понятнее, все равно скорее всего через месяц алгоритм менять и все переписывать..

    Reply
  29. Serginio

    Я не про то, что лучше для тебя, а то что тебе нужно подстраиваться под других которые и выбирают форматы.

    Раньше был XML, затем JSON, сейчас ProtoBuf. Ты же написала парсер не для обмена между своими программами, а для обмена между сайтами сторонних производителей, а вот для них уже свои параметры, что хорошо, а что плохо. А вот, то что через месяц менять алгоритм, это хорошо только на период отладки. А вот например на Net я напишу обмен с 1С для любого алгоритма без всяких затрат времени, так что проблема не во времени, а в квалификации.

    Reply
  30. bendarik

    Сравнил XML и JSON.

    JSON молодец, но сжатый XML ни чем не уступает сжатому JSON…

    Вот цитата из лекции о сжатии данных:

    «В основе алгоритма сжатия (алгоритмы группы KWE) по ключевым словам положен принцип кодирования лексических единиц группами байт фиксированной длины. Примером лексической единицы может быть обычное слово. На практике, на роль лексических единиц выбираются повторяющиеся последовательности символов, которые кодируются цепочкой символов (кодом) меньшей длины. Результат кодирования помещается в таблице, образовывая так называемый словарь.»

    Я по web-сервису меняюсь двоичными данными и архивирую каждый файл обмена. Такие дела…

    Reply
  31. pitnn

    Добрый день.

    Что-то я не разобрался как из JSON-строки получить структуру данных ключ/значение для дальнейшего использования в 1С. Подскажите, пожалуйста

    Reply
  32. ekaruk

    (33) pitnn, Просто пишете UnJSON(<ВашаСтрока>). На выходе будет объект в типах 1С (соответствие или массив, с которыми можно стандартно работать). Сама функция в модуле объекта обработки.

    Если объекты 1С (ссылки, документы) не используете, то СоответствиеХМЛ заполнять не нужно вообще. Пусть остается пустым.

    Reply
  33. pitnn

    (34) спасибо за ответ, но в том-то и дело, что не так все просто как описано вами ))). При разборе JSON-строки вылетает ошибка:

    «Не удалось преобразовать строку в значение!{ВнешняяОбработка.JSON_1C.МодульОбъекта(213)}: Ошибка при вызове метода контекста (Вставить)

    ОбъектСтруктура.Вставить(Ключ,Значение);

    по причине:

    Задано неправильное имя атрибута структуры».

    А связано это вот с чем. При обработке конструкции вида:

    [

    {



    «deliveryAddress»: {

    «»: null

    },



    }

    ]

    ключ оказался пустым, что и привело к вызову исключения при добавлении в структуру.

    Reply
  34. ekaruk

    (35) pitnn, Ну, логично. Ключ не может быть пустым. Иначе как 1С его должна в структуру вставить? Вроде стандарты JSON такого не предусматривают. Добавьте свою обработку (ключ по умолчанию или такие значения игнорировать), если у Вас такие данные встречаются.

    Reply
  35. pitnn

    Аналогично с конструкцией вида:

    «deliveryAddress»: {

    «177353»: «г. Москва»

    },

    Тут ключ имеет числовое значение и не может использоваться в структуре

    Reply
  36. pitnn

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

    Reply
  37. ekaruk

    (37) pitnn, А где Вы такие данные нашли?

    У меня были похожие проблемы выгрузке в JSON контактной информации для организаций. Там какой-то сложный формат XML хранится.

    Не помню точно, как обходила.

    В этой обработке http://infostart.ru/public/308563/ я добавляла дополнительные ветки в стандартный разбор. Если у вас передача данные между базами 1С, можете попробовать из неё код взять или просто проверить на своих данных.

    Reply
  38. pitnn

    (39) Сторонний сайт такие данные предоставляет. Я не могу на это влиять, поэтому приходится обрабатывать то, что дают ))

    Reply
  39. uri1978

    Спасибо, сильно помогли.

    Reply
  40. Serjeo

    В 8.3.7 полностью реализована возможность JSON-сериализации объектов XDTO.

    Reply
  41. AlBelkin

    Здравствуйте! Очень интересная штука. Подскажите, какой версии 1С будет достаточно, чтобы «пощупать» эту библиотеку? Есть демка 1С для обучения http://1c-uroki.ru/articles/download_1C_8.2 , она подойдёт?

    Reply
  42. ekaruk

    (43) AlBelkin, Подходит для любой платформы, начиная с 8.2.

    Демка вполне подойдет.

    Reply
  43. dsdred

    Не совсем понял зачем такие сложности?

    Для обмена использую сериализацию.

    ДанныеВходные — могут быть ТЗ, Структура, просто значение и т.д.

    //Серилизатор/Десирелизатор JSON

    Функция СериализаторJSON(ДанныеВходные) Экспорт

    ЗаписьJSON = Новый ЗаписьJSON;

    ЗаписьJSON.УстановитьСтроку();

    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON,ДанныеВходные,НазначениеТипаXML.Явное);

    СтрокаJSON = ЗаписьJSON.Закрыть();

    Возврат СтрокаJSON;

    КонецФункции

    Функция ДесерилизаторJSON(ДанныеВходные) Экспорт

    ЧтениеJSON = Новый ЧтениеJSON;

    ЧтениеJSON.УстановитьСтроку(ДанныеВходные);

    ДанныеВозврат = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);

    ЧтениеJSON.Закрыть();

    Возврат ДанныеВозврат;

    КонецФункции

    Reply
  44. ekaruk

    (45) dsdred,

    1. Ну вообще-то преобразование структуры это немного не то, что преобразование документа. Эта библиотека преобразует объект 1С (документ/справочник) в другой объект 1С.

    2. Ваш код не будет работать на платформах ниже 8.3.6.

    Reply
  45. dsdred

    (46) ekaruk

    1 Ясно. Обычно сопоставление (документ/справочник) на стороне веб сервиса обрабатываю после десерилизации.

    2 Это да, есть еще те кто сидят на старых Платформах… Это при том, что на днях 8.3.8 выйдет и уже есть версия для тестирования 8.4.1.445

    Reply
  46. zels

    Хорошая штука, но пришлось немного допилить:

    1. Сделал загрузку файлов и JSON->объекты в обычном приложении, т.к. если запускать в тонком клиенте, то при записи объектов могут возникать ошибки (если используются процедуры обычного клиента).

    2. Сделал возможность транзакции и вывода через 100 объектов, т.к. при загрузке десятков тысяч объектов вывод каждого тормозит.

    Reply
  47. pavel_pss

    Хорошая обработка, но она выгружает только один объект. То есть в обработке выбирается документ и в файл попадет вся информация о нем, а поля например контрагент будут выгружены в только виде ГУИДа, а самого описания контрагента нет, это же не правильно! Нужно было тогда дописывать чтобы и ссылочные реквизиты выгружались. А так обработка получается не полноценной. Кому нужно будет полную версию, обращайтесь. Позже выложу в свою учетку.

    Reply
  48. jmi
  49. darkmessiahan

    (14) ссылька не работает

    Reply
  50. Serginio

    (51) Старая уже. Сейчас в тренде Microsoft Bond

    Reply
  51. LomayaZakat

    (50)Спасибо, то что надо!

    Reply

Leave a Comment

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