Ошибка при вызове метода контекста записатьjson передано значение недопустимого типа

ЗаписатьJSON в фоновом задании
   ДенисЧ

06.10.21 — 17:42

Коллеги, хелп.

То ли лыжи, то ли я…

БП2 Корп

Есть примитивный код

// Новая запись — строка в ТЧ, выгруженная из РС КонтактнаяИнформация

// копируем строку в структуру

копияЗаписи = Новый Структура;

Для Каждого кол из новаяЗапись.Владелец().Колонки Цикл

    копияЗаписи.Вставить(кол.Имя, новаяЗапись[кол.Имя]);

КонецЦикла;

стАдрес = РаботаСАдресами.БГУ_СтруктураАдресаВСтруктуруJSON(копияЗаписи); // Типовая функция, модуль на поддержке и замке

Тут стАдрес — структура, частично заполненная.

Потом

зап = Новый ЗаписьJSON;

зап.УстановитьСтроку();

ЗаписатьJSON(зап, стАдрес);

И вот тут начинается.

В клиентском режиме (запускаем руками, уходим на сервер, там этот код выполняется) всё хорошо, всё красиво.

Потом этот код начинает вызываться из фонового задания и вылетает ошибка

Ошибка при вызове метода контекста (ЗаписатьJSON): Передано значение недопустимого типа

Непечатных символов в структуре нет, проверили. Беда в том, что не можем этот вызов фонового поймать отладчиком, приходится печатью…

Что это может быть такое?

   pechkin

1 — 06.10.21 — 17:44

сделай в попытке + в исключении логгируй полный состав стАдрес

   pechkin

2 — 06.10.21 — 17:44

а может там вообще неопределено?

   Topol-M

3 — 06.10.21 — 17:49

Может эту структуру временно в xml запихать для наглядности и посмотреть что в ней.

   PLUT

4 — 06.10.21 — 17:50

   PLUT

5 — 06.10.21 — 17:51

   ДенисЧ

6 — 06.10.21 — 17:51

(1) «Непечатных символов в структуре нет, проверили» Уже сделано.

(2) А что, неопределено не jsonится? Так в клиентском же работает.

   Kassern

7 — 06.10.21 — 17:52

(0) а в чем проблема отладкой поймать фоновое задание?

   ДенисЧ

8 — 06.10.21 — 17:53

(5) Не, там про NULL. А тут его тупо е может быть.

(7) Там через shop’у оно вызывается, не ловится пока.

Если только принудительно пробежать и проверить на неопределено… Но почему тогда на тех же данных в ручном режиме работает?

   pechkin

9 — 06.10.21 — 17:57

(6)а как ты определил по какому объекту идет ошибка?

   ДенисЧ

10 — 06.10.21 — 17:58

(9) А в системе, которая валит данные, можно отослать один объект. И да, получить пакет, который валится в обмен, тоже можно получить и даже (!!) сохранить в файл в том же формате, что и прилетает к записи.

   pechkin

11 — 06.10.21 — 17:59

в ручном режиме вызов на сервере?

   Kassern

12 — 06.10.21 — 17:59

   Ёпрст

13 — 06.10.21 — 17:59

(0) а там точно структура то возвращается с аботаСАдресами.БГУ_СтруктураАдресаВСтруктуруJSON(копияЗаписи) ?

   pechkin

14 — 06.10.21 — 18:01

да не нужно фоновое отлаживать, достаточно на сервере запустить

   Ёпрст

15 — 06.10.21 — 18:01

ну и воткни в код запись структуры в файл какой нить рекурсивной выборкой. если там вложенные структуры есть

   ДенисЧ

16 — 06.10.21 — 18:03

(11) Ммм… А в чём проблема?

(13) да

(!5) Там два массива есть со структурами. Но это опять же в ручном режиме проходит.

   Garykom

17 — 06.10.21 — 18:05

(0) уже проверил на другой базе и на другом сервере да?

   pechkin

18 — 06.10.21 — 18:05

(16) так с сервера или нет?

   Ёпрст

19 — 06.10.21 — 18:06

(16) ну значит в структуре есть значение недопустимого типа )))

выведи в файлик значение и тип :)

   pechkin

20 — 06.10.21 — 18:06

(17) чем другая база поможет?

   Garykom

21 — 06.10.21 — 18:06

(20) баг это или фича понять

   ДенисЧ

22 — 06.10.21 — 18:06

(17) А для этого нужно найти свободный другой сервер и развернуть на нём три системы )))

Кто ж мне это даст?

(18) с клиента вызывается чисто серверный модуль и да, выполняется на сервере.

   Garykom

23 — 06.10.21 — 18:07

(22) эээ какие три системы?

   ДенисЧ

24 — 06.10.21 — 18:08

(23) Обмена, разумеется. Одна источник, вторая среда-передатчик, третья — получатель. Это чтобы чистый эксперимент был.

   Garykom

25 — 06.10.21 — 18:09

Все же фоновые в отладчик и остановку по ошибке этой

   pechkin

26 — 06.10.21 — 18:11

А с клиента запускаешь процедуру фонового?

   ДенисЧ

27 — 06.10.21 — 18:12

И тут мне внезапно пришла в голову мысль, что отладчик не поможет )))

Код загрузки лежит в РС и выполняется через Выполнить(). Так что отладчик не поможет…

   ДенисЧ

28 — 06.10.21 — 18:12

(26) Нет. Серверную процедуру.

   pechkin

29 — 06.10.21 — 18:13

(28) я имел ввиду туже процедуру что и фоновое.
если ничто не помогает, то (1)

   ДенисЧ

30 — 06.10.21 — 18:14

(29) ту же, пятый (? лень считать) повторяю.

   Garykom

31 — 06.10.21 — 18:17

(27) а ты уверен что нужный код выполняется?

   Ёпрст

32 — 06.10.21 — 18:19

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

   Ёпрст

33 — 06.10.21 — 18:20

можно и в ЖР нафлудить..

   pechkin

34 — 06.10.21 — 18:20

(32) там код вообще в регистре лежит

   pechkin

35 — 06.10.21 — 18:22

Что-то сегодня у всех помощники нашептывают: полтергейстов нет, а просто «косяк платформы 100%»

   Ёпрст

36 — 06.10.21 — 18:26

(34) тем более, проверить ышо быстрее

   pechkin

37 — 06.10.21 — 18:27

(36) сначала надо на мисте потрещать

   pechkin

38 — 06.10.21 — 18:27

потом статью запилить

   Garykom

39 — 06.10.21 — 18:29

(32) там код в РС лежит и через Выполнить()

хотя бы сам код в файл писать при запуске

ну и туда же лог

   pechkin

40 — 06.10.21 — 18:30

в жр можно записать ЗначениеВСтрокуВнутр(стАдрес )
на клиенте достать и расшифровать

   ДенисЧ

41 — 06.10.21 — 18:52

(31) Да.

   ДенисЧ

42 — 06.10.21 — 18:53

(36) Ага, быстрей ))) вызвонить человека, который в первой изменение внесёт, потом второго, чтобы тот проследил ход выполениия и вытащил обишки…

А у них ещё куча своих дел есть…

   polosov

43 — 06.10.21 — 18:56

Не понимаю, что мешает сделать как (1)

   ДенисЧ

44 — 06.10.21 — 19:01

(43) Читай (42) ))))

В общем, нашёл вызов УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(), завтра попробуем.

Там как раз чистка идёт специально для адресов.

   Ёпрст

45 — 06.10.21 — 19:03

(42) вот-вот.. не гонялся бы ты поп за дешевизной..т.е халтурой.

Нефик другим помогать :)

   ДенисЧ

46 — 06.10.21 — 19:05

(45) Что значит «другим помогать»? Мы работаем в одной конторе, у них одна зона ответственности, у меня другая.

И я вообще-то так просто в базы, за которые отвечаю, других не пускаю…

   Ёпрст

47 — 06.10.21 — 19:08

(46) Странно, что у тебя нет доступа к этим базам, чтоб покодить, думал, ты халтуришь на стороне …

   ДенисЧ

48 — 06.10.21 — 20:01

(47) Если у меня будет доступ ко всем базам в холдинце — я повешусь.

   pechkin

49 — 06.10.21 — 20:17

С какого х… ты занимаешься этим вопросом?

   ДенисЧ

50 — 06.10.21 — 20:19

(49) Забавный вопрос…. Наверное, потому что это моя работа?

   pechkin

51 — 06.10.21 — 20:37

(50) чинить базы к которым нет доступа?

   ДенисЧ

52 — 06.10.21 — 20:38

(51) Чинить загрузчик, который работает в моих базах.

Чуйствуешь разницу?

   pechkin

53 — 06.10.21 — 20:50

Базы мои, но доступа у меня к ним нет

   Garykom

54 — 07.10.21 — 12:02

Как там лыжи? Мазь помогла?

   ДенисЧ

55 — 07.10.21 — 12:03

(53) Ты не вкурил.

(54) да, та функция сработала как надо.

   Kassern

56 — 07.10.21 — 12:05

а в чем проблема то была в итоге?

  

Почему 1С

57 — 07.10.21 — 12:14

ЗаписатьJSON(зап, стАдрес); обернуть функцией общего модуля, заменить функцию на обертку, в обертке поставить точку останова и все равно что код выполняется через выполнить поймаем

1С: Предприятие 8.3.14.Документация

1 Общая информация

Формат JSON является универсальным способом представления при обмене данными (RFC 7159, https://tools.ietf.org/html/rfc7159). Данные в формате JSON представляют собой (в закодированном виде):
Объект – неупорядоченное множество пар ключ:значение, заключенный в фигурные скобки ({}). Пары ключ:значение разделяются запятыми (,).
Массив – множество значений. Массив заключается в квадратные скобки ([]). Значения разделяются запятыми (,).
● Значение – может быть строкой, числом, объектом, массивов или литералом true, false, null.
● Строка – набор символов, заключенный в двойные кавычки (“”).
● Число – сериализуется с разделителем точка (.). Точность числа не ограничена.
Таким образом, с помощью вышеперечисленных элементов допускается описание объектов любой сложности для представления в формате JSON. Например, некоторый код на встроенном языке, формирует некоторый набор данных (в структуре):

Данные = Новый Структура;
 Данные.Вставить("Фамилия", "Иванов");
 Данные.Вставить("Имя", "Иван");
 Данные.Вставить("Отчество", "Иванович");
 Данные.Вставить("ДеньРождения", ДатаРождения);
 Телефоны = Новый Массив;
 Телефоны.Добавить("+7-987-123-45-67");
 Телефоны.Добавить("+7-986-987-65-43");
 Данные.Вставить("Телефоны", Телефоны);

Сериализуя этот объект в JSON, может быть получен следующий документ:

 {
 "Фамилия": "Иванов",
 "Имя": "Иван",
 "Отчество": "Иванович",
 "ДатаРождения": "2009-02-15T00:00:00Z",
 "Телефоны": [
 "+7-987-123-45-67",
 "+7-986-987-65-43"
 ]
 }

JSON не стандартизует формат представления даты. В силу этого представление даты в JSON-документе определяется предпочтениями прикладного разработчика, который формирует документ, и требованиями системы, которая будет обрабатывать JSON-документ. Система «1С:Предприятие» поддерживает несколько форматов представления даты (задается с помощью системного перечисления ФорматДатыJSON):
1. Формат ISO (значение ФорматДатыJSON.ISO). В этом случае дата сериализуется следующим образом: “2009-02-15T00:00:00+0400”.
2. Формат JavaScript (значение ФорматДатыJSON.JavaScript). В этом случае дата сериализуется следующим образом: “new Date
(1234656000000)”.
3. Формат Microsoft (значение ФорматДатыJSON.Microsoft). В этом случае дата сериализуется следующим образом: “/Date(1234656000000)/”
или “/Date(1234656000000)/” (в зависимости от режима экранирования символов).
Дата может записываться несколькими вариантами (для примера используется дата 10 мая 2014 13:14:15 в зоне UTC+4):
● как локальная дата: 2014-05-10T13:14:15.
● как локальная дата с указанием смещения: 2014-05-10T13:14:15+04:00.
● как дата в UTC: 2014-05-10T09:14:15Z.
Управлять этим можно с помощью системного перечисления ВариантЗаписиДатыJSON. Дату в варианте UTC можно записать в любом формате (ISO, JavaScript и Microsoft), остальные варианты представления даты возможны только в том случае, если сериализация выполняется в формате ISO.
При записи JSON-документа предоставляются возможности по управлению формируемыми данными: настраивать перенос строк, формат сериализации даты, обработка символа “/” и т. д. Эти настройки можно выполнять с помощью объектов НастройкиСериализацииJSON и ПараметрыЗаписиJSON.
Работа с данными в формате JSON может выполняться в нескольких техниках:
● Объектная техника – позволяет формировать простые и небольшие JSON-документы для обмена с внешними приложениями или веб-сервисами. Структура JSON-документа автоматически формируется системой «1С:Предприятие» во время записи документа. Более подробно описание данной техники см. раздел 16.2.2. Специальным вариантом такой техники является возможность сериализации в формате JSON для XDTO-
объектов системы «1С:Предприятие». Более подробное описание работы с XDTO-объектами см. раздел 16.2.3.
● Потоковая техника – позволяет работать с данными большого объема без загрузки их в память приложения. Навигация по JSON-документу  полностью ложится на прикладного разработчика (как при записи, так и при чтении документа). Более подробно описание данной техники см. раздел 16.2.4.
● Совмещенная техника – позволяет сочетать гибкость потоковой техники и простоту объектной техники. Более подробно описание данной техники см. раздел 16.2.5.

2. Объектная техника работы

2.1. Общая информация

Система «1С:Предприятие» поддерживает сериализацию следующих данных в формат JSON:
● Строка – сериализуется в строку;
● Число – сериализуется в число;
● Булево – сериализуется в литералы true и false;
● Неопределено – сериализуется в null
● Массив, ФиксированныйМассив – сериализуется в массив JSON в том случае, если любой элемент массива может быть сериализован в JSON.
● Структура, ФиксированнаяСтруктура – сериализуется в объект JSON:
● Ключ – ключ элемента структуры.
● Значение – значение элемента структуры в том случае, если значение может быть                 сериализовано в JSON.
● Соответствие, ФиксированноеСоответствие – сериализуется в объект JSON:
● Ключ – ключ элемента соответствия. Ключ может быть только значением типа Строка, в противном случае будет генерироваться исключение.
● Значение – значение элемента соответствия в том случае, если значение может быть сериализовано в JSON.
● Дата – формат сериализации определяется настройками.
● Если выполняется попытка сериализации типа, отсутствующего в данном списке – будет вызвано исключение.
При работе с объектной техникой, имеется возможность читать (и писать) данные в соответствие или структуру. Основное отличие между этими объектами состоит в том, что ключ элемента структуры подчиняется правилам формирования переменной на встроенном языке, а ключ элемента соответствия может быть любым. С учетом того, чтоб JSON не накладывает ограничений на значение ключа, не все JSON-документы можно
прочитать в структуру. Еще одним различием между структурой и соответствием является то, что к элементам структуры можно обращаться «через точку», а к элементам соответствия такой доступ не предоставляется. В связи с этим, может оказаться удобным получать данные в виде структуры, если ключи из JSON-документа соответствуют требованиям к ключам структур системы «1С:Предприятие».
Объектная техника предполагает достаточно простую работу с данными, однако платой за это является большой расход памяти, т. к. весь JSON-документ обрабатывается целиком в оперативной памяти.

2.2. Запись

Для того чтобы выполнить запись объекта в формате JSON, необходимо использовать (в простейшем случае) следующие объекты:
1. Собственно записываемый объект, например типа Структура.
2. Объект, обеспечивающий низкоуровневую запись данных в формате JSON – ЗаписьJSON.
3. Объект настроек сериализации НастройкиСериализацииJSON.
Метод глобального контекста ЗаписатьJSON() оперирует вышеперечисленными объектами. Рассмотрим пример, в котором потребуется записать структуру, которая состоит из трех элементов разного типа (но типы являются примитивными):

Запись = Новый ЗаписьJSON;
 Запись.ОткрытьФайл("c:tempsimpleWrite.json");
 Данные = Новый Структура;
 Данные.Вставить("ДлинаЗаписи", 20);
 Данные.Вставить("КлючЗаписи", "abcdefgh");
 Данные.Вставить("ДатаИзменения", ТекущаяДата());
 ЗаписатьJSON(Запись, Данные, Новый НастройкиСериализацииJSON);
 Запись.Закрыть();

В результате работы данный пример сформирует следующий JSON-документ:

{
“ДлинаЗаписи”: 20,
“КлючЗаписи”: “abcdefgh”,
“ДатаИзменения”: “2014-09-24T17:32:11”
}
Если в сериализуемых данных участвуют значения типа Дата, то может потребоваться управлять форматом сериализации. Для этого необходимо установить параметры объекта НастройкиСериализацииJSON. В следующем примере дата будет сериализоваться в формате JavaScript:

НастройкиСериализации = Новый НастройкиСериализацииJSON;
 НастройкиСериализации.ФорматСериализацииДат = ФорматДатыJSON.JavaScript;
 НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
 Запись = Новый ЗаписьJSON;
 Запись.ОткрытьФайл("c:tempsimpleWrite.json");
 Данные = Новый Структура;
 Данные.Вставить("ДлинаЗаписи", 20);
 Данные.Вставить("КлючЗаписи", "abcdefgh");
 Данные.Вставить("ДатаИзменения", ТекущаяДата());
 ЗаписатьJSON(Запись, Данные, НастройкиСериализации);
 Запись.Закрыть();

В результате работы данный пример сформирует следующий JSON-документ:

{
 "ДлинаЗаписи": 20,
 "КлючЗаписи": "abcdefgh",
 "ДатаИзменения": "new Date(1411565832000)"
 }

Если несколько расширить набор записываемых данных, например, добавить к ним значение типа УникальныйИдентификатор, то запись не будет выполнена. В результате исполнения кода:

Запись = Новый ЗаписьJSON;
 Запись.ОткрытьФайл("c:tempsimpleWrite.json");
 Данные = Новый Структура;
 Данные.Вставить("ДлинаЗаписи", 20);
 Данные.Вставить("КлючЗаписи", "abcdefgh");
 Данные.Вставить("ДатаИзменения", ТекущаяДата());
 Данные.Вставить("UID", Новый УникальныйИдентификатор);
 ЗаписатьJSON(Запись, Данные, Новый НастройкиСериализацииJSON);
 Запись.Закрыть();

Будет вызвано исключение:

Ошибка при вызове метода контекста (ЗаписатьJSON)
 ЗаписатьJSON(Запись, Данные, Новый НастройкиСериализацииJSON);
 по причине:
 Передано значение недопустимого типа

Причиной такого поведения является то, что тип УникальныйИдентификатор не входит в состав JSON-сериализуемых типов данных системы «1С:Предприятие». Однако система предоставляет возможность «обойти» это ограничение: необходимо передать в функцию ЗаписатьJSON() имя функции обратного вызова, которая будет заниматься JSON-сериализацией неподдерживаемых объектов. Эта функция будет называться
функцией преобразования. При этом формат такой сериализации будет разрабатывать непосредственно сам прикладной разработчик. Надо понимать, что такая сериализация не будет универсальной, т. к. принимающая сторона, не обладающая знаниями о формате сериализации, не сможет прочитать переданные данные. Другими словами, формат сериализации необходимо разрабатывать совместно всеми сторонами обмена
такого рода данными.
С учетом вышесказанного, более сложный вариант обмена теперь происходит следующим образом:
● Вызывается функция сериализации объекта в формат JSON (ЗаписатьJSON()).
● Система «1С:Предприятие» для каждого элемента структуры, тип значения которого не сериализуется в формат JSON, будет вызываться функция преобразования.
● Функция преобразования анализирует переданный объект и принимает решение – отказаться от его записи или вернуть платформе значение, которое может быть сериализовано в JSON.
Доработанный код записи будет выглядеть следующим образом:

&НаСервере
 Процедура ЗаписьНаСервере()
 Запись = Новый ЗаписьJSON;
 Запись.ОткрытьФайл("c:tempcompositeWrite.json");
 Данные = Новый Структура;
 Данные.Вставить("ДлинаЗаписи", 20);
 Данные.Вставить("КлючЗаписи", "abcdefgh");
 Данные.Вставить("ДатаИзменения", ТекущаяДата());
 Данные.Вставить("UID", Новый УникальныйИдентификатор);
 ЗаписатьJSON(Запись, Данные, Новый НастройкиСериализацииJSON, "ФункцияПреобразованияЗаписи", ЭтотОбъект);
 Запись.Закрыть();
 КонецПроцедуры
 &НаСервере
 Функция ФункцияПреобразованияЗаписи(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
 Если ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда
 Возврат Строка(Значение);
 КонецЕсли;
 Отказ = Истина;
 КонецФункции

Следует обратить внимание, что функция преобразования должна быть объявлена с указанием ключевого слова Экспорт. Также следует помнить, что функция преобразования (в модуле управляемой формы) может быть описана только в «контекстной» части модуля, т. е. с использованием директивы компиляции &НаКлиенте или &НаСервере.
В результате работы приведенного примера будет сформирован следующий JSON-документ:

{
 "ДлинаЗаписи": 20,
 "КлючЗаписи": "abcdefgh",
 "ДатаИзменения": "2014-09-24T18:09:13",
 "UID": "5a80e5dc-252b-416f-b487-d9ddcebc523e"
 }

При создании функции преобразования следует помнить о следующих особенностях:
● Функция преобразования вызывается для значений всех типов, которые не поддерживают сериализацию в JSON (см. раздел 16.2.1).
● Если функция преобразования вернет значение, которое не может быть сериализовано в JSON – будет вызвано исключение.
● Если переданное значение является структурой, то вызов функции преобразования для элементов этой структуры будет вызваться до того, как в поток будет записано имя свойства этого элемента. В результате функция преобразования может отказаться от записи значения и структура формируемого JSON-документа не будет нарушена.
● Имя свойства будет передано в функцию преобразования только для элементов структур и соответствий.

2.3. Чтение

2.3.1. Общая схема

Чтение данных в объектной технике выглядит аналогично записи. Рассмотрим пример чтения файлов, которые формировались во время рассмотрения объектной записи (предыдущий раздел).

Чтение = Новый ЧтениеJSON;
 Чтение.ОткрытьФайл("c:tempsimpleWrite.json");
 Данные = ПрочитатьJSON(Чтение, Ложь, "ДатаИзменения", ФорматДатыJSON.JavaScript);
 Чтение.Закрыть();

Документ имеет следующее содержание (с точностью до значения даты):

{
 "ДлинаЗаписи": 20,
 "КлючЗаписи": "abcdefgh",
 "ДатаИзменения": "new Date(1411565832000)"
 }

При чтении JSON-документа в переменную Данные будет сформирована структура вида:

Ключ = ДлинаЗаписи, значение = 20
Ключ = КлючЗаписи, значение = abcdefgh
Ключ = ДатаИзменения, значение = <значение даты и времени>

Такой вариант чтения хорошо подходит в том случае, если читаемые данные могут быть преобразованы в структуру или соответствие и все читаемые данные могут быть однозначно десериализованы без потери информации о типе. Если читаемые данные обладают сложной структурой или требуют выполнения дополнительных преобразований при чтении, то можно пойти двумя путями:
1. Получить соответствие (или структуру), в которое будет полностью загружен JSON-документ, и потом завершить преобразование с помощью обхода получившегося объекта.
2. Заниматься необходимым преобразованием непосредственно во время загрузки данных.

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

{
 "id":524901,"name":"Moscow","dt":1411464940000,
 "coord": { "lon":37.62,"lat":55.75 },
 "sys": { "country":"RU","sunrise":1411442400000,"sunset":1411485660000 },
 "weather": [
 { "main":"Clouds","description":"пасмурно" }
 ],
 "main": { "temp":282.93,"pressure":1014,"humidity":93 },
 "wind": { "speed":4,"deg":350 },
 "clouds": { "all":90 }
 }

Кратко рассмотрим описание формата:
● id – идентификатор города;
● name – имя города;
● dt – дата и время получения погоды, в формате Unix, GMT;
● coord – местоположение города:
● lon – долгота;
● lan – широта.
● sys – дополнительная информация:
● country – страна расположения города;
● sunrise – время восхода Солнца в формате Unix, GMT;
● sunset – время заката Солнца, в формате Unix, GMT.
● weather – дополнительная информация о погоде:
● main – общая характеристика погоды;
● description – описание погоды.
● main – собственно описание погоды:
● temp – температура, в градусах Кельвина. Для получения градусов Цельсия необходимо вычесть 273.15;
● pressure – давление в гектопаскалях. Для перевода в миллиметры ртутного столба, надо значение давления умножить на 0,75.
● humidity – влажность в %.
● wind – параметры ветра:
● speed – скорость в милях в час. Для перевода в километры в час необходимо умножить на 1,61.
● deg – направление ветра, в градусах.
● clouds – информация об осадках:
● all – вероятность возникновения осадков, в %.
В результате загрузки этих данных должна получиться структура, где все времена представлены стандартным типом Дата, температура – в градусах Цельсия, скорость – в километрах в час, а давление – в миллиметрах ртутного столба.
Рассмотрим загрузку данной информации обоими способами. Данные записаны в файле c:tempweather.json.

2.3.2. Чтение с постобработкой

Собственно процесс чтения выглядит просто:

Чтение = Новый ЧтениеJSON;
 Чтение.ОткрытьФайл("c:tempweather.json");
 Данные = ПрочитатьJSON(Чтение, Ложь);
 Чтение.Закрыть();

В результате в переменной Данные будет следующая информация:

Рис. 3 Результат загрузки

Без учета необходимости конвертации все выглядит предсказуемо. Однако дата и время автоматически не преобразовались. Можно попробовать указать системе на то, что поле dt (например) является полем, где находится дата и время:

Чтение = Новый ЧтениеJSON; Чтение.ОткрытьФайл("c:tempweather.json");
Данные = ПрочитатьJSON(Чтение, Ложь, "dt", ФорматДатыJSON.JavaScript);
 Чтение.Закрыть();

В результате получим сообщение об ошибке следующего вида:

Ошибка при вызове метода контекста (ПрочитатьJSON)

Данные = ПрочитатьJSON(Чтение, Ложь, "dt", ФорматДатыJSON.JavaScript);

по причине:

Представление даты имеет неверный формат

Ошибка произошла потому, что система не понимает формат даты и времени, выраженной простым числом. Программный интерфейс работы с JSON предлагает функцию, помогающую выполнить конвертацию полей типа Дата – ПрочитатьДатуJSON(). Для использования этой функции необходимо привести десериализованную строку к формату, принятому, например, в JavaScript. В рассматриваемом примере получится
следующий программный текст:

Данные.dt = ПрочитатьДатуJSON(“new Date(“+Формат(Данные.dt, “ЧГ=”)+”)”, ФорматДатыJSON.JavaScript);

В результате значение свойства Данные.dt станет равно значению 23.09.2014 13:35:40 (типа Дата). Остальная конвертация выполняется аналогичным образом.

2.3.3. Чтение с функцией восстановления

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

&НаСервере
 Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
 Если Свойство = "dt" ИЛИ Свойство = "sunrise" ИЛИ Свойство = "sunset" Тогда
 Возврат ПрочитатьДатуJSON("new Date("+Формат(Значение, "ЧГ=")+")", ФорматДатыJSON.JavaScript);
 КонецЕсли;
 Если Свойство = "pressure" Тогда
 Возврат Значение*0.75;
 КонецЕсли;
 Если Свойство = "temp" Тогда
 Возврат Значение-273.15;
 КонецЕсли;
 Если Свойство = "speed" Тогда
 Возврат Значение*1.61;
 КонецЕсли;
 КонецФункции
 &НаСервере
 Процедура ЧтениеНаСервере()
 Чтение = Новый ЧтениеJSON;
 Чтение.ОткрытьФайл("c:tempweather.json");
 Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
 Чтение.Закрыть();
 КонецПроцедуры

В вышеуказанном примере присутствует особенность – функция восстановления будет вызвана для всех свойств, которые будут обнаружены в JSON-документе. Это не всегда удобно и, кроме того, существенно снижает производительность чтения JSON-документа (за счет вызова функции восстановления). Например, при чтении метеорологических данных нам необходимо выполнять особое преобразование только для свойств, в
которых содержится дата и время, а остальные свойства мы конвертировать не собираемся. Чтобы не анализировать в функции восстановления имя реквизита (как в вышеприведенном примере), можно поступить другим способом: явным образом передать в функцию чтения JSON-документа список реквизитов, которые содержат дату и время, а функцию восстановления написать исходя из того, что эта функция будет вызвана только для необходимых свойств. В результате получится следующий код:

&НаСервере
Процедура ЧтениеНаСервере()
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("c:tempweather.json");
Реквизиты = Новый Массив;
Реквизиты.Добавить("dt");
Реквизиты.Добавить("sunrise");
Реквизиты.Добавить("sunset");
Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект, , Реквизиты);
Чтение.Закрыть();
КонецПроцедуры
&НаСервере
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
Возврат ПрочитатьДатуJSON("new Date("+Формат(Значение, "ЧГ=")+")", ФорматДатыJSON.JavaScript);
КонецФункции

Следует обратить внимание, что функция восстановления должна быть объявлена с указанием ключевого слова Экспорт. Также следует помнить, что функция восстановления (в модуле управляемой формы) может быть описана только в «контекстной» части модуля, т. е. с использованием директивы компиляции &НаКлиенте или &НаСервере. При разработке функции восстановления необходимо принимать во внимание тот факт, что свойства документа считываются не в том порядке, как они представлены в файле.
Рассмотрим последовательность, в которой свойства JSON-документа попадают в функцию восстановления. Для этого разместим в таблице каждое свойство файла и то, в каком порядке будет прочитано свойство:

В общем случае, можно сформулировать следующее правило обхода: первым будет прочитано свойство, которому не подчинено ни одно другое свойство. Например, свойству id не подчинено никакое свойство, и оно считывается первым. Однако свойству coord подчинено свойства lon и lat, поэтому вначале будут считаны эти свойства, а лишь затем – свойство coord, которое в качестве значения получит структуру (или соответствие) из подчиненных свойств документа.

3. Работа с XDTO-объектами

3.1. Общая информация

Работа с XDTO-объектами, в основном, ориентирована на обмен информации между системами, написанными на платформе «1С:Предприятие».
Однако сам механизм не накладывает никаких ограничений на его использование для обмена с другими системами.
JSON-сериализация XDTO-объекта выполняется сразу в JSON-документ, без формирования в памяти полной структуры сериализуемых объектов.
Также следует учитывать, что JSON-сериализация «эмулирует» XML-сериализацию, в силу чего получающийся JSON-документ внешне выглядит очень похоже на соответствующий XML-документ.
В JSON-документ могут быть помещены любые объекты системы «1С:Предприятие», для которых указано, что они могут быть сериализованы в XDTO. При попытке выполнить сериализацию значения неподдерживаемого типа будет вызвано исключение.

3.2. Запись

Для того чтобы выполнить запись XDTO-объекта в формате JSON, необходимо использовать (в простейшем случае) следующие объекты:
1. Собственно записываемый объект, поддерживающий преобразование в/из XDTO, например, элемент справочника.
2. Сериализатор XDTO-объектов – СериализаторXDTO;
3. Объект, обеспечивающий низкоуровневую запись данных в формате JSON – ЗаписьJSON.
4. Объект настроек сериализации НастройкиСериализацииJSON.
Собственно сериализация выполняется с помощью метода ЗаписатьJSON() объекта СериализаторXDTO. Рассмотрим пример сериализации данных типа СправочникОбъект. В качестве примера используется справочник Валюты, который содержит поля Курс (типа Число) и ДатаКурса (типа Дата):

 Данные = Справочники.Валюты.НайтиПоКоду("978").ПолучитьОбъект();
 Запись = Новый ЗаписьJSON;
 Запись.ОткрытьФайл("c:tempsimpleXDTOWrite.json");
 СериализаторXDTO.ЗаписатьJSON(Запись, Данные);
 Запись.Закрыть();
 
 В результате работы данный пример сформирует следующий JSON-документ:

{ “#value”: { “Ref”: “5b65bd8e-ea70-11e4-af93-e03f49b16069”, “DeletionMark”: false, “Code”: “978”, “Description”: “Евро”, “Курс”: 54.659, “ДатаКурса”: “2015-04-25T00:00:00” } }

Сериализация значений типа Дата выполняется в формате ISO (определяется механизмом XDTO) и не управляется при записи данных. Также не поддерживается использование функции преобразования при операции сериализации, в отличие от потоковой (см. раздел 16.2.4) и объектной (см. раздел 16.2.2) техник.
Также следует помнить о следующей особенности: при записи объекта не формируется его тип, поэтому после JSON-сериализации XDTO-объекта отсутствует возможность выполнить десериализацию без указания типа считываемого объекта. Предыдущий пример сериализации элемента справочника Валюты будет невозможно десериализовать без явного указания типа значения. Чтобы упростить ситуацию, можно воспользоваться
параметром НазначениеТипаXML метода ЗаписатьJSON() объекта СериализаторXDTO. Если в качестве значения этого параметра указать НазначениеТипаXML.Явное, то появится возможность выполнить десериализацию без явного указания типа, а сформированный файл будет выглядеть следующим образом:

{ “#type”: “jcfg:CatalogObject.Валюты”, “#value”: { “Ref”: “5b65bd8e-ea70-11e4-af93-e03f49b16069”, “DeletionMark”: false, “Code”: “978”, “Description”: “Евро”, “Курс”: 54.659, “ДатаКурса”: “2015-04-25T00:00:00” } }

В данном примере особого внимания заслуживает элемент #type, который и описывает тип текущего элемента. Описание префиксов пространств имен см. приложение
Общие принципы JSON-сериализации объектов XDTO идентичны XML-сериализации:
● Структура данных соответствует структуре XML-документа.
● Имеются незначительные отличия, связанные с особенностями хранения типов и представлением массивов в JSON:
● Порядок и состав свойств определен в модели XDTO и не может быть изменен.
● Если тип записываемого значения однозначно определяется из типа, определенного в         соответствующем свойстве XDTO-модели, то записывается только значение без                    идентификации типа.
● Если тип записываемого значения неоднозначно определяется из типа, определенного       в соответствующем свойстве XDTO-модели (например, значение составного типа), то           значение будет записано в виде сложного объекта JSON с отдельными свойствами для         типа (свойство #type) и значения (свойство #value). В следующем примере записаны           эквивалентные варианты представления значения типа Строка. Первая запись                         используется при неоднозначном определении типа, вторая – при однозначном:

Первая запись
{
“#type”: “jxs:string”,
“#value”: “Строка с примером”
}
Вторая запись
“Строка с примером”
JSON-сериализация объектов XDTO имеет ряд особенностей (по сравнению с XML-сериализацией):

● Коллекции значений (например, значения типа Массив, Структура и т. д.) всегда записываются виде массива JSON.
● Тип значения реквизита записывается в специальное свойство JSON с именем #type.
● Пространство имен типов записывается в специальное свойство JSON с именем #ns:
● Для встроенных в платформу пространств имен типы записываются без использования свойства #ns, но с указанием префикса:
jxс:ChartOfCharacteristicTypesObject.ДемоПланВидовХарактеристик
jxs:string
jxs:decimal

Соответствие префиксов и пространств имен см.в приложении.
● Если встретится схема, которая не имеет префикса, то имя схемы явно записывается с        помощью свойства #ns:

{
"#ns": "http://mycompany.com/data/enterprise/myscheme",
"#type": "СпециальныйОбъект",
"#value": …
}
Значения Неопределено и NULL сериализуются особым образом:
1. Неопределено:
{
"#type": "jv8:Null",
"#value": ""
}
2. NULL:
{
"ИмяРеквизита": null
}

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

{
"#type": "jxs:anyType",
"#value": {
"Filters": {
"Filter": {
"Name": "Recorder",
"Value": {
"#type": "jxs:anySimpleType",
"#value": "acc2d259-c8f3-11e2-b5da-5404a6a68c42"
}
}
},
"Record": {
"Recorder": {
"#type": "jxs:anySimpleType",
"#value": "acc2d259-c8f3-11e2-b5da-5404a6a68c42"
},
"Period": {
"#type": "jxs:anySimpleType",
"#value": "2012-09-08T00:00:00"
},
"Active": {
"#type": "jxs:anySimpleType",
"#value": "true"
},
},
"Record": {
"Recorder": {
"#type": "jxs:anySimpleType",
"#value": "acc2d259-c8f3-11e2-b5da-5404a6a68c42"
},
"Period": {
"#type": "jxs:anySimpleType",
"#value": "2012-09-08T00:00:00"
},
"Active": {
"#type": "jxs:anySimpleType",
"#value": "true"
},
},
}
}
3.3. Чтение

В общем случае, чтение XDTO-объекта из JSON-документа аналогично записи. Чтение выполняется с помощью механизма чтения XDTO-объектов из XML-файла, поэтому чтение выполняется со следующими ограничениями:
● Возможно чтение только тех объектов, для которых существует XDTO-сериализация.
● Свойства в JSON-документе должны следовать в том же порядке, как и в XDTO-объекте.
● В случае если читаемый объект не соответствует схеме – будет вызвано исключение.
● Имеется возможность выполнять чтение произвольного JSON-документа в объект XDTO (ОбъектXDTO) с помощью фабрики XDTO (ФабрикаXDTO). Такое чтение возможно в том случае, если:
● фабрика XDTO, с помощью которой выполняется чтение, «знает» о типах, которые присутствуют в JSON-документе, из которого производится чтение.
● все элементы JSON указаны без явного указания типов и элементов, специфичных для JSON-документов, формируемых при сериализации объектов XDTO.
Выполнить чтение JSON-документа в том случае, если в нем используются типы, которые неизвестны фабрике XDTO, с помощью которой выполняется чтение документа – невозможно.
Рассмотрим пример чтения некоторого JSON-документа, например, полученного при работе примера работы со справочником Валюты из предыдущего раздела .

Чтение = Новый ЧтениеJSON;
 Чтение.ОткрытьФайл("c:tempsimpleXDTOWrite.json");
 Данные = СериализаторXDTO.ПрочитатьJSON(Чтение);
 Чтение.Закрыть();

В результате работы примера в переменно Данные будет помещен объект типа СправочникОбъект.Валюты для валюты с кодом 978. Однако данное поведение будет наблюдаться только в том случае, если при выполнении JSON-сериализация значение параметра НазначениеТипаXML было установлено в значение Явное. В противном случае при попытке чтения (как указано выше) будет вызвано исключение. При чтении объекта с
неявным указанием типа объекта, читаемый тип можно передать в виде параметра метода ПрочитатьJSON(). В этом случае пример будет выглядеть следующим образом:

Чтение = Новый ЧтениеJSON;
 Чтение.ОткрытьФайл("c:tempsimpleXDTOWrite.json");
 Данные = СериализаторXDTO.ПрочитатьJSON(Чтение, Тип("СправочникОбъект.Валюты"));
 Чтение.Закрыть();

При обмене данными между прикладными решениями с помощью объектов XDTO может возникать задача, когда требуется выполнить некоторую предобработку данных, которые поступают в пакете обмена. Например, заменить любое значение некоторого типа на фиксированное значение того же типа. Для упрощения такой предобработки предназначена функция восстановления. Имя функции восстановления передается в
функцию чтения из JSON-документа для сериализатора или фабрики XDTO. При чтении объекта функция восстановления будет вызываться при десериализации значений следующих типов:
● Булево;
● Число;
● Строка;
● Дата;
● УникальныйИдентификатор;
● ДвоичныеДанные;
● ХранилищеЗначения;
● Значения перечислений;
● Значения системных перечислений;
● Ссылки на объекты базы данных.
Для значений Неопределено функция восстановления не вызывается.
При разработке функции восстановления необходимо помнить, что в этой функции можно заменить значение, которое считано из JSON-документа, но нельзя изменить тип считываемого объекта. Функция восстановления также не будет вызываться для служебных свойств, которые создаются и используются системой «1С:Предприятие», например, #type, #ns и т. д.

4. Потоковая техника работы

4.1. Общая информация

Потоковая техника работы с документом ориентирована на то, что документ целиком не загружается в память и обрабатывается последовательно, от элемента к элементу. Например, если надо прочитать только какой-то объект из JSON-документа, то потоковая техника может дать существенный выигрыш, особенно в том случае, если требуемый элемент находится в начале обрабатываемого документа.

4.2. Запись

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

Рассмотрим простой пример записи документа:

ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру = Истина;
Запись.ОткрытьФайл("c:tempstreamWrite.json", , , ПараметрыJSON);
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("ДлинаЗаписи");
Запись.ЗаписатьЗначение(20);
Запись.ЗаписатьИмяСвойства("Товар");
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("Код");
Запись.ЗаписатьЗначение("0020");
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение("Товар");
Запись.ЗаписатьКонецОбъекта();
Запись.ЗаписатьИмяСвойства("МассивЧисел");
Запись.ЗаписатьНачалоМассива();
Запись.ЗаписатьЗначение(3.141592654, Истина);
Запись.ЗаписатьЗначение(2.718281828, Ложь);
Запись.ЗаписатьКонецМассива();
Запись.ЗаписатьКонецОбъекта();
Запись.Закрыть();

В результате исполнения этого программного кода будет сформирован следующий документ:

{
"ДлинаЗаписи": 20,
"Товар": {
"Код": "0020",
"Наименование": "Товар"
},
"МассивЧисел": [
3.141592654E0,
2.718281828
]
}

Такой формат документа удобен для визуального просмотра, но занимает больше места. Можно изменить значение первого параметра конструктора ПараметрыЗаписиJSON на значение ПереносСтрокJSON.Нет и результирующий документ примет такой вид (разница составит примерно 20%):

{“ДлинаЗаписи”:20,”Товар”:{“Код”:”0020″,”Наименование”:”Товар”},”МассивЧисел”:[3.141592654E0,2.718281828]}
Если необходимо получить JSON-документ без формирования файла, то можно использовать метод УстановитьСтроку() объекта ЗаписьJSON.
После вызова этого метода, для получения строки со сформированным JSON-документом, достаточно просто завершить запись документа методом Закрыть() объекта ЗаписьJSON:

ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, ” “, Истина);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(ПараметрыJSON);

Документ = Запись.Закрыть();
Теперь данный документ (из переменной Документ) можно передавать, например, в тело HTTP-запроса.

4.3. Чтение

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

Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("c:tempstreamWrite.json");
Пока Чтение.Прочитать() Цикл
Сообщить("Тип текущего элемента " + Чтение.ТипТекущегоЗначения);
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
Сообщить("Имя = " + Чтение.ТекущееЗначение);
КонецЕсли;
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Булево Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Комментарий Тогда
Сообщить("Значение = " + Чтение.ТекущееЗначение);
КонецЕсли;
 КонецЦикла;
Чтение.Закрыть();

Тогда при чтении документа, сформированного при рассмотрении потоковой записи JSON-документа , будет сформирован следующий результат:

Тип текущего элемента Начало объекта
Тип текущего элемента Имя свойства
Имя = ДлинаЗаписи
Тип текущего элемента Число
Значение = 20
Тип текущего элемента Имя свойства
Имя = Товар
Тип текущего элемента Начало объекта
Тип текущего элемента Имя свойства
Имя = Код
Тип текущего элемента Строка
Значение = 0020
Тип текущего элемента Имя свойства
Имя = Наименование
Тип текущего элемента Строка
Значение = Товар
Тип текущего элемента Конец объекта
Тип текущего элемента Имя свойства
Имя = МассивЧисел
Тип текущего элемента Начало массива
Тип текущего элемента Число
Значение = 3,141592654
Тип текущего элемента Число
Значение = 2,718281828
Тип текущего элемента Конец массива
Тип текущего элемента Конец объекта5. Совмещение техник

Для упрощения работы с JSON, можно совмещать различные техники при формировании одного документа. Например, необходимо сформировать документ, который содержит в себе некоторый набор структур и массив. В этом случае можно все оформление документа
выполнять с помощью потоковой техники, а уже готовые структуры и массив записывать с помощью объектной техники. Важно только обеспечить корректную структуру документа перед началом объектной записи.
Приведем пример совмещения техник на следующем примере:
● В ответ на запрос внешней системы, этой системе необходимо возвращать список заказов.
● Список должен содержать дату формирования и набор заказов (соответствующий некоторому критерию).
● Каждый заказ описывается следующими параметрами:
1. Номер заказа;
2. Дата формирования заказа;
3. Контрагент по заказу;
4. Уникальный идентификатор заказа, по которому впоследствии можно получить всю информацию по заказу.
Фрагмент кода на встроенном языке, который формирует JSON-документ, будет иметь следующий вид:

НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
НастройкиСериализации.ФорматСериализацииДат = ФорматДатыJSON.ISO;
НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Истина;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру = Истина;
Запись.ОткрытьФайл("c:tempcombinedWrite.json", , , ПараметрыJSON);
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("ДатаФормирования");
Запись.ЗаписатьЗначение(ЗаписатьДатуJSON(КогдаСформировано, ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата));
Запись.ЗаписатьИмяСвойства("Заказы");
Заказы = Новый Массив;
Для каждого Заказ Из СписокЗаказов Цикл
ОписаниеЗаказа = Новый Структура("Ссылка, Номер, Дата, Контрагент");
ОписаниеЗаказа.Ссылка = Строка(Заказ.Ссылка);
ОписаниеЗаказа.Номер = Заказ.Номер;
ОписаниеЗаказа.Дата = Заказ.Дата;
ОписаниеЗаказа.Контрагент = Строка(Заказ.Контрагент);
Заказы.Добавить(ОписаниеЗаказа);
КонецЦикла;
ЗаписатьJSON(Запись, Заказы, НастройкиСериализации);
Запись.ЗаписатьКонецОбъекта();
Запись.Закрыть();

При исполнении данного кода предполагается, что:
● Переменная КогдаСформировано содержит значение типа Дата. Содержит дату и время формирования JSON-документа.
● Переменная СписокЗаказов является массивом ссылок на документы заказов.
Исполнение данного код приведет к формированию следующего JSON-документа:

{
"ДатаФормирования": "2014-10-06T12:57:35Z",
"Заказы": {
"0": {
"Ссылка": "f4d1495a-02b5-4d56-92c6-840c11dfb592",
"Номер": 234,
"Дата": "2014-09-30T20:00:00Z",
"Контрагент": "Иванов И.И."
},
"1": {
"Ссылка": "ee821799-2d57-475e-a330-f414e53b8bda",
"Номер": 436,
"Дата": "2014-09-24T20:00:00Z",
"Контрагент": "Петров А.П."
},
"2": {
"Ссылка": "e058a5a8-3c0d-453b-8b1c-963a35fe2b7a",
"Номер": 118,
"Дата": "2014-08-31T20:00:00Z",
"Контрагент": "Иванов И.И."
}
}
}

Изменяя значения параметров объектов НастройкиСериализации и ПараметрыJSON, а также манипулируя параметрами метода ЗаписатьДатуJSON(), можно изменять результирующий JSON-документ для максимального соответствия «ожиданиям» принимающей системы.

Приложение . Префиксы пространств имен при JSON-сериализации

Префиксы пространств имен


добрый день. Хотел попросить помощь у опытных спецов, кои я уверен являются форумчане. В версии 8.3 появился такой формат как JSON. Мне интересно есть ли какой нибудь стандартный парсер для json формата. Ну к примеру что бы результат запроса автоматически в JSON формат, или же придется как и в xml все ручками писать. Ну к примеру в javascript есть автоматический парсер из json в многомерный массив и наоборот. Есть ли стандартные средства в 8.3?

Сериализуемые объекты 1С можно автоматом сериализовать в JSON через СериализаторXDTO

ок , можно пример? вот простенький запрос, результат выводится в тз. Можно ли сразу тз в json формат перевести?

В таблицу значений и уже потом ее в JSON. результат запроса не сериализуется

{HTTPСервис.users.Модуль}: Метод объекта не обнаружен (ЗаписатьJSON) нет у СериализаторXDTO метода ЗаписьJSON

8.3.6.2390 нужно обновится до 8.3.7?

Реализовано в версии 8.3.7.1759

ок сейчас обновлю попробую

а еще просвятите — 8.3.8 — это ведь 8.3.7+, или 8.3.6+, минуя фишечки 8.3.7?

8.3.8 тоже мертво рожденая,8.3.9 (и уже моячит 8.3.10)

так, то есть качать все-таки 8.3.7… ок

Да не я вот впродакш 8.3.8 не пускал, но работаю (конфы обновляю, конфигурю) и кое где действительно шустро работает

а JSON в ней и вот это все?

8.3 по порядку развивается, а вот 8.4 уже совсем другая история. Но там пока альфа

2 а, все, сенкс… 8.4, точно…

обновил пробую зайти на hhtp сервис вот что пишет 1C:Enterprise 8 application error: Ошибка при разборе дескриптора виртуальных ресурсов by reason: Ошибка преобразования данных XDTO: НачалоСвойства: protocol    Форма: Атрибут    Тип: {

А для каких целей вы используете JSON? У вас стороннее приложение на вход принимает JSON от 1С?

да, есть веб интерфейс написанный на webix, должен принимать данные в формате json

Тогда нужно использовать обычную функцию ЗаписатьJson без всяких серилизаторов В формате JSON допускается записывать только значения следующих типов: Строка, Число, Булево, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, ФиксированноеСоответствие.

а что за строчка ? ЗаписьJSON.ОткрытьФайл(«ИмяФайла»,,,ПараметрыЗаписиJSON); я же не со стороннего файла считываю json а с Тз

в общем для ясности цель такая выгружать результаты запросов (естественно в ТЗ) через post запрос ,так что бы не приходилось парсить каждый запрос, а просто выгрузить его и передать стандартными средствами в формате json

Ты это ТЗ с сервера 1С на клиент передать не можешь, при этом хочешь чтоб сторонний сервис их понимал. ТЗ не сериализуется — передавай массив структур в Json.

+ Да, заведи себе процедурку в общем серверном модуле, которая будет из ТЗ делать массив структур. То есть запросы выгружаешь в ТЗ, ТЗ — в массив структур и уже последний сериализуешь в джейсон. 2 Ну, в объет ХДТО ТЗ все-таки серализуется

так цель в том что бы стандартными средствами перевести тз в json и далее передать данные по hhtp запросу. вот что я написал по причине: Ошибка доступа к файлу ‘ИмяФайла’

2 Чувак, тебе в посте все буквы видны?

да, но выходит тз нельзя записать в json?

2 а в -м посте какие буквы не видны?

ок, буду передавать массив, тз отпадает другой вопрос, выдает ошибку {Форма.Форма.Форма}: Ошибка при вызове метода контекста (ОткрытьФайл)     ЗаписьJSON.ОткрытьФайл(«ИмяФайла»,,,ПараметрыЗаписиJSON); по причине: Ошибка доступа к файлу ‘ИмяФайла’

Да с ним бесполезно. Он даже название протокола (hhtp) нормально написать не может.

arsik во первых я пишу быстро, а во вторых не старайся зайти за умного. Я поднял интересный вопрос на который мало инфомации в интернете.Хочешь показаться крутым программером, напиши по делу а потом макай в какашки

«интересный вопрос на который мало инфомации в интернете» Это вдвойне смешнее.

я тебе сокращю время изыди в общем.Не понимаю к чему эти понты? Не хочешь помочь пройди мимо

Американский форум. Задаёшь вопрос, потом тебе отвечают. Израильский форум. Задаёшь вопрос, потом тебе задают вопрос. Русский форум. Задаёшь вопрос, потом тебе долго рассказывают, какой ты дурак.

Тебе выше уже все объяснили. Если бы внимательно смотрел в свой код, давно бы уже ошибку нашел.

arsik я уже понял что тз нельзя передавать в json.У меня сейчас другая ошибка

в общем переделал так &НаСервере но выдает ту же ошибку {Форма.Форма.Форма}: Ошибка при вызове метода контекста (ОткрытьФайл)     ЗаписьJSON.ОткрытьФайл(«ИмяФайла»,,,Новый ПараметрыЗаписиJSON( ,Символы.Таб)); по причине: Ошибка доступа к файлу ‘ИмяФайла’

2 ну неужели непонятно, что нет такого файла? Или ты надеешься на то, что примерный код данный тебе на форуме, заработает после копипасты?

Живой Ископаемый получается мне нужно создать какой то промежуточный файл что бы сначала туда записался json ?

zva пишет Передано значение недопустимого типа хотя передал массив в второй параметр

2 то есть не станешь пробовать потому что очень просто? я просто не успеваю прямо сейчас тебе помочь…

2 попробуй сначала на массиве, в котором будет будет строка и число например…

Живой Ископаемый спасибо тебе, я понял. Вот нахера такие сложности делать, мне нафиг не нужен промежуточный файл. Нужен запрос -ответ. А получается что то вроде лога. Нафига

к сожалению 1с все таки громоздкий язык, при всех его преимущетствах жутко громоздкий синтаксис с кучей не нужных конструкций.

Ты так думаешь, потому что на Objective-C не писал… или даже не читал

ну при всей противоречивости жабыскрипта, хотя бы не чешешь левой рукой правое ухо

«мне нафиг не нужен промежуточный файл. Нужен запрос -ответ. А получается что то вроде лога. Нафига» Получается ровно то, что написал… Не нужен промежуточный файл — не используй…

zva спасибо, то что нужно вообще спасибо всем кто помогает

Есть метод ПрочитатьJSON, и не нужно читать в цикле. Про запись не в курсе, вроде нет такого

2 тут тоже не чешешь. в 1C наоборот все strightforward. Разве что в новых типовых и БСП уже есть какие-то более сложные паттерны

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

0 / 0 / 0

Регистрация: 29.08.2021

Сообщений: 3

1

04.09.2021, 13:06. Показов 598. Ответов 1


http запросы в 1С

В браузере показывает вот такую ошибку помогите ее решить плз
{ОбщийМодуль.ОбщийМодуль.Модуль(43)}: Ошибка при вызове метода контекста (ЗаписатьJSON)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

04.09.2021, 13:06

Ответы с готовыми решениями:

www-http сниффер. Как отследить HTTP запросы?
Посмотрел я вот эту статью: …

Http запросы
Стоит такая задача, надо вбить в это поле на сайте номер телефона после чего поставить галочку и…

HTTP-запросы
Есть такой код отправки GET запроса на api.vk.com (взял лишь для примера):
#include &lt;winsock2.h&gt;…

http запросы
В чем разница http запросов get,put,post и т.д.
А конкретно меня интересуют аннотации в spring т.е…

1

1789 / 1213 / 438

Регистрация: 16.01.2015

Сообщений: 5,349

04.09.2021, 14:07

2

Jusup,
Читаем СП:

ЗаписатьJSON (WriteJSON)
Синтаксис:
ЗаписатьJSON(<ЗаписьJSON>, <Значение>, <НастройкиСериализации>, <ИмяФункцииПреобразования>, <МодульФункцииПреобразования>, <ДополнительныеПараметрыФункцииПреобразования>)
Параметры:
<ЗаписьJSON> (обязательный)
Тип: ЗаписьJSON.
Объект, через который осуществляется запись JSON. Поток JSON должен быть подготовлен для записи значения.
<Значение> (обязательный)
Тип: Произвольный.
Объект записи JSON. Меняет состояние потока записи.
Представляет собой значение произвольного типа.
В формате JSON допускается записывать только значения следующих типов:
Строка,
Число,
Булево,
Дата (преобразованная в строку),
Массив,
ФиксированныйМассив,
Структура,
ФиксированнаяСтруктура,
Соответствие,
ФиксированноеСоответствие.

У тебя несоответствие передаваемых типов. Не может JSON писать Ссылки. Убери Ссылку из структуры и все наладится с Записью.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

04.09.2021, 14:07

Помогаю со студенческими работами здесь

Haskell и HTTP запросы
Здравствуйте.
В HTTP запросах, насколько я понимаю, можно использовать в обычном виде только…

post (http запросы)
Здравствуйте, помогите мне пожалуйста разобраться с post запросами на моем vds с О.С centos, дело в…

Http post и get запросы
Доброго дня.
Начал осваивать для себя кардинально новый раздел.
Хочу делать из VB6 http post и…

Не уходят HTTP запросы
Ребят, такая проблема: написал прогу давно уже, работает с HTTP (Post), так же в запросе…

Одновременные http запросы
Доброго времени суток!!!
Нужно постоянно опрашивать одновременно 25 http узлов. Делаю это в разных…

PHP http запросы
r = s.get(&quot;http://admin:tykerb99z@control.charles/session/export-json&quot;, proxies={‘http’:…

Мусорные HTTP запросы
Недавно разрешил извне подключаться к своему HTTP серверу и сразу обратил внимание, что в логах…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

А можете что-то прокомментировать про Navision и Axapta в связи с уходом Microsoft? Про Navision знаю попытку разработки его «специфичного аналога» путём адаптации C/AL под — барабанная дробь! — диалект FreePascal с последующим использованием Lazarus вместо Object Designer. Но попытка успехом не увенчалась, хотя кастомные исходники, накопленные за 10 лет, можно переносить через ctrl+C/ctrl+V.

Комментарий пока не оценивали

0

С Navision лучше на продукты 1С переходить — ничего не потеряете — это системы одного класса — причём 1С Предприятие 8 будет во многом превосходить! Но да — переход кардинальный — особо простым не будет — и готовьтесь многое дорабатывать! Но ничего прям особо сложного нет — куча франчей 1С вас за год переведут!

С Axapta — не шибко сложнее — да, она поасштабнее, да там код понавороченнее писать можно — но это всё ерунда — всё-равно всё переписывать! Жаль только в 1С ООП нет и архитектуру программного построения алгоритмов и бизнес-логики придётся изучать заново в рамках очень ограниченного языка 1С Предприятие 8 и адаптироваться к уже готовой архитекутре прикладных решений — но это не значит, что там всё так уж плохо — просто нужно время на привыкание — отправьте сотрудников на курсы — пусть познакомятся! Посмотрите видео в сети Интернет!

Проект Lazarus  — по-моему давно скорее мёртв чем жив — думать о нём Вам точно не стоит! Да и это всего лишь IDE.

А разрабатывать платформу ERP сейчас имеет смысл только на кроссплатформенных фреймворках и платформах — как .NET и JVM — а ЯП выбирается по вкусу — но это будет C#, F#, Java, Kotlin (для вебморды ещё понадобится JavaScript/TypeScript и WebAssembly — хотя ASP.NET Blazor позволяет обходится одним C# — но там есть свои нюансы)

Да и смысл — в бесплатности? По сравнению со стоимостью решений Navision — цена вопроса решений на 1С Предприятие 8 просто смехотворна! Как и цена сопровождения — а вот объёмы сопровождения да — будут на порядок больше! Но тем не менее на продуктах 1С 3-4 программиста вполне себе тянут десятки модифицированных типовых и самописных конфигураций в относительно крупных холдингах — по сложным вещам обращаясь к партнёрам 1С!

Вот с продуктами SAP всё куда печальнее — система 1С Предприятие никак в полной мере не может являться полноценной заменой — уровень проработки и производительности решений не совсем тот! Но куда деваться то…. в других российских ERP (по слухам) всё ещё хуже…

А писать «с нуля» ERP замену SAP, наверное, может себе позволить только Ростех — но пока он не в состоянии найти жалкие 3-4 ярда рублей на куда более простое ПО — создание 3D движка! А на создание ERP уровня SAP нужны ярды вложений ежегодно лет так 10 минимум — и всё-равно поделка выйдет!

Всего голосов 5: ↑4 и ↓1

+3

1C ERP очень не рекомендую, обновления постоянно выходят. Поподробнее в статье.

Всего голосов 3: ↑2 и ↓1

+1

Давать ссыклу на статью 2014 года в ИТ, несколько некомпетентрно. Отрасль меняется еже частно.

Всего голосов 3: ↑1 и ↓2

-1

За отрасль не скажу, а в 1с ситуация та же самая.

https://forum.mista.ru/topic.php?id=872615&page=1

1с доработали адреса в формате фиас и понеслось.
После обновления на УПП 166.2 возникло несколько проблем с заполнением адресов.

1. В контрагенте при сохранении адреса выдается ошибка, когда пытаешься установить номер квартиры, а слово Квартира не выбирается..
ОбщийМодуль.УправлениеКонтактнойИнформациейСлужебный.Модуль(225)}: Ошибка при вызове метода контекста (ЗаписатьJSON)
ЗаписатьJSON(ЗаписьJSON, Значение,, «АдаптацияПолейКонтактнойИнформации», УправлениеКонтактнойИнформациейСлужебный);
по причине:
Передано значение недопустимого типа

2. В документе больничного при попытке выбрать адрес мед. заведения выдается ошибка:
{Обработка.РедактированиеКонтактнойИнформации.МодульОбъекта(236)}: Поле объекта не обнаружено (ПанельНастроекАдреса)
ФормаРедактированияАдреса.ЭлементыФормы.ПанельНастроекАдреса.Свертка = РежимСверткиЭлементаУправления.Верх;

3. При открытии Классификатора из адресной строки физ лица:
{ОбщийМодуль.ДлительныеОперацииКлиент.Модуль(260)}: Тип не определен (ФормаКлиентскогоПриложения)
            ТипыСвойств.Вставить(«ФормаВладелец», Тип(«ФормаКлиентскогоПриложения»));

Даже как-то странно. такое количество ошибок, либо они вообще ничего не тестировали, просто накатили обнову и отправили людям.
У кого нибудь есть такие проблемы? Погуглил, таких ошибок не нашел.

https://forum.mista.ru/topic.php?id=882733

Неожиданно негаданно на 3 день после обновления, оборотная сальдовая ведомость разъехалась, как выяснилось после обновления ночью запустилось регламентное задание, которое на создавало «Регламентная операция» датами 31.12.2021 23:59:59 и 31.12.2020 23:59:59 при том по несколько штук, а дальше веселее начиная с 2017 года отредактированы «Реализация (акт, накладная, УПД)» при том не все где-то 5% от общего объема, так же у документов «Перевод ОС в малоценное оборудование» убраны все движения

НО вишенка на торте, тот кто обновлял не сделал Резервную копию, а регламентное копирование встало ещё в 10.08.2022
Такие дела с обновлением 1С БП 3.0.121.31

Всего голосов 1: ↑1 и ↓0

+1

Соглашусь 50/50, в любом коде могут быть ошибки.

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

А приведенные примеры могут быть локальными и ошибки возникли из-за учета данных. Это не массовые обрашения. И нужно разбираться, прежде чем предъявлять.

«по гуглил, таких ошибок не нашел»

Всего голосов 2: ↑1 и ↓1

0

В экосистеме продуктов 1С ежегодно почти ничего не меняется! Хотя да — мелкими шажками платформа развивается — но именно на конфигурациях это никак не сказывается — живут параллельной жизнью. Да и архитектура построения конфигураций со времён Такси желает не просто лучшего — желает полного 100% пересмотра всей концепции — но — видать идеология у партии иная — так что ждать ничего хорошо не приходится!

Всего голосов 1: ↑1 и ↓0

+1

А проблемы у 1С как были, так и остаются, то, что написано в статье — справедливо и сейчас. И проблемы эти тянутся аж с середины 90-х годов.

(Сам много писал на 1С, а также делал учетные системы на Delphi и C#)

Комментарий пока не оценивали

0

Пустая статья. Такой интригующий заголовок «Днем с огнём: как дела у отечественных ERP?» и никакого ответа! Вообще — даже попытки нет — просто тупо призыв к сообществу сами всё написать!

«Мы ничего не знаем — расскажите нам что знаете ВЫ, а лучше — приходите к нам на работу»

Всего голосов 10: ↑10 и ↓0

+10

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

Всего голосов 1: ↑1 и ↓0

+1

Да всё Я понял. Люди сюда приходят, в первую очередь почитать, а потом, при желании (если статья заинтриговала) — пообсуждать. Но без обсуждать пустую сетью — мало кто захочет

Всего голосов 1: ↑1 и ↓0

+1

SAP, по официальным данным, занимал более 40% отечественного рынка ПО для автоматизации крупного бибизнеса

После данной фразы становится понятен уровень анализа в статье.

А не хотите уточнить 40% от какого показателя? По сумме? По числу автоматизированных рабочих мест? Или может по объёму спирта в растворе?

Комментарий пока не оценивали

0

Здравствуйте, более 40% — считается доля отечественного рынка ПО для автоматизации бизнеса в денежном выражении, таковы результаты исследования IDC рынка комплексной автоматизации предприятий в России за 2020 год.

Всего голосов 2: ↑2 и ↓0

+2

Добрый день! Именно так.
Стоимость лицензий и проектов SAP всегда была значительно выше. Измерять в деньгах — так же «логично», как по совокупной стоимости авто (в разрезе брэндов Lexus, Mersedes, Lada…) делать вывод о доле автомобилей, на которых передвигается население страны.
Если же измерять в количестве автоматизированных рабочих мест, то доля 1С уже давно превысила 90% на отечественном рынке автоматизации бизнеса. А это, согласитесь, совсем иной расклад. И в текущих реалиях, полагаю приближается к 95%.
Хорошо это или нет — это отдельная тема для обсуждения. Но это важно учитывать при выборе ПО.

Комментарий пока не оценивали

0

Вот оставшимся примерно 5% эта 1С ну никак не подходит! И они на неё никогда не перейдут (по крайней мере целиком). Именно эти несколько процентов сейчас мечутся и думают что делать и что использовать дальше, кроме 1С — именно у них самые большие проблемы — и да -у них же и самые большие деньги!

Комментарий пока не оценивали

0

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 
разработка 

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста записать нарушение прав доступа
  • Ошибка при включении компонента windows netfx3 sql server 2012
  • Ошибка при вызове метода контекста записать запись не верна
  • Ошибка при входе не удалось наладить безопасное соединение яндекс музыка ipad
  • Ошибка при вводе промокода лол