Преобразовать в json в 1с
Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
В платформе с версии 8.3.6:
Потоковое чтение и запись JSON:
Объекты потоковой работы - это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
Результат такой записи:
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
Подробнее вы можете посмотреть здесь
В платформе с версии 8.3.7:
Полностью автоматизировали работу с JSON и реализовали в платформе третью группу средств. Они позволяют сериализовать в JSON прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация. Конечно же, мы обеспечили и обратную операцию - десериализацию. Зачем это нужно!?
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее здесь
ДО платформы версии 8.3.6, т.е. 8.3.5 и ниже:
На HelpF уже есть статья где описан пример: Работа с форматом JSON в 1С но не приведены функции, вот они:
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Существует несколько основных сценариев использования JSON.В платформе реализовано несколько слоёв работы с JSON. Самые простые и гибкие — это низкоуровневые средства потоковой записи и чтения. Более высокоуровневые и не такие универсальные — средства сериализации в JSON примитивных типов и коллекций 1С:Предприятия. И, наконец, третий слой это средства, позволяющие сериализовать/десериализовать прикладные типы 1С:Предприятия: ссылки, объекты, наборы записей и вообще любые типы, для которых поддерживается XDTO сериализация.
Потоковое чтение и запись JSON
Объекты потоковой работы последовательно читают данные в формате JSON из файла или строки, или последовательно записывают их в файл или строку. Таким образом, чтение и запись данных происходят без формирования всего документа в памяти.
Потоковая запись JSON может выглядеть следующим образом. Записывается массив из четырёх элементов. Три из них примитивного типа, а четвёртый элемент — это объект с двумя свойствами:
Результат такой записи:
Сериализация примитивных типов и коллекций
Вторая группа средств работы с JSON хороша тем, что избавляет от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Пример сериализации (записи) в JSON может выглядеть так:
Сериализация прикладных типов 1С:Предприятия
Прежде всего, и в основном, XDTO сериализацию в JSON рекомендуется использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. Также этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия.
Простейший код, выполняющий сериализацию элемента справочника, может выглядеть так:
В результате будет получен файл JSON следующего содержания:
Функции преобразования и восстановления при сериализации
Не всегда сериализация может быть выполнена полностью автоматически. В жизни встречаются самые разные ситуации. Поэтому существует возможность использовать «самописную» функцию обработки значений при записи в JSON и при чтении из JSON.
При записи в JSON эта функция полезна потому, что позволяет самостоятельно преобразовать в JSON те типы, которые не подлежат автоматическому преобразованию. Или даже совсем отказаться от их сериализации.
При чтении из JSON функция восстановления может использоваться для того, чтобы преобразовать данные JSON в типы 1С, которые не могут являться результатом автоматического преобразования, или для того, чтобы самостоятельно (не автоматически) преобразовать даты JSON в даты 1С:Предприятия.
Во процессе десереализации прикладных типов 1С:Предприятия функция восстановления может потребоваться, например, для того, чтобы при переносе данных из одного прикладного решения в другое, заменить в них ссылки на связанные объекты. Так, чтобы после переноса эти данные ссылались уже на объекты новой базы. Или, например, для того, чтобы удалить из данных информацию, имеющую смысл только в исходной базе.
Автоматически генерируемый REST интерфейс прикладных решений
При обращении к REST интерфейсу прикладного решения можно получать ответ в формате JSON. Есть возможность управлять объёмом передаваемой информации за счёт изменения детальности представления метаданных в выгрузке. Существуют три уровня: минимальный, средний и максимальный. Однако при этом нужно учитывать, что сокращение объёма передаваемой информации приводит к более интенсивным вычислениям на клиенте. И наоборот, когда вся информация включается в выгрузку, объём вычислений на клиенте будет минимальным.
Формат JSON легко читается. Пример текстового файла в формате JSON:
"ОсновнойПоставщик" : "c8d578e9-9f33-11eb-80ad-364b50b7ef2d"Как правило JSON используется для обмена данными в веб-приложениях. Однако его можно применять и для обмена данными между двумя базами 1С.
JSON может включать в себя следующие элементы:
- Объект
- Строка
- Число
- Литералы: true, false, null
- Массив
Объект
Значением может быть любой тип:
- Другой JSON-объект
- Массив
- Строка
- Число
- Литералы: true, false, null
В данном примере три ключа:
- ЭтоКлюч
- ЭтоТожеКлюч
- ЭтоВложенныйОбъект
Строка и число
Литералы
В качестве литералов могут использоваться:
Массив
Значения массива могут быть любого типа: строки, числа, литералы, объекты и даже другие массивы:
ЗаписатьJSON
Чтобы записать данные в формате JSON из 1с нужно:
- Создать программный объект ЗаписьJSON
- Вызвать у него метод ОткрытьФайл, передав параметром путь к файлу, куда будут записаны данные в формате JSON
- С помощью метода глобального контекста ЗаписатьJSON выполнить сериализацию. Параметрами нужно передать созданный объект ЗаписьJSON и сами данные
- Закрыть ЗаписьJSON методом Закрыть
Соответствие между типами 1С и типами JSON:
Тип 1С | Тип JSON |
---|---|
Строка | Строка |
Число | Число |
Булево | true или false |
Дата | Строка |
Неопределено | null |
Массив | JSON-массив |
Фиксированный массив | JSON-массив |
Структура | JSON-объект |
Фиксированная структура | JSON-объект |
Соответствие | JSON-объект |
Фиксированное соответствие | JSON-объект |
Ключ соответствия и фиксированного соответствия может быть только строковым.
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON ( ПереносСтрокJSON . Авто , Символы . Таб ) ; Запись . ОткрытьФайл ( "F:\test.json" , , , ПараметрыЗаписиJSON ) ; ФиксСтруктура = Новый ФиксированнаяСтруктура ( Структура ) ; ФиксСоответствие = Новый ФиксированноеСоответствие ( Соответствие ) ;В результате файл будет содержать следующие данные:
В коде была использована строка:
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON ( ПереносСтрокJSON . Авто , Символы . Таб ) ;Здесь указывается, что при записи JSON нужно использовать перенос строк (первый параметр) и символ табуляции как отступ для каждого элемента JSON (второй параметр). Это нужно чтобы файл с JSON был более читаемым. Если указать первым параметром ПереносСтрокJSON.Нет, то JSON будет записан в одну строку.
Запись массива как JSON-объект
По умолчанию массив сериализуется в JSON-массив. Но в метод ЗаписатьJSON третьим параметром можно передать настройки сериализации JSON, где указать, что массивы нужно записывать как объекты. Ключом будет индекс элемента массива.
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON ( ПереносСтрокJSON . Авто , Символы . Таб ) ; Запись . ОткрытьФайл ( "F:\test.json" , , , ПараметрыЗаписиJSON ) ; Настройки . СериализовыватьМассивыКакОбъекты = Истина;Сериализация таблицы значений в JSON
Таблица значений является одной из часто используемых коллекций в 1С, но для нее нет автоматической сериализации в JSON. Для сериализации можно преобразовать таблицу в массив структур, а массив сериализовать в JSON:
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON ( ПереносСтрокJSON . Авто , Символы . Таб ) ; Запись . ОткрытьФайл ( "F:\test.json" , , , ПараметрыЗаписиJSON ) ;ПрочитатьJSON
Для чтения JSON файла используется программный объект ЧтениеJSON и метод ПрочитатьJSON:
- Создается программный объект ЧтениеJSON
- Методом ОткрытьФайл выполняется открытие файла с JSON
- Методом глобального контекста ПрочитатьJSON выполняется десериализация JSON
- Объект ЧтениеJSON закрывается методом Закрыть
Десериализация из JSON в типы 1С выполняется по следующим правилам:
Тип JSON | Тип 1С |
---|---|
Число | Число |
Строка | Строка |
true | Истина |
false | Ложь |
null | Неопределено |
JSON-объект | Структура или соответствие |
JSON-массив | Массив |
В результате в переменной Данные будет структура со следующим содержимым:
Чтение JSON в соответствие
Сейчас все JSON-объекты были прочитаны в структуру. Даже те, которые изначально были сериализованы из соответствия. Однако, в отличии от структуры, в ключах JSON-объектов могут быть пробелы или другие символы, которые нельзя использовать в ключах структуры. Например, если бы соответствие было записано так:
Чтобы прочитать такой JSON нужно в метод ПрочитатьJSON передать вторым параметром Истина. Тогда чтение всех JSON-объектов будет выполнено в соответствие:
В результате в переменной Данные будет соответствие со следующим содержимым:
Сериализация даты в JSON
Формат даты
При сериализации в JSON дата записывается как строка. При чтении тоже будет прочитана как строка, что не совсем удобно. Чтобы свойство с датой было прочитано как дата нужно в методе ПрочитатьJSON третьим параметром указать список имен свойств, которые должны быть прочитаны как дата. А четвертым параметром указать формат даты, в котором дата была записана в JSON. По умолчанию платформа 1С пишет дату в JSON в формате ISO.
//через запятую нужно перечислить список имен свойств, которые будут прочитаны как дата Данные = ПрочитатьJSON ( ЧтениеJSON , , ИменаСвойствСДатой , ФорматДатыJSON . ISO ) ;В результате свойство Дата будет прочитано как дата:
Платформа 1С может записывать дату в JSON в трех форматах:
Формат ISO используется по умолчанию. Для записи в формате JavaScript или Microsoft нужно явно указать это. При этом форматы JavaScript и Microsoft могут быть записаны только в варианте даты UTC (универсальная дата).
Например, запись в формате JavaScript:
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON ( ПереносСтрокJSON . Авто , Символы . Таб ) ; Запись . ОткрытьФайл ( "F:\test.json" , , , ПараметрыЗаписиJSON ) ; Данные . Вставить ( "СвойствоСДатой" , Дата ( 2021 , 6 , 3 , 15 , 0 , 0 ) ) ; //в настройках нужно указать формат даты и вариант записи даты НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON ; НастройкиСериализацииJSON . ФорматСериализацииДаты = ФорматДатыJSON . JavaScript ; НастройкиСериализацииJSON . ВариантЗаписиДаты = ВариантЗаписиДатыJSON . УниверсальнаяДата ; ЗаписатьJSON ( Запись , Данные , НастройкиСериализацииJSON ) ;При чтении также нужно указать формат JavaScript:
//через запятую нужно перечислить список имен свойств, которые будут прочитаны как дата Данные = ПрочитатьJSON ( ЧтениеJSON , , ИменаСвойствСДатой , ФорматДатыJSON . JavaScript ) ;Для записи в формате Microsoft нужно указать ФорматСериализацииДаты = Microsoft:
НастройкиСериализацииJSON . ФорматСериализацииДаты = ФорматДатыJSON . Microsoft ;И то же самое при чтении JSON:
Данные = ПрочитатьJSON ( ЧтениеJSON , , ИменаСвойствСДатой , ФорматДатыJSON . Microsoft ) ;Для формата ISO дату можно записать в трех вариантах:
- Локальная дата (без часового пояса)
- Локальная дата со смещением (относительно UTC)
- UTC (универсальная дата)
Локальная дата со смещением:
НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON ; НастройкиСериализацииJSON . ФорматСериализацииДаты = ФорматДатыJSON . ISO ; НастройкиСериализацииJSON . ВариантЗаписиДаты = ВариантЗаписиДатыJSON . ЛокальнаяДатаСоСмещением ; НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON ; НастройкиСериализацииJSON . ФорматСериализацииДаты = ФорматДатыJSON . ISO ; НастройкиСериализацииJSON . ВариантЗаписиДаты = ВариантЗаписиДатыJSON . УниверсальнаяДата ;ПрочитатьДатуJSON
Другой способ чтения даты из JSON это использование метода ПрочитатьДатуJSON. Сначала читаем JSON методом ПрочитатьJSON, а свойства с типом дата дополнительно читаем методом ПрочитатьДатуJSON. Первым параметром передается строковое представление даты, вторым формат даты. Результатом выполнения функции будет значение с типом дата:
Дата = ПрочитатьДатуJSON ( Формат ( Данные . СвойствоСДатой , "ЧГ=0" ) , ФорматДатыJSON . ISO ) ;Функции преобразования и восстановления
Функция преобразования
Для возможности выгрузки данных прикладных типов 1С можно использовать функцию преобразования. Данная функция указывается в методе ЗаписатьJSON четвертым параметром. Она должна быть экспортной. Пятым параметром указывается где находится данная функция (если в этом же модуле, то нужно указать ЭтотОбъект). Шестым параметром можно указать произвольные дополнительные данные, которые будут переданы в функцию преобразования. Данная функция будет вызвана для тех типов, которые по умолчанию не сериализуются в JSON. Функция вызывается для всех свойств, включая вложенные свойства, а также для элементов массива.
Например, выгрузим контрагента, у которого в реквизите ДатаРегистрации содержится дата, в реквизите ОсновнойДоговор ссылка на справочник Договоры, а в табличной части список контактных лиц. Причем одно контактное лицо указано строкой, а второе ссылкой на справочник Контактные лица:
При обмене данными с веб-сайтами зачастую используется формат JSON. К сожалению, в 1С нет стандартных процедур для работы с данным форматом. В процессе реализации одного из проектов мной был разработан ряд процедур и функций облегчающих жизнь программисту 1С при работе с данными в формате JSON.
По сути, при работе с JSON требуется две операции: сформировать строку JSON (например, для передачи параметров на веб-сервер в формате JSON из 1С) и прочитать данные из строки JSON (например, когда мы получаем ответ от веб-сервера в формат JSON). Так как формат JSON в упрощенном виде представляет собой набор параметров в виде <ИмяПараметра>:<ЗначениеПараметра> то для работы с JSON в 1С мной был использован тип "Структура". Т.е. процедура чтения данных из формата JSON преобразует строку JSON в тип 1С "Структура". Так же и строка JSON в 1С формируется из структуры. Т.о. чтобы сформировать строку JSON сначала необходимо заполнить структуру необходимыми значениями, а потом вызвать функцию, преобразующую структуру в JSON. Позднее функционал функции формирования строки JSON был расширен - теперь в JSON может быть преобразован массив и таблица значений. При желании можно доработать функцию так, чтобы она "понимала" и другие типы. Такие как "Cоответствие", "ДеревоЗначений" и др. На практике это редко может пригодиться, поэтому сам я этого делать не стал.
А теперь подробней о том, как работать с функциями преобразования JSON.
Преобразование строки JSON в структуру 1С.
Для преобразования строки JSON в структуру 1С служит функция ЗаполнитьСтруктуруИзJSON().
Код 1C v 8.х
<ТекстJSON> (обязательный) - строка в формате JSON,
которую необходимо преобразовать в структуру.
Возвращаемое значение.
Тип Структура.
Имя значения задается в структуре как Ключ, а само значение, соответственно, как значение. Поддерживаются также вложенные значение ("<>" в "<>") и массивы. В таких случаях тип значения будет Структура и Массив соответственно. Если у в JSON задан только массив, то сформируется структура с одним элементом с ключом "Значение" и типом "Массив". Ниже приведены поясняющие примеры:
Код 1C v 8.х
Следует заметить, что все значения заполняются как строковые (тип "Строка"). Последующее преобразование (например, к числу) лежит на самом разработчике.
Формирование строки JSON в 1С.
Для формирования строки в формате JSON в 1С предназначена функция СформироватьСтрокуJSON().
Код 1C v 8.х
<Объект> (обязательный) - объект, который необходимо
преобразовать в формат JSON. Может иметь тип "Структура",
"Массив" или "ТаблицаЗначений".
Если Объект имеет тип "ТаблицаЗначений", то она рассматривается как массив из структур, соответствующих колонкам ТЗ. Все значения приводятся к строковому типу, дата приводится в формат unixtime, значение типа булево "Истина" преобразуется в строку "true", а "Ложь" - в "false, прочие объекты просто преобразуются как "Строка(Объект)".
Ниже приведены поясняющие примеры.
Код 1C v 8.х
Автор: Павел Толкачев
При обмене данными с веб-сайтами зачастую используется формат JSON. К сожалению, в 1С нет стандартных процедур для работы с данным форматом. В процессе реализации одного из проектов мной был разработан ряд процедур и функций облегчающих жизнь программисту 1С при работе с данными в формате JSON.
По сути, при работе с JSON требуется две операции: сформировать строку JSON (например, для передачи параметров на веб-сервер в формате JSON из 1С) и прочитать данные из строки JSON (например, когда мы получаем ответ от веб-сервера в формат JSON). Так как формат JSON в упрощенном виде представляет собой набор параметров в виде <ИмяПараметра>:<ЗначениеПараметра> то для работы с JSON в 1С мной был использован тип "Структура". Т.е. процедура чтения данных из формата JSON преобразует строку JSON в тип 1С "Структура". Так же и строка JSON в 1С формируется из структуры. Т.о. чтобы сформировать строку JSON сначала необходимо заполнить структуру необходимыми значениями, а потом вызвать функцию, преобразующую структуру в JSON. Позднее функционал функции формирования строки JSON был расширен - теперь в JSON может быть преобразован массив и таблица значений. При желании можно доработать функцию так, чтобы она "понимала" и другие типы. Такие как "Cоответствие", "ДеревоЗначений" и др. На практике это редко может пригодиться, поэтому сам я этого делать не стал.
А теперь подробней о том, как работать с функциями преобразования JSON.
Преобразование строки JSON в структуру 1С.
Для преобразования строки JSON в структуру 1С служит функция ЗаполнитьСтруктуруИзJSON().
Код 1C v 8.х
<ТекстJSON> (обязательный) - строка в формате JSON,
которую необходимо преобразовать в структуру.
Возвращаемое значение.
Тип Структура.
Имя значения задается в структуре как Ключ, а само значение, соответственно, как значение. Поддерживаются также вложенные значение ("<>" в "<>") и массивы. В таких случаях тип значения будет Структура и Массив соответственно. Если у в JSON задан только массив, то сформируется структура с одним элементом с ключом "Значение" и типом "Массив". Ниже приведены поясняющие примеры:
Код 1C v 8.х
Следует заметить, что все значения заполняются как строковые (тип "Строка"). Последующее преобразование (например, к числу) лежит на самом разработчике.
Формирование строки JSON в 1С.
Для формирования строки в формате JSON в 1С предназначена функция СформироватьСтрокуJSON().
Код 1C v 8.х
<Объект> (обязательный) - объект, который необходимо
преобразовать в формат JSON. Может иметь тип "Структура",
"Массив" или "ТаблицаЗначений".
Если Объект имеет тип "ТаблицаЗначений", то она рассматривается как массив из структур, соответствующих колонкам ТЗ. Все значения приводятся к строковому типу, дата приводится в формат unixtime, значение типа булево "Истина" преобразуется в строку "true", а "Ложь" - в "false, прочие объекты просто преобразуются как "Строка(Объект)".
Ниже приведены поясняющие примеры.
Код 1C v 8.х
Автор: Павел Толкачев
Читайте также: