При обмене между разными базами, при обмене с сайтом удобно использовать 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-сервисов, мы готовы в рамках партнерства с Инфостарт обсудить и выполнить Ваш проект.
Коллектив ООО "О-Планет"