JSON парсер для профессиональных разработчиков

Программирование - Инструментарий

Описана методика создания парсеров json-файлов для любой конфигурации 1С. Приложена тестовая конфигурация и обработки-парсеры для обычного и управляемого приложений. Материал предназначен для разработчиков на базе 1С, занимающихся вопросами автоматизации бизнес процессов, обмена данными, сопряжения 1С с web-сайтами и сервисами.

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

Предлагается альтернативная методика загрузки данных из json-файлов в 1С. Она имеет определенные преимущества, и прежде всего – это возможность работать с любой платформой 1С, даже 1С:Предприятие 77. Но это даже не главное. Предлагаемый подход имеет универсальность, наглядность и простоту, что позволяет создавать сервисы обмена на порядок быстрее, чем типовыми методами.

Всем разработчиками по материалам этой статьи будут предложены готовые шаблоны для ваших разработок.

Что такое, JSON

JSON - удобный формат представления данных. Он сводится к структуре вида:

{ "ИМЯ" :"ЗНАЧЕНИЕ", … "ИМЯ" :"ЗНАЧЕНИЕ" }

При этом, ЗНАЧЕНИЕ может также быть json-структурой. Кто знаком с языком java, да и просто с ООП, тот без труда увидит в предложенном подходе схожесть с описанием объектов, и будет прав.

Стоит отметить, что как и xml, json-объект может быть представлен в виде дерева.

JSON в виде списка

Наш метод будет основан на преобразование древовидной структуры json в линейную. Делается это с использованием полного пути к реквизитам. Как далее увидим, это позволит выполнять обработку быстрее, чем при объектном подходе.

Пример:

{
   "firstName": "Иван",
   "lastName": "Иванов",
"address": {
    "streetAddress": "Московскоеш., 101, кв.101",
    "city": "Ленинград",
    "postalCode": 101101
   },
"phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}

В линейном представлении данная json-структура предстанет в виде:

firstName: "Иван",
lastName: "Иванов",
address.streetAddress: "Московское ш., 101, кв.101",
address.city: "Ленинград ",
address.postalCode: "101101",
phoneNumbers: [ "812 123-1234",  "916 123-4567"]

Для того чтобы получить данные, например, по адресу, достаточно пройти список и выбрать строки, левая часть полного пути в которых соответствует "address." В итоге, выборку любой сложности можно сделать в один проход по списку, зная лишь полный путь к узлу. И что говорить, организация и хранение линейной структуры в памяти намного проще, чем вложенной и объектной.

Правила разбора

Для работы с json-файлами будем использовать не сложный макроязык, реализованный xml-директивами. По идее, ни что не мешает работать с адаптированным диалектом бейсика или паскаля, но xml проще обрабатывать в 1С.

Приведем пример директив для разбора json-файла, который не требует подробных комментариев.

{
  "sotr1" : { "name" : "Обама" },
  "sotr2" : { "name" : "Путин" },
  "sotr3" : { "name" : "Коноплев" }
}

// Из исходной таблицы берем очередную строку по ключу sotr с индексом 1, 2, 3 ...
<СКОПИРОВАТЬ РЕЗУЛЬТАТ = "Сотрудник" ИСТОЧНИК = "Исходная" КЛЮЧ = "sotr[N]" СТАРТ = "1" МЕТКА = "Сотр" ДАЛЕЕ = "Завершить"/>
// Ищем в справочнике сотрудников по наименованию элемент по атрибуту name из прочитанной json-строки
<УСТАНОВИТЬ РЕЗУЛЬТАТ = "Спр" ИСТОЧНИК = "Сотрудник" ОБЪЕКТ = "Справочники.Сотрудники" ПОИСК = "Наименование" КЛЮЧ = "name">
   // Создаем в переменной Стр новый элемент справочника Сотрудники
   <СОЗДАТЬ РЕЗУЛЬТАТ = "Спр" ОБЪЕКТ = "Справочники.Сотрудники"/>
   // Присваиваем наименование нового элемента из строки json по ключу name
   <УСТАНОВИТЬ РЕЗУЛЬТАТ = "Спр.Наименование" ИСТОЧНИК = "Сотрудник" КЛЮЧ = "name" />
   // Сохраняем созданный элемент справочника
   <ЗАПИСАТЬ РЕЗУЛЬТАТ = "Спр" />
</УСТАНОВИТЬ>
// Переходим к чтению очередной строки из исходной таблицы
<ПЕРЕЙТИ КМЕТКЕ = "Сотр" />
// Директива, куда переходим, когда больше строк нет
<НИЧЕГО МЕТКА = "Завершить"/>

Далее будет приведено краткое описание всех реализованных нами директив. В прилагаемом архиве имеется их подробное описание с примерами использования.

ОписаниеXML-директив разбора JSON

Выборка из таблицы

<СКОПИРОВАТЬ ИСТОЧНИК="…" РЕЗУЛЬТАТ="…" КЛЮЧ="…">
<СКОПИРОВАТЬ ИСТОЧНИК="…" РЕЗУЛЬТАТ="…" КЛЮЧ="Имя[N]" СТАРТ = "..." МЕТКА = "…" ДАЛЕЕ = "…">

Создание экземпляра объекта метаданных

<СОЗДАТЬ РЕЗУЛЬТАТ = "…" ОБЪЕКТ = "…" />

Создание строки табличной части

<СОЗДАТЬСТРОКУ РЕЗУЛЬТАТ = "…" ИСТОЧНИК = "…" />

Запись данных

<ЗАПИСАТЬ РЕЗУЛЬТАТ = "…">

Интерпретация данных, установка значений переменных и реквизитов

<УСТАНОВИТЬ РЕЗУЛЬТАТ = "…" ЗНАЧЕНИЕ = "…" />
<УСТАНОВИТЬ РЕЗУЛЬТАТ = "…" ИСТОЧНИК = "…" КЛЮЧ = "…" />
<УСТАНОВИТЬ РЕЗУЛЬТАТ = "…" ОБЪЕКТ = "…" ПОИСК = "…" ЗНАЧЕНИЕ = "…" />
<УСТАНОВИТЬ РЕЗУЛЬТАТ = "…" ОБЪЕКТ = "…" ПОИСК = "…" ИСТОЧНИК = "…" КЛЮЧ = "…"/>

Безусловный переход

<ПЕРЕЙТИ КМЕТКЕ = "…" />

Условный оператор

<ЕСЛИ ПЕРЕМ1 = "…" ПЕРЕМ2 = "…" ОПЕР = "…" ИНАЧЕ = "…">

</ЕСЛИ>

Пустая директива

<НИЧЕГО />

Приведенного набора директив достаточно для реализации практически любого алгоритма парсинга с созданием объектов конфигурации 1С: элементов справочников, документов.

Немного о дешифровке JSON

В последних версиях платформы 1С реализованы методы и объекты для разбора json-данных. Мы используем в наших примерах более продвинутые технологии, что дает возможность использовать их на более ранних платформах. Известно, что в php работа с json была реализована достаточно давно. Поэтому, для расшифровки json будем использовать простой php-скрипт, размещенный на любом доступном нам web-сервере. Мы для этих целей используем наш сайт, а скрипт размещаем по адресу:

http://www.o-planet.ru/ex/jsonparse.php

Для иллюстрации работы скрипта введите в строке браузера:

http://www.o-planet.ru/ex/jsonparse.php?json={"sotr1":{"name":"Обама"},"sotr2":{"name":"Путин"},"sotr3":{"name":"Коноплев"}}

Прилагаемый архив

В прилагаемом архиве находятся:

  • Тестовая конфигурация для обычного и управляемого приложения
  • Обработка загрузки для обычного приложения
  • Обработка загрузки для управляемого приложения
  • Серверныйphp-скрипт для дешифровке json
  • Тестовый пример jsonдля загрузки в тестовую конфигурацию
  • Подробное описание XML-директив загрузки с примерами

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

Если Вам требуется интеграция 1С с внешними ресурсами, разработка web-сервисов, мы готовы в рамках партнерства с Инфостарт обсудить и выполнить Ваш проект. 

Коллектив ООО "О-Планет"

PS А тому, кто первым найдет в этой статье пасхалку - наш маленький приз!

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

Наименование Файл Версия Размер
Все материалы к статье
.ZIP 1,33Mb
09.01.17
24
.ZIP 1,33Mb 24 Скачать

См. также

Комментарии
1. Елена Григорьева (ЕленаГр) 09.01.17 15:11 Сейчас в теме
Это любой документ можно будет описать таким образом?
5. Олег Пономаренко (O-Planet) 6713 09.01.17 16:33 Сейчас в теме
(1) Любой документ, справочник. В планах добавить работу с регистрами сведений. А вообще это - более простая альтернатива типовых правил обмена. Ведь сгенерировать выгрузку и директивы для переноса данных в идентичную конфигурацию вообще не сложно.
2. Амарис 09.01.17 15:15 Сейчас в теме
Плюсую. Пригодится. Интересно было бы сразу разбирать в дерево. Даже пример со скриншотов деревом бы лучше смотрелся.
3. Оракул Айметдинов (jhfrek) 164 09.01.17 16:15 Сейчас в теме
О! Как раз хотел разобраться с этой темой!
4. Олег Пономаренко (O-Planet) 6713 09.01.17 16:32 Сейчас в теме
Интересно, пасхалку кто-нибудь найдет? :) Сразу скажу, это не "Обама, Путин, Коноплев"
6. Евгений Евгений (Paradise.87) 09.01.17 17:12 Сейчас в теме
7. Олег Пономаренко (O-Planet) 6713 09.01.17 18:59 Сейчас в теме
8. Kembrik (kembrik) 09.01.17 19:09 Сейчас в теме
Кроме пары пропущенных пробелов- ничего не видно :)
9. Александр Штин (Sanya1984) 89 09.01.17 19:50 Сейчас в теме
Наверное нет, но все же: Матрица 5: Русский Мир,продюсер Никита Михалков, оно?
11. Олег Пономаренко (O-Planet) 6713 10.01.17 05:25 Сейчас в теме
(9) Ааа!!! Я не думал, что это будет так просто. Да, оно. Пиши, куда флешку прислать ))) Но там пасхалка Михалковым не заканчивается. Он интересный актерский состав пригласил на этот шедевр ...

(10) Тем, что в платформе 8.2 ее нет ;)
13. Виталий Чебан (VitaliyCeban) 317 10.01.17 10:04 Сейчас в теме
(11) В таком случае, чем Ваша разработка лучше проверенной годами http://infostart.ru/public/119601/ ?
15. Константин Воробьёв (kostik_love) 257 10.01.17 11:38 Сейчас в теме
24. Артур Аюханов (artbear) 901 16.01.17 12:39 Сейчас в теме
Поддержу (13)
ИМХО http://infostart.ru/public/119601/ очень полезна, т.к. выполняет свою одну, единственную задачу - разбирает json и получает выходные данные.

А в текущей обработке идет смешивание разных задач:
+ разбор json
+ интеграция/конвертация данных

В процессе интеграции наверняка выяснится, что недостаточно возможностей указанного dsl-языка для обработки всех нужд интеграции, и нужно будет как-то встраиваться в указанный dsl-код и добавлять код 1С :(
в итоге будет вырождение в ту самую КД :)
и придется выполнять постоянные допилки.

DSL - Предметно-ориентированный язык - англ. Domain-specific language

ИМХО микросервисы рулят, да и принцип единой ответственности никто не отменял.

ЗЫ кстати, я плюсанул разработку, т.к. согласен, что чем больше разработок на тему, тем лучше.
26. Олег Пономаренко (O-Planet) 6713 16.01.17 16:27 Сейчас в теме
(24) Язык на уровне васика (basic), он не может быть недостаточен. При переносе доков уже столкнулись с тем, что нужно вызывать разные "ПриИзмененииНоменклатуры", когда данных не достаточно. Думаю, как это сделать универсальным. А что касается смешивания технологий, так это плюс. На стыке технологий и рождаются интересные решения.
27. Артур Аюханов (artbear) 901 16.01.17 23:34 Сейчас в теме
(26) >Язык на уровне васика (basic), он не может быть недостаточен.

Я пишу не о языке, а о прикладных инструментах, которые обязательно потребуются для интеграции.
14. Александр Штин (Sanya1984) 89 10.01.17 11:37 Сейчас в теме
(11) Олег, напишите об этом шедевре, что-то не могу найти информацию в интернете, любопытно )
28. probot (Probot1c) 04.02.17 06:14 Сейчас в теме
(11)
то это будет так просто. Да, оно. Пиши, куда флешку прислать ))) Но там пасхалка Михалковым не заканчивается.


А приз всего лишь 1?
18. Павел Улитин (UPSoft) 80 12.01.17 14:58 Сейчас в теме
(9)
Матрица 5: Русский Мир,продюсер Никита Михалков

ничо не понял ГДЕ вы это разглядели?? О_О
19. Александр Штин (Sanya1984) 89 12.01.17 18:33 Сейчас в теме
(18) А вы внимательно посмотрите, там еще в роли Мелания Трамп есть )
21. Павел Улитин (UPSoft) 80 13.01.17 00:06 Сейчас в теме
(19)да куда глядеть-то?? Уже разгадали... ткине уже пальцем
20. Олег Пономаренко (O-Planet) 6713 12.01.17 18:55 Сейчас в теме
(18) В том и суть пасхалки, что ее не видно с первого взгляда ;)
10. Ivan Khorkov (vano-ekt) 1028 09.01.17 22:30 Сейчас в теме
чем встроенная платформенная json сериализация/десериализация не устраивает?
12. Василий Тёркин (1С_Мастер) 63 10.01.17 09:26 Сейчас в теме
Тем, что в платформе 8.2 ее нет ;)


А разве переход на актуальную платформу, пусть в режиме совместимости с 8.2, не будет проще, чем изобретение велосипеда?

16. Олег Пономаренко (O-Planet) 6713 10.01.17 13:33 Сейчас в теме
(12) Некоторые клиенты бывают против перехода на актуальную платформу. И потом, json, реализованный средствами php, мне кажется предпочтительнее, чем платформенный в 1С.
(13) Ну ничего не меняется на инфостарте! Вопросы те же в 2017, что и в 2006... Может, она и не лучше, а может, лучше. Но если не пытаться, то не будет разработок, проверенных годами. Второй вариант ответа: тем, что это - наша разработка.
(14) Думаю Н.Михалков вынашивает пока идею этого проекта и скоро сам расскажет все. Лишь бы пол не поменял потом...
JohnyDeath; +1 Ответить
17. Евгений Мартыненков (JohnyDeath) 290 10.01.17 16:09 Сейчас в теме
(16) пусть меняет. Никто особо и не расстроится )
22. Александр Штин (Sanya1984) 89 13.01.17 05:25 Сейчас в теме
Разгадка
23. Олег Пономаренко (O-Planet) 6713 13.01.17 08:50 Сейчас в теме
25. Артур Аюханов (artbear) 901 16.01.17 12:41 Сейчас в теме
Ну и плюс общая схема - 1С + веб-сервер + php - выглядит как-то сложновато :(
29. Котэ Пруидзе (kote) 470 20.02.17 11:09 Сейчас в теме
.. по моему скромному мнению - использование python - вместо php, и использование команд ОС и обмен через файл со скриптом - было бы практичнее, проще, быстрее и не менее "кроссплатформеннее" :)

К тому же - работа с файлом на стороне сервера - производительнее в разы, чем с вэбсервером (который может даже быть недоступен порой)

Всё ИМХО, конечно же

Оставьте свое сообщение