Недопустимое состояние потока записи json 1с как исправить

Не читается json
   mikecool

11.07.19 — 16:38

Продолжение эпопеи

Получил json, пробую читать

ПрочитатьJSON(Чтение, Истина);

получаю «Недопустимое состояние потока записи JSON»

так понимаю, такой файл только как текст парсить?

есть примеры таких парсеров?

   butterbean

1 — 11.07.19 — 16:39

сначала проверь, что именно json получил

   novichok79

2 — 11.07.19 — 16:41

   Вафель

3 — 11.07.19 — 16:41

проверь корректность
https://jsonlint.com

   novichok79

4 — 11.07.19 — 16:42

   novichok79

5 — 11.07.19 — 16:44

Ошибка «Недопустимое состояние потока записи JSON» 1С 8.3

Указанная в заголовке ошибка возникает, в момент вызова метода ПрочитатьJSON, если ранее параметр типа ЧтениеJSON, был инициализирован пустой строкой.

   mikecool

6 — 11.07.19 — 16:44

сейчас проверю

(1) в ответ тип json приходит

   mikecool

7 — 11.07.19 — 16:44

(5) о как, тоже проверю

   Garykom

8 — 11.07.19 — 16:48

Над простейшей задачкой которая решается спецом за пару часов возиться несколько дней?

   ДенисЧ

9 — 11.07.19 — 16:49

(8) Так то спецом решается… А тут очевидно, что учётку угнали…

   mikecool

10 — 11.07.19 — 16:49

(8) ))) я же первый раз в таком болоте

и занимаюсь ей не все время, так только — по возможности

не ругайся )

   mikecool

11 — 11.07.19 — 16:50

(9) я тебя тоже люблю, тебя все любят )))

   mikecool

12 — 11.07.19 — 16:52

(5) не, чтение вроде не с пустой строкой, Прочитать() у него истина

   ДенисЧ

13 — 11.07.19 — 16:53

(12) Ты сказал свежему чтению прочитать, а потом делаешь ПрочитатьJSON()? Ну и кто тебе после этого доктор?

   Kigo_Kigo

14 — 11.07.19 — 16:58

Посмотри отладчиком, что тебе в том json пришло, у меня было подобное, когда сервер вместо json  какую то ошибку выплевывал и кракозыбры

   mikecool

15 — 11.07.19 — 16:59

(13) ты как всегда в корень попал )))

   mikecool

16 — 11.07.19 — 16:59

(14) ошибки то я отлавливаю

   mikecool

17 — 11.07.19 — 16:59

всем спасибо, получилось ))

   ДенисЧ

18 — 11.07.19 — 17:00

(16) Дык я сегодня целы день с ним вожусь… 36метровые ответы разбираю )))

   mikecool

19 — 11.07.19 — 17:02

(18) у меня поменьше, всего 750 Кб )

   mikecool

20 — 11.07.19 — 18:28

отчего могут теряться «теги» при чтении?

читаю в соответствие, «строки» — массив соответствий в одном из ключей

в каждое из массива захожу и не нахожу первых двух «тегов», которые присутствуют в файле

куда теряются?

также непонятно — какой «тег» я считываю, результат Соответствие, а как он «зовется» — нет информации

   mikecool

21 — 11.07.19 — 18:30

пример:

   mikecool

22 — 11.07.19 — 18:30

«results»:[ — массив соответствий

      {

         «StringsRes»:[ — это отдельное соответствие, что это «StringsRes» информации нет

            {

               «id»:»b8954aa7-64ac-43f7-80d4-0daa92aca109″, — нет этого тега

               «seals»:[ — нет этой коллекции

               ],

               «internalId»:»00ddc2d2-b6bb-4a7f-a96c-cf17d5389c8f», -это и далее есть

   mikecool

23 — 11.07.19 — 21:32

вечерний подъем

   mikecool

24 — 11.07.19 — 21:59

нашел потерю )) слишком много свойств, потерялось среди них

  

ПростоГен

25 — 12.07.19 — 06:02

Ну зачем так мучиться, есть же готовая библиотека http://catalog.mista.ru/public/709325/, там всё это реализовано.

получаю ответ на запрос.
Ответ приходит в виде Json

так вот при выполнении кода:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПутьКФайлу);
Ответ=ПрочитатьJSON(ЧтениеJSON);

Выдет ошибку:
<ВнешняяОбработка.ЭкспериментыJSON.Форма.Форма.Форма(67)>: Ошибка при вызове метода контекста (ПрочитатьJSON)
Ответ=ПрочитатьJSON(ЧтениеJSON);
по причине:
Недопустимое имя свойства: ‘800’ для чтения JSON в объект Структура

Подскажите как быть?

Формат ваших данных не соответствует стандарту JSON. Ключ должен быть строкой и 1с тут ни при чем.

Далее в стандарте (стр. 2) спецификация объекта JSON:

Недопустимое состояние потока записи json 1с как исправить

Глобальный контекст.ПрочитатьJSON (Global context.ReadJSON)
Глобальный контекст (Global context)
ПрочитатьJSON (ReadJSON)
Синтаксис:

Тут вот какая «петрушка». Получается как с программами переводчиками: переводишь слово на английский, и тут же полученное значение пытаешься перевести обратно на русский и получаешь совершенно другой результат.
Выгружаю пакет XDTO в JSON и пытаюсь его тут же прочитать в структуру и появляется ошибка «недопустимое имя свойства #value». Я понимаю, что это означает и, в результате, вынужден «читать» JSON в соответствие, но вот правильно ли это?
Запись пакета XDTO в JSON:
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру=Истина;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Unix);
Запись.УстановитьСтроку(ПараметрыЗаписи);
ФабрикаXDTO.ЗаписатьJSON(Запись, МойОбъектXDTO);
ДанныеJSON = Запись.Закрыть();

И ту же пытаюсь прочитать его в структуру
обЧтениеJSON = Новый ЧтениеJSON;
обЧтениеJSON.УстановитьСтроку(ДанныеJSON );
стСтруктураСхемы = ПрочитатьJSON(обЧтениеJSON);
и тут же получаем сообщение об ошибке «недопустимое имя свойства #value». Ну, все, поворчал, пошел работать дальше.

Источник

не могу прочитать json 🙁

HTTP ответ нужно прочитать в структуру. Код состояния 200, все норм.

На ПрочитатьJSON(ЧтениеJSON) Ошибка при вызове метода контекста (ПрочитатьJSON). Что не так не пойму. перечитала синтакс помощник раз 10 уже, даже если пустую строку «<>» дать, то ошибка контекста. Вызывается в общем модуле с галками клиент, сервер, внешнее соединение.

//Разбираем ответ
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

Попытка
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON);
Исключение
Сообщить(«1»);
КонецПопытки;

В СтрJSON получается
<

Параметры:
(обязательный)
Тип: ЧтениеJSON.
Тип: Булево.
Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие.
Если установлено Ложь, объекты будут считываться в объект типа Структура.

(17) что-то туплю.. а как записать HTTPОтвет в файл?

(21) все равно валится с Недопустимое состояние потока записи JSON. видимо в строке серьезные косяки для 1с

(28) какая-то странная фигня происходит..

в общем если поставить одну точку останова на Сообщить(«5 все ок») или Сообщить(«5») то до нее доходит без ошибок, читает в соответствие, и ссылки со слешами верно читает, только дата в виде строки в итоге «2020-05-14T09:34:23+03:00»
в структуру не читает, т.к. есть такое вот в строке «. «edit.originator»:true. » ну а в структуре нельзя точку в заголовок, ок, допустим, пусть соответствие.

но если поставить точку останова где-то до попытки и идти пошагово, то вываливается на ПрочитатьJSON в исключение.

Источник

Заметки из Зазеркалья

Реализовано в версии 8.3.6.1977.

JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.

Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.

Мы видим несколько основных сценариев использования JSON.

Во-первых, это интеграция с внешними системами через их HTTP интерфейсы: Google Calendar, Salesforce.com, REST интерфейс 1С:Предприятия, SharePoint и т.д.

Во-вторых, это организация собственного HTTP интерфейса прикладного решения.

В-третьих, обмен файлами JSON с внешними системами. Формирование конфигурационных, настроечных файлов. Использование их в процедурах обмена данными, например, с интернет-магазинами.

В-четвертых, это использование файлов JSON для обмена данными между разными приложениями 1С:Предприятия.

Потоковое чтение и запись JSON

В качестве иллюстрации потокового чтения JSON можно привести следующий пример:

Недопустимое состояние потока записи json 1с как исправить

При записи JSON вы самостоятельно формируете его структуру. Чтобы «подстраховать» вас от ошибок, объект ЗаписьJSON автоматически проверяет правильность записываемой структуры. Для увеличения скорости работы эту проверку можно отключить. В примере ниже это строка:

Недопустимое состояние потока записи json 1с как исправить

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

Недопустимое состояние потока записи json 1с как исправить

Недопустимое состояние потока записи json 1с как исправить

Результат такой записи:

Сериализация примитивных типов и коллекций в JSON

Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.

Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.

Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.

В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:

Код 1С:Предприятия, выполняющий десериализацию, может выглядеть следующим образом:

Недопустимое состояние потока записи json 1с как исправить

А пример сериализации (записи) в JSON может выглядеть так:

Недопустимое состояние потока записи json 1с как исправить

Функции преобразования и восстановления при сериализации

Не всегда сериализация может быть выполнена полностью автоматически. В жизни встречаются самые разные ситуации. Поэтому мы добавили возможность использовать «самописную» функцию обработки значений при записи в JSON и при чтении из JSON.

В методе ЗаписатьJSON() она называется Функция преобразования и описывается с помощью трёх параметров:

В методе ПрочитатьJSON() она называется Функция восстановления и для неё есть аналогичные параметры:

При записи в JSON эта функция полезна потому, что позволяет самостоятельно преобразовать в JSON те типы, которые не подлежат автоматическому преобразованию. Или даже совсем отказаться от их сериализации.

Недопустимое состояние потока записи json 1с как исправить

Результат выполнения примера:

При чтении из JSON функция восстановления может использоваться для того, чтобы преобразовать данные JSON в типы 1С, которые не могут являться результатом автоматического преобразования, или для того, чтобы самостоятельно (не автоматически) преобразовать даты JSON в даты 1С:Предприятия.

Сериализация типа Дата

Данные типа Дата сериализуются в JSON автоматически, а вот обратное преобразование (десериализация) может быть выполнено не всегда. JSON не содержит типа Дата, значения даты представляются в нём строкой. Конечно, существуют некоторые форматы представления дат, но вообще говоря, внешний вид такой строки может быть самым разнообразным.

Для сериализации типа Дата в JSON у метода ЗаписатьJSON() вы можете использовать параметр НастройкиСериализации. Это объект встроенного языка, который позволяет указать, в каком варианте будет записана дата (UTC, локальная дата или локальная дата со смещением) и в каком формате (ISO, JavaScript или Microsoft).

Недопустимое состояние потока записи json 1с как исправить

При чтении даты из JSON всё обстоит сложнее. В параметре ИменаСвойствСоЗначениямиДата вы можете перечислить те свойства JSON, значения которых нужно преобразовать в дату 1С:Предприятия (тип Дата). А в параметре ОжидаемыйФорматДаты вам нужно указать, в каком формате эти данные содержатся в JSON (ISO, JavaScript или Microsoft).

Недопустимое состояние потока записи json 1с как исправить

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

Использование JSON в HTTP интерфейсах приложений

Автоматически генерируемый REST интерфейс прикладных решений

Детальность представления метаданных вы можете указать, например, в адресной строке.

Сведения о метаданных не передаются:

Вся информация о метаданных включается в выгрузку:

HTTP-сервисы прикладного решения

HTTP-сервисы, реализованные в прикладном решении, также могут возвращать ответ в формате JSON. Для этого вам проще всего сформировать тело ответа в JSON, получить его как строку, а затем установить из этой строки тело HTTP ответа сервиса. При этом желательно указать, что BOM (Byte Order Mark, метка порядка байтов) использоваться не должна.

Недопустимое состояние потока записи json 1с как исправить

Последний параметр (ИспользованиеByteOrderMark.НеИспользовать) вы можете и не указывать, если режим совместимости конфигурации не установлен, или он больше чем Версия8_3_5. Потому что в этом случае BOM автоматически будет использоваться только для кодировок UTF-16 и UTF-32, а для UTF-8, UTF-16LE/UTF-16BE, UTF-32LE/UTF-32BE и других она использоваться не будет.

Взаимодействие со сторонними HTTP сервисами

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

Недопустимое состояние потока записи json 1с как исправить

Дальнейшее развитие

Мы думаем над тем, чтобы предоставить вам возможность сериализации в JSON прикладных типов 1С:Предприятия: ссылок, объектов, наборов записей и т.д. Поэтому есть вероятность появления ещё одного, третьего уровня средств работы с JSON. Этот уровень позволит вам преобразовывать в JSON любые типы 1С:Предприятия, для которых поддерживается XDTO-сериализация в XML.

Источник

Ошибка выгрузки документов В JSON.

В общем задача: Есть список документов поступление на РС, которые надо выгрузить в JSON, но не получается.

ЗаписиJSON = Новый ЗаписьJSON;
ЗаписиJSON.ОткрытьФайл(ИмяВременногоФайла. Новый ПараметрыЗаписиJSON(, Символы.Таб));
НастройкиСериал = Новый НастройкиСериализацииJSON;
НастройкиСериал.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
НастройкиСериал.ФорматСериализацииДаты = ФорматДатыJSON.ISO;

Для Каждого СтрСписокДокументов Из СписокДокументов Цикл

Если Не СтрСписокДокументов.Обрабатывать Тогда
Продолжить;
КонецЕсли;

ЗаписиJSON.ЗаписатьНачалоОбъекта();
СтруктураДокумента = ПолучитьСтруктуру(СтрСписокДокументов.Ссылка);
ЗаписатьJSON(ЗаписиJSON, СтруктураДокумента, НастройкиСериал);
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СтрСписокДокументов.Ссылка.ПолучитьОбъект());
ЗаписиJSON.ЗаписатьКонецОбъекта();
КонецЦикла;

СериализаторXDTO.ЗаписатьJSON(ЗаписиJSON, МассивОбъектов, НазначениеТипаXML.Неявное);
ЗаписиJSON.Закрыть();

Ошибка:
<ВнешняяОбработка.ВыгрузкаДокументовНаСайт.Форма.Форма.Форма(298)>: Ошибка при вызове метода контекста (ЗаписатьJSON)
ЗаписатьJSON(ЗаписиJSON, СтруктураДокумента, НастройкиСериал);
по причине:
Неверный порядок записи JSON

по причине:
Неверный порядок записи JSON

И да, получаю Структуру Так:

Функция ПолучитьСтруктуру(знач Объект)

Структура = Новый Структура(); /// реквизиты

Для каждого Реквизит из Объект.Метаданные().СтандартныеРеквизиты Цикл
Если ТипЗнч(Объект[Реквизит.Имя]) = тип(«Число») ИЛИ ТипЗнч(Объект[Реквизит.Имя]) = тип(«Дата») ИЛИ ТипЗнч(Объект[Реквизит.Имя]) = тип(«Булево») тогда
Структура.Вставить(Реквизит.Имя, Объект[Реквизит.Имя]);
иначе
Структура.Вставить(Реквизит.Имя, Строка(Объект[Реквизит.Имя]));
КонецЕсли;
КонецЦикла;

ЗЫ. 15 секунд гугла, первая ссылка. ((

Источник

1С 8.3 : Обмен данными с сайтом используя формат JSON в 1С

Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.

JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.

Недопустимое состояние потока записи json 1с как исправитьНеобходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.

В платформе с версии 8.3.6:

Потоковое чтение и запись JSON:

В качестве иллюстрации потокового чтения JSON можно привести следующий пример:

Результат такой записи:

Сериализация примитивных типов и коллекций в JSON

Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.

Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.

Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.

В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:

Подробнее вы можете посмотреть здесь

В платформе с версии 8.3.7:

Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.

Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.

Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее здесь

ДО платформы версии 8.3.6, т.е. 8.3.5 и ниже:

На HelpF уже есть статья где описан пример: Работа с форматом JSON в 1С но не приведены функции, вот они:

Примеры их использования:

Пишите комменты Недопустимое состояние потока записи json 1с как исправить

Источник

С помощью ApiStart получаю строку в формате json (тип строка), в итоге нужно преоброзовать в удобочитаемый видв 1с, как это сделать?

ОтветВСтруктуре1С = ПрочитатьJSON(jsontext,Истина) попробуй в соответствие прочитать

{Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПрочитатьJSON)     ОтветВСтруктуре1С = ПрочитатьJSON(jsontext,Истина);     по причине: Несоответствие типов (параметр номер ‘1’)

что СП говорит по поводу типа параметра у ПрочитатьJSON?

Глобальный контекст (Global context) ПрочитатьJSON (ReadJSON) Синтаксис: ПрочитатьJSON(<ЧтениеJSON>, <ПрочитатьВСоответствие>, <ИменаСвойствСоЗначениямиДата>, <ОжидаемыйФорматДаты>, <ИмяФункцииВосстановления>, <МодульФункцииВосстановления>, <ДополнительныеПараметрыФункцииВосстановления>, <ИменаСвойствДляОбработкиВосстановления>, <МаксимальнаяВложенность>) Параметры: Тип: ЧтениеJSON. Объект чтения JSON. Тип: Булево. Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие. Если установлено Ложь, объекты будут считываться в объект типа Структура. Примечание. При десериализации объектов JSON в структуру необходимо помнить о требованиях к ключам структуры. Если при десериализации объекта будет найдено имя свойства, недопустимое для ключа структуры, то будет вызвано исключение. Значение по умолчанию: Ложь. <ИменаСвойствСоЗначениямиДата> (необязательный) Тип: Массив, Строка, ФиксированныйМассив. Массив, элементы которого содержат имена свойств JSON, для которых нужно вызывать восстановление даты из строки. Если имя свойства указано в этом параметре и указано в параметре ИменаСвойствДляОбработкиВосстановления, то для таких свойств восстановление осуществляется в функции восстановления. Если восстановление даты из значения свойства невозможно, то будет сгенерировано исключение. Значение по умолчанию: Неопределено. <ОжидаемыйФорматДаты> (необязательный) Тип: ФорматДатыJSON. Ожидаемый формат даты при десериализации объекта в формате JSON. Если в результате десериализации значение не является строкой и имеет формат даты, отличный от ожидаемого, то будет вызвано исключение. Значение по умолчанию: ISO. <ИмяФункцииВосстановления> (необязательный) Тип: Строка. Данная функция вызывается при чтении каждого свойства и должна иметь следующие параметры: <Свойство> — значение типа Строка, указывается только при чтении объектов JSON, <Значение> — значение допустимого для сериализации типа, <ДополнительныеПараметры>. Возвращаемое значение — произвольного типа. Если данный параметр задан и не задан параметр МодульФункцииВосстановления, и наоборот, будет вызвано исключение. Если функция не установлена, то при вызове метода ПрочитатьJSON, параметр ИменаСвойствСоЗначениямиДата игнорируется. Значение по умолчанию: Неопределено. <МодульФункцииВосстановления> (необязательный) Тип: УправляемаяФорма; КомандаКомандногоИнтерфейса; ОбщийМодуль. Указывает модуль, процедура которого будет использована для восстановления значения. В зависимости от типа параметра будет вызван соответствующий метод: УправляемаяФорма — будет вызван метод модуля указанной управляемой формы. КомандаКомандногоИнтерфейса — будет вызван метод модуля команды командного интерфейса. ОбщийМодуль — будет вызван метод неглобального общего модуля. Значение по умолчанию: Неопределено. <ДополнительныеПараметрыФункцииВосстановления> (необязательный) Тип: Произвольный. Дополнительные параметры, которые будут переданы в функцию восстановления значений. Значение по умолчанию: Неопределено. <ИменаСвойствДляОбработкиВосстановления> (необязательный) Тип: Массив. Массив имен свойств JSON, для которых будет вызвана функция восстановления. Параметр игнорируется, если не установлен параметр ИмяФункцииВосстановления. Значение по умолчанию: Неопределено. <МаксимальнаяВложенность> (необязательный) Тип: Число. Максимальный уровень вложенности объекта JSON. При превышении уровня вложенности будет сгенерировано исключение. Значение по умолчанию: 500. Возвращаемое значение: Тип: Произвольный. Описание: Считывает значение из JSON-текста или файла. JSON-текст должен быть корректным. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, интеграция. Примечание: Массив будет десеарилизован в массив. Объект JSON будет преобразован в соответствие или структуру (если ключ структуры окажется недопустимым, будет вызвано исключение). Для дат действует аналогично методу ПрочитатьДатуJSON. Во время выполнения метода может быть вызвана пользовательская функция для восстановления значения — для этого следует использовать параметр ИмяФункцииВосстановления. Функция восстановления должна быть описана с директивой &НаСервере или &НаКлиенте. Использование функции вне контекста не допускается. ———————————————————————————      Методическая информация

1-й параметр должен быть ЧтениеJSON

Тип: ЧтениеJSON. Объект чтения JSON. как строке сказать что она JSON ? ))

Синтаксис: УстановитьСтроку(<СтрокаJSON>) Параметры: <СтрокаJSON> (обязательный) Тип: Строка. Строка, содержащая текст в формате JSON.

{Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПрочитатьJSON) ОтветВСтруктуре1С = ПрочитатьJSON(ЧтениеJSON); по причине: Недопустимое состояние потока записи JSON

а нет все ок, спасибо большое

07.10.2014

Реализовано в версии 8.3.6.1977.

JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.

Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.

Мы видим несколько основных сценариев использования JSON.

Во-первых, это интеграция с внешними системами через их HTTP интерфейсы: Google Calendar, Salesforce.com, REST интерфейс 1С:Предприятия, SharePoint и т.д.

Во-вторых, это организация собственного HTTP интерфейса прикладного решения.

В-третьих, обмен файлами JSON с внешними системами. Формирование конфигурационных, настроечных файлов. Использование их в процедурах обмена данными, например, с интернет-магазинами.

В-четвертых, это использование файлов JSON для обмена данными между разными приложениями 1С:Предприятия.

В платформе мы реализовали несколько слоёв работы с JSON. Самые простые и гибкие — это низкоуровневые средства потоковой записи и чтения. Более высокоуровневые и не такие универсальные — средства сериализации в JSON примитивных типов и коллекций 1С:Предприятия.

Потоковое чтение и запись JSON

Объекты потоковой работы — это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.

В качестве иллюстрации потокового чтения JSON можно привести следующий пример:

При записи JSON вы самостоятельно формируете его структуру. Чтобы «подстраховать» вас от ошибок, объект ЗаписьJSON автоматически проверяет правильность записываемой структуры. Для увеличения скорости работы эту проверку можно отключить. В примере ниже это строка:

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

Потоковая запись JSON может выглядеть следующим образом. Записывается массив из четырёх элементов. Три из них примитивного типа, а четвёртый элемент — это объект с двумя свойствами:

Результат такой записи:

{
	"СвойствоТипаМассив": [
		"Значение строка",
		1.2345E1,
		true,
		{
			"СвойствоТипаСтрока": "Значение строка",
			"СвойствоТипаНеопределено": null
		}
	]
}

Сериализация примитивных типов и коллекций в JSON

Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.

Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.

Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.

В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:

[
	{
		"имя": "Anton",
		"фамилия": "Иванов",
		"возраст": 25
	},
	{
		"имя": "Ирина",
		"фамилия": "Иванова",
		"возраст": 20
	}
]

Код 1С:Предприятия, выполняющий десериализацию, может выглядеть следующим образом:

А пример сериализации (записи) в JSON может выглядеть так:

Результат записи:

{
	"Фамилия": "Иванов",
	"Имя": "Иван",
	"Отчество": "Иванович",
	"Возраст": 40,
	"Женат": true,
	"Телефоны": [
		"8-999-999-99-90",
		"8-999-999-99-91"
	]
}

Функции преобразования и восстановления при сериализации

Не всегда сериализация может быть выполнена полностью автоматически. В жизни встречаются самые разные ситуации. Поэтому мы добавили возможность использовать «самописную» функцию обработки значений при записи в JSON и при чтении из JSON.

В методе ЗаписатьJSON() она называется Функция преобразования и описывается с помощью трёх параметров:

  • ИмяФункцииПреобразования;
  • МодульФункцииПреобразования;
  • ДополнительныеПараметрыФункцииПреобразования.

В методе ПрочитатьJSON() она называется Функция восстановления и для неё есть аналогичные параметры:

  • ИмяФункцииВосстановления;
  • МодульФункцииВосстановления;
  • ДополнительныеПараметрыФункцииВосстановления.

При записи в JSON эта функция полезна потому, что позволяет самостоятельно преобразовать в JSON те типы, которые не подлежат автоматическому преобразованию. Или даже совсем отказаться от их сериализации.

Например, так оказалось, что в записываемой структуре одно из значений — это ссылка на элемент справочника ПодразделенияОрганизаций. Такое значение (ссылка на объект 1С:Предприятия) не может быть автоматически сериализовано средствами платформы. Тогда, используя функцию преобразования, мы можем получить для этого значения его строковое представление в удобном виде. Например, в виде строки «ИП Петров: Отдел рекламы».

Результат выполнения примера:

{
	"Фамилия": "Иванов",
	"Имя": "Иван",
	"Отчество": "Иванович",
	"Подразделение": "ИП Петров: Отдел рекламы",
	"Телефоны": [
		"8-999-999-99-90",
		"8-999-999-99-91"
	]
}

При чтении из JSON функция восстановления может использоваться для того, чтобы преобразовать данные JSON в типы 1С, которые не могут являться результатом автоматического преобразования, или для того, чтобы самостоятельно (не автоматически) преобразовать даты JSON в даты 1С:Предприятия.

Сериализация типа Дата

Данные типа Дата сериализуются в JSON автоматически, а вот обратное преобразование (десериализация) может быть выполнено не всегда. JSON не содержит типа Дата, значения даты представляются в нём строкой. Конечно, существуют некоторые форматы представления дат, но вообще говоря, внешний вид такой строки может быть самым разнообразным.

Для сериализации типа Дата в JSON у метода ЗаписатьJSON() вы можете использовать параметр НастройкиСериализации. Это объект встроенного языка, который позволяет указать, в каком варианте будет записана дата (UTC, локальная дата или локальная дата со смещением) и в каком формате (ISO, JavaScript или Microsoft).

Код 1С:Предприятия:

Текст JSON:

[
	{
		"Фамилия": "Иванов",
		"ДатаРождения": "1987-05-14T00:00:00"
	},
	{
		"Фамилия": "Петров",
		"ДатаРождения": "1993-11-21T00:00:00"
	}
]

При чтении даты из JSON всё обстоит сложнее. В параметре ИменаСвойствСоЗначениямиДата вы можете перечислить те свойства JSON, значения которых нужно преобразовать в дату 1С:Предприятия (тип Дата). А в параметре ОжидаемыйФорматДаты вам нужно указать, в каком формате эти данные содержатся в JSON (ISO, JavaScript или Microsoft).

Текст JSON:

[
	{
		"Фамилия": "Иванов",
		"ДатаРождения": "1987-05-14T00:00:00"
	},
	{
		"Фамилия": "Петров",
		"ДатаРождения": "1993-11-21T00:00:00"
	}
]

Код 1С:Предприятия:

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

В такой ситуации, для большей универсальности, вы можете включить те же самые свойства JSON в массив, подлежащий обработке функцией восстановления — ИменаСвойствДляОбработкиВосстановления. И уже в функции восстановления вы самостоятельно десериализуете даты JSON, в каком бы формате они ни были представлены.

Использование JSON в HTTP интерфейсах приложений

Автоматически генерируемый REST интерфейс прикладных решений

При обращении к REST интерфейсу прикладного решения вы можете получать ответ в формате JSON. Для этого в адресной строке вам нужно указать параметр $format=json. Либо указать MIME тип «application/json» в заголовке Accept HTTP запроса. Например:

Запрос:

GET /TestInfobase/odata/standard.odata/СправочникДляТестов?$format=json HTTP/1.1
MaxDataServiceVersion: 3.0;NetFx
Accept: application/json
Accept-Charset: UTF-8
User-Agent: Microsoft ADO.NET Data Services

Ответ:

HTTP/1.1 200 OK
Content-Length: 9429
Content-Type: application/json;charset=utf-8
Server: Microsoft-IIS/7.5
DataServiceVersion: 3.0
X-Powered-By: ASP.NET
Date: Mon, 12 Aug 2013 09:44:07 GMT
    
{
"odata.metadata":"http://host/svc/$metadata#СправочникДляТестов",
"value":[
{
	"Ref_Key":guid'cc6a7df3-8cfe-11dc-8ca0-000d8843cd1b',
	"DataVersion":"AAAAAQAAAAE",	
	"DeletionMark":false,
	"Parent_Key":guid'bbb079ae-8c51-11db-a9b0-00055d49b45e',
	"IsFolder":false,
	"Code":000000025,
	"Description":"Пинетки",
	"Поставщик_Key":guid'd1cb82a7-8e8b-11db-a9b0-00055d49b45e',
	"Поставщик@navigationLinkUrl":"СправочникДляТестов(guid'cc6a7df3-8cfe-11dc-8ca0-000d8843cd1b')/Поставщик",
	"РеквизитХранилище_Type": "image/jpeg",
	"РеквизитХранилище_Base64Data@mediaReadLink": "Catalog_ДемоСправочник(guid'cf2b1a24-1b96-11e3-8f11-5404a6a68c42')/РеквизитХранилище_Base64Data",
	"РеквизитХранилище_Base64Data": <строка с закодированными данными>
	…
},
{…},
{…}
]
}

Вы можете управлять объёмом передаваемой информации за счёт изменения детальности представления метаданных в выгрузке. Существуют три уровня: Nometadata, Minimalmetadata и Fullmetadata. По-умолчанию (на примере вверху) используется средний уровень — Minimalmetadata. На уровне Nometadata объём передаваемой информации минимальный, а на уровне Fullmetadata — максимальный. Однако при этом нужно понимать, что сокращение объёма передаваемой информации приводит к более интенсивным вычислениям на клиенте. И наоборот, когда вся информация включается в выгрузку, объём вычислений на клиенте будет минимальным.

Детальность представления метаданных вы можете указать, например, в адресной строке.

Сведения о метаданных не передаются:

GET /TestInfobase/odata/standard.odata/СправочникДляТестов/?$format=application/json;odata= minimalmetadata

Вся информация о метаданных включается в выгрузку:

GET /TestInfobase/odata/standard.odata/СправочникДляТестов/?$format=application/json;odata=fullmetadata

HTTP-сервисы прикладного решения

HTTP-сервисы, реализованные в прикладном решении, также могут возвращать ответ в формате JSON. Для этого вам проще всего сформировать тело ответа в JSON, получить его как строку, а затем установить из этой строки тело HTTP ответа сервиса. При этом желательно указать, что BOM (Byte Order Mark, метка порядка байтов) использоваться не должна.

Последний параметр (ИспользованиеByteOrderMark.НеИспользовать) вы можете и не указывать, если режим совместимости конфигурации не установлен, или он больше чем Версия8_3_5. Потому что в этом случае BOM автоматически будет использоваться только для кодировок UTF-16 и UTF-32, а для UTF-8, UTF-16LE/UTF-16BE, UTF-32LE/UTF-32BE и других она использоваться не будет.

Взаимодействие со сторонними HTTP сервисами

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

Дальнейшее развитие

Мы думаем над тем, чтобы предоставить вам возможность сериализации в JSON прикладных типов 1С:Предприятия: ссылок, объектов, наборов записей и т.д. Поэтому есть вероятность появления ещё одного, третьего уровня средств работы с JSON. Этот уровень позволит вам преобразовывать в JSON любые типы 1С:Предприятия, для которых поддерживается XDTO-сериализация в XML.

Теги:
JSON 
8.3.6 
разработка 

Понравилась статья? Поделить с друзьями:
  • Незнанский ошибка президента скачать
  • Невские весы ошибка 3 error
  • Незавершенная строковая константа ошибка
  • Недопустимое имя поля сводной таблицы как исправить
  • Незнание иностранных языков было его ахиллесовой пятой ошибка