При обмене между разными базами, при обмене с сайтом удобно использовать 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
Для иллюстрации работы скрипта введите в строке браузера:
Прилагаемый архив
В прилагаемом архиве находятся:
- Тестовая конфигурация для обычного и управляемого приложения
- Обработка загрузки для обычного приложения
- Обработка загрузки для управляемого приложения
- Серверныйphp-скрипт для дешифровке json
- Тестовый пример jsonдля загрузки в тестовую конфигурацию
- Подробное описание XML-директив загрузки с примерами
Надеемся, что наши материалы помогут разработчикам в реализации их проектов. Будем рады ответить на ваши вопросы.
Если Вам требуется интеграция 1С с внешними ресурсами, разработка web-сервисов, мы готовы в рамках партнерства с Инфостарт обсудить и выполнить Ваш проект.
Коллектив ООО «О-Планет»
Это любой документ можно будет описать таким образом?
Плюсую. Пригодится. Интересно было бы сразу разбирать в дерево. Даже пример со скриншотов деревом бы лучше смотрелся.
О! Как раз хотел разобраться с этой темой!
Интересно, пасхалку кто-нибудь найдет? 🙂 Сразу скажу, это не «Обама, Путин, Коноплев»
(1) Любой документ, справочник. В планах добавить работу с регистрами сведений. А вообще это — более простая альтернатива типовых правил обмена. Ведь сгенерировать выгрузку и директивы для переноса данных в идентичную конфигурацию вообще не сложно.
(4) магия по ссылкеhttp://www.o-planet.ru/ex/jsonparse.php считается?
(6) не… )
Кроме пары пропущенных пробелов- ничего не видно 🙂
Наверное нет, но все же: Матрица 5: Русский Мир,продюсер Никита Михалков, оно?
чем встроенная платформенная json сериализация/десериализация не устраивает?
(9) Ааа!!! Я не думал, что это будет так просто. Да, оно. Пиши, куда флешку прислать ))) Но там пасхалка Михалковым не заканчивается. Он интересный актерский состав пригласил на этот шедевр …
(10) Тем, что в платформе 8.2 ее нет 😉
А разве переход на актуальную платформу, пусть в режиме совместимости с 8.2, не будет проще, чем изобретение велосипеда?
(11) В таком случае, чем Ваша разработка лучше проверенной годамиhttp://infostart.ru/public/119601/ ?
(11) Олег, напишите об этом шедевре, что-то не могу найти информацию в интернете, любопытно )
(13) Там не было пасхалки)
(12) Некоторые клиенты бывают против перехода на актуальную платформу. И потом, json, реализованный средствами php, мне кажется предпочтительнее, чем платформенный в 1С.
(13) Ну ничего не меняется на инфостарте! Вопросы те же в 2017, что и в 2006… Может, она и не лучше, а может, лучше. Но если не пытаться, то не будет разработок, проверенных годами. Второй вариант ответа: тем, что это — наша разработка.
(14) Думаю Н.Михалков вынашивает пока идею этого проекта и скоро сам расскажет все. Лишь бы пол не поменял потом…
(16) пусть меняет. Никто особо и не расстроится )
(9)
ничо не понял ГДЕ вы это разглядели?? О_О
(18) А вы внимательно посмотрите, там еще в роли Мелания Трамп есть )
(18) В том и суть пасхалки, что ее не видно с первого взгляда 😉
(19)да куда глядеть-то?? Уже разгадали… ткине уже пальцем
Аааа!!! Зачем спалил!!! 😀
Поддержу (13)
http://infostart.ru/public/119601/ очень полезна, т.к. выполняет свою одну, единственную задачу — разбирает json и получает выходные данные.
ИМХО
А в текущей обработке идет смешивание разных задач:
+ разбор json
+ интеграция/конвертация данных
В процессе интеграции наверняка выяснится, что недостаточно возможностей указанного dsl-языка для обработки всех нужд интеграции, и нужно будет как-то встраиваться в указанный dsl-код и добавлять код 1С 🙁
в итоге будет вырождение в ту самую КД 🙂
и придется выполнять постоянные допилки.
DSL — Предметно-ориентированный язык — англ. Domain-specific language
ИМХО микросервисы рулят, да и принцип единой ответственности никто не отменял.
ЗЫ кстати, я плюсанул разработку, т.к. согласен, что чем больше разработок на тему, тем лучше.
Ну и плюс общая схема — 1С + веб-сервер + php — выглядит как-то сложновато 🙁
(24) Язык на уровне васика (basic), он не может быть недостаточен. При переносе доков уже столкнулись с тем, что нужно вызывать разные «ПриИзмененииНоменклатуры», когда данных не достаточно. Думаю, как это сделать универсальным. А что касается смешивания технологий, так это плюс. На стыке технологий и рождаются интересные решения.
(26) >Язык на уровне васика (basic), он не может быть недостаточен.
Я пишу не о языке, а о прикладных инструментах, которые обязательно потребуются для интеграции.
(11)
А приз всего лишь 1?
.. по моему скромному мнению — использование python — вместо php, и использование команд ОС и обмен через файл со скриптом — было бы практичнее, проще, быстрее и не менее «кроссплатформеннее» 🙂
К тому же — работа с файлом на стороне сервера — производительнее в разы, чем с вэбсервером (который может даже быть недоступен порой)
Всё ИМХО, конечно же