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 А тому, кто первым найдет в этой статье пасхалку — наш маленький приз!

29 Comments

  1. ЕленаГр

    Это любой документ можно будет описать таким образом?

    Reply
  2. Амарис

    Плюсую. Пригодится. Интересно было бы сразу разбирать в дерево. Даже пример со скриншотов деревом бы лучше смотрелся.

    Reply
  3. jhfrek

    О! Как раз хотел разобраться с этой темой!

    Reply
  4. O-Planet

    Интересно, пасхалку кто-нибудь найдет? 🙂 Сразу скажу, это не «Обама, Путин, Коноплев»

    Reply
  5. O-Planet

    (1) Любой документ, справочник. В планах добавить работу с регистрами сведений. А вообще это — более простая альтернатива типовых правил обмена. Ведь сгенерировать выгрузку и директивы для переноса данных в идентичную конфигурацию вообще не сложно.

    Reply
  6. Paradise.87

    (4) магия по ссылке http://www.o-planet.ru/ex/jsonparse.php считается?

    Reply
  7. O-Planet

    (6) не… )

    Reply
  8. kembrik

    Кроме пары пропущенных пробелов- ничего не видно 🙂

    Reply
  9. Sanya1984

    Наверное нет, но все же: Матрица 5: Русский Мир,продюсер Никита Михалков, оно?

    Reply
  10. vano-ekt

    чем встроенная платформенная json сериализация/десериализация не устраивает?

    Reply
  11. O-Planet

    (9) Ааа!!! Я не думал, что это будет так просто. Да, оно. Пиши, куда флешку прислать ))) Но там пасхалка Михалковым не заканчивается. Он интересный актерский состав пригласил на этот шедевр …

    (10) Тем, что в платформе 8.2 ее нет 😉

    Reply
  12. 1С_Мастер
    Тем, что в платформе 8.2 ее нет 😉

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

    Reply
  13. VitaliyCeban

    (11) В таком случае, чем Ваша разработка лучше проверенной годами http://infostart.ru/public/119601/ ?

    Reply
  14. Sanya1984

    (11) Олег, напишите об этом шедевре, что-то не могу найти информацию в интернете, любопытно )

    Reply
  15. kostik_love

    (13) Там не было пасхалки)

    Reply
  16. O-Planet

    (12) Некоторые клиенты бывают против перехода на актуальную платформу. И потом, json, реализованный средствами php, мне кажется предпочтительнее, чем платформенный в 1С.

    (13) Ну ничего не меняется на инфостарте! Вопросы те же в 2017, что и в 2006… Может, она и не лучше, а может, лучше. Но если не пытаться, то не будет разработок, проверенных годами. Второй вариант ответа: тем, что это — наша разработка.

    (14) Думаю Н.Михалков вынашивает пока идею этого проекта и скоро сам расскажет все. Лишь бы пол не поменял потом…

    Reply
  17. JohnyDeath

    (16) пусть меняет. Никто особо и не расстроится )

    Reply
  18. UPSoft

    (9)

    Матрица 5: Русский Мир,продюсер Никита Михалков

    ничо не понял ГДЕ вы это разглядели?? О_О

    Reply
  19. Sanya1984

    (18) А вы внимательно посмотрите, там еще в роли Мелания Трамп есть )

    Reply
  20. O-Planet

    (18) В том и суть пасхалки, что ее не видно с первого взгляда 😉

    Reply
  21. UPSoft

    (19)да куда глядеть-то?? Уже разгадали… ткине уже пальцем

    Reply
  22. Sanya1984
    Разгадка
    Reply
  23. O-Planet

    Аааа!!! Зачем спалил!!! 😀

    Reply
  24. artbear

    Поддержу (13)

    ИМХО http://infostart.ru/public/119601/ очень полезна, т.к. выполняет свою одну, единственную задачу — разбирает json и получает выходные данные.

    А в текущей обработке идет смешивание разных задач:

    + разбор json

    + интеграция/конвертация данных

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

    в итоге будет вырождение в ту самую КД 🙂

    и придется выполнять постоянные допилки.

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

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

    ЗЫ кстати, я плюсанул разработку, т.к. согласен, что чем больше разработок на тему, тем лучше.

    Reply
  25. artbear

    Ну и плюс общая схема — 1С + веб-сервер + php — выглядит как-то сложновато 🙁

    Reply
  26. O-Planet

    (24) Язык на уровне васика (basic), он не может быть недостаточен. При переносе доков уже столкнулись с тем, что нужно вызывать разные «ПриИзмененииНоменклатуры», когда данных не достаточно. Думаю, как это сделать универсальным. А что касается смешивания технологий, так это плюс. На стыке технологий и рождаются интересные решения.

    Reply
  27. artbear

    (26) >Язык на уровне васика (basic), он не может быть недостаточен.

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

    Reply
  28. Probot1c

    (11)

    то это будет так просто. Да, оно. Пиши, куда флешку прислать ))) Но там пасхалка Михалковым не заканчивается.

    А приз всего лишь 1?

    Reply
  29. kote

    .. по моему скромному мнению — использование python — вместо php, и использование команд ОС и обмен через файл со скриптом — было бы практичнее, проще, быстрее и не менее «кроссплатформеннее» 🙂

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

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

    Reply

Leave a Comment

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