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

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

Формат 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-сериализации

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


  

KemerovIvan

25.09.20 — 14:56

Вопрос вот в чем.

В интернете нашел статью как делать сериализацию одного документа. Но когда пытаюсь сделать на несколько документов, выдает ошибку. Каким образом сделать это?!

//Сериализация

Процедура ЗаписьJSON()

    

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

    //Или в строку

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

    //Или в файл

    ЗаписьJSON.ОткрытьФайл(«C:test.txt»);

    

    Номенклатура = Справочники.Номенклатура.НайтиПоКоду(«00000000001»).ПолучитьОбъект();

    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Номенклатура, НазначениеТипаXML.Явное);

    
    СериализованнаяСтрока = ЗаписьJSON.Закрыть();

    
КонецПроцедуры

//Десериализация

Процедура ЧтениеJSON()

    

    ЧтениеJSON = Новый ЧтениеJSON;

    //Или из строки

    ЧтениеJSON.УстановитьСтроку(«»);

    //Или из файла    

    ЧтениеJSON.ОткрытьФайл(«C:test.txt»);

        
    Номенклатура = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);    

    
    ЧтениеJSON.Закрыть();

        
КонецПроцедуры

  

KemerovIvan

1 — 25.09.20 — 14:57

Хоть справочники, хоть документы. Везде выдает ошибку

  

Ёпрст

2 — 25.09.20 — 14:58

(0) в этом коде нет записи документа в жсон.

  

KemerovIvan

3 — 25.09.20 — 14:59

(2) разве?

  

Ёпрст

4 — 25.09.20 — 15:00

(3) железобетонно

  

KemerovIvan

5 — 25.09.20 — 15:00

Вот создание: ЗаписьJSON = Новый ЗаписьJSON;

Вот в какой файл: ЗаписьJSON.ОткрытьФайл(«C:test.txt»);

Вот запись: СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Номенклатура, НазначениеТипаXML.Явное);

Вот закрытие: СериализованнаяСтрока = ЗаписьJSON.Закрыть();

  

KemerovIvan

6 — 25.09.20 — 15:01

(4) каким образом тогда должен быть создан JSON?

  

Ёпрст

7 — 25.09.20 — 15:01

(5) Где в этом коде ДОКУМЕНТ ?

  

Ёпрст

8 — 25.09.20 — 15:02

И где в этом коде твои НЕСКОЛЬКО документов, которые не работают ?

  

KemerovIvan

9 — 25.09.20 — 15:02

(7) Так ясно

Придиры приперли

  

KemerovIvan

10 — 25.09.20 — 15:02

это код из статьи

  

tan76

11 — 25.09.20 — 15:03

(0) Документы в массив, массив в JSON, и получать объект не нужно

  

KemerovIvan

12 — 25.09.20 — 15:03

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

    ПараметрыЗаписиJSON = новый ПараметрыЗаписиJSON(, Символы.Таб);

    ЗаписьJSON.ОткрытьФайл(«c:11.json»,,,ПараметрыЗаписиJSON);

    Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Обмен.Ссылка КАК Ссылка

        |ИЗ

        |    Документ.Обмен КАК Обмен»;

    
    РезультатЗапроса = Запрос.Выполнить();

    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

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

    КонецЦикла;

    
    ЗаписьJSON.Закрыть();

  

KemerovIvan

13 — 25.09.20 — 15:04

Из массива он потом не читает (11)

  

KemerovIvan

14 — 25.09.20 — 15:04

пробовал через массив

  

Ёпрст

15 — 25.09.20 — 15:08

(12) выкинь ПолучитьОбъект() из кода, для начала

  

Ёпрст

16 — 25.09.20 — 15:08

и установитьСтроку после записи

  

Ёпрст

17 — 25.09.20 — 15:10

  Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВыборкаДетальныеЗаписи.Ссылка,НазначениеТипаXML.Явное);
    КонецЦикла;
 сообщить(ЗаписатьJSON.Закрыть());

  

KemerovIvan

18 — 25.09.20 — 15:14

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

  

KemerovIvan

19 — 25.09.20 — 15:14

Такую ошибку выдает

  

KemerovIvan

20 — 25.09.20 — 15:22

Больше вариантов ни у кого нет?

  

Ёпрст

21 — 25.09.20 — 15:32

Точное описание ошибки какое?

  

Ёпрст

22 — 25.09.20 — 15:32

Этот код выполняется где?

  

KemerovIvan

23 — 25.09.20 — 15:35

в http Сервисе (22)

  

Ёпрст

24 — 25.09.20 — 15:39

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

  

KemerovIvan

25 — 25.09.20 — 15:45

(24) Ничего не поменялось, все так же висит ошибка

  

Ёпрст

26 — 25.09.20 — 15:59

Если подсунуть простой тип, строку «вася», например, работает? Заместо ссылки дока

  

KemerovIvan

27 — 25.09.20 — 16:01

(26) Если отправить только один документ, все работает. Но как только начинаю отправлять несколько документов то все ломается

  

zuza

28 — 25.09.20 — 16:35

(18) очепятка в (17), поэтому и ошибка

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

    КонецЦикла;

сообщить(ЗаписьJSON.Закрыть());

  

KemerovIvan

29 — 25.09.20 — 17:08

(28) Какая опечатка? Я вписал то что вы отправили, все равно такая же ошибка.

  

Ёпрст

30 — 25.09.20 — 18:22

(27) так, не работает ?

    ВыборкаДетальныеЗаписи = мРезультатЗапроса.Выбрать();
    МассивJSON = Новый Массив;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        МассивJSON.Добавить(ВыборкаДетальныеЗаписи.ССылка);
    КонецЦикла;
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивJSON,НазначениеТипаXML.Явное);
    Сообщить(ЗаписьJSON.Закрыть());

  

KemerovIvan

31 — 28.09.20 — 09:11

(30) Ооо работает.

Но возникла новая проблема. Когда внутри одной базы я Сериализую, а потом считываю, он все показывает. Но когда передаю в другую базу через HTTP сервис то там не пишется ссылка не найдена

    Соединение = Новый HTTPСоединение(«localhost/test/hs/js/json»);

    Запрос = Новый HTTPЗапрос(«/»);

    Ответ = Соединение.Получить(Запрос);

    Данные = Ответ.ПолучитьТелоКакСтроку();

    

         Чтение = Новый ЧтениеJSON;

    Чтение.УстановитьСтроку(Данные);

    ДанныеJSON = СериализаторXDTO.ПрочитатьJSON(Чтение);

    Чтение.Закрыть();

  

KemerovIvan

32 — 28.09.20 — 09:11

Вот такой код что бы прочитать

  

KemerovIvan

33 — 28.09.20 — 09:12

Может я что то не так делаю?

  

KemerovIvan

34 — 28.09.20 — 09:15

Пишет на каждой строке объект не найден

  

Garykom

35 — 28.09.20 — 09:22

(33) Угу задачку слишком сложную взял пока не по силам.

  

Garykom

36 — 28.09.20 — 09:23

(34) Дык объекта (в другой базе) нет по ссылке которая в JSON фуй ли шотишь?

  

KemerovIvan

37 — 28.09.20 — 09:34

ну а как мне передать тогда через json все на другую базу?

  

KemerovIvan

38 — 28.09.20 — 09:35

я сделал это через структуры, но мне сказали что можно и делать сериализацию и так сразу документы передавать целиком

  

KemerovIvan

39 — 28.09.20 — 09:36

Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    ОбменВопросы.Ссылка КАК Ссылка,

        |    ОбменВопросы.НомерСтроки КАК НомерСтроки,

        |    ОбменВопросы.Товар КАК Товар,

        |    ОбменВопросы.Цена КАК Цена,

        |    Обмен.Номер КАК Номер

        |ИЗ

        |    Документ.Обмен.Вопросы КАК ОбменВопросы

        |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.Обмен КАК Обмен

        |        ПО ОбменВопросы.Ссылка = Обмен.Ссылка

        |ГДЕ

        |    Обмен.Номер = &Номер»;

    

    //Формируем массив оборудования    

    Обмен = Документы.Обмен.Выбрать();

    

    Колл = Документы.Обмен.Выбрать();

    Количество = 0;

        

    Пока Колл.Следующий() Цикл

        Количество = Количество + 1;

    КонецЦикла;

    МассивОбмен = Новый Массив;

    

    Пока Обмен.Следующий() Цикл

        НомерДокумента = Обмен.Номер;

        

        Запрос.УстановитьПараметр(«Номер», НомерДокумента);    

        РезультатЗапроса = Запрос.Выполнить();     

        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

        СуммаТаб = 0;

        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

            СуммаТаб = СуммаТаб + 1;

        КонецЦикла;

        
        НазваниеДокумента = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название;

        

        ДанныеОбмен = Новый Структура;

        ДанныеОбмен.Вставить(«Название», НазваниеДокумента);

        ДанныеОбмен.Вставить(«Дата», Дата(Обмен.Дата));

        

        тНастройкиСериализации = Новый НастройкиСериализацииJSON;

         тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;

        тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;

        
        ДанныеОбменТЧ = Новый Массив;

        Для Индекс = 0 по СуммаТаб — 1 Цикл

            НазваниеТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Товар;

            ЦенаТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Цена;

            

            ДанныеОбменТЧСтрока = Новый Структура;

            ДанныеОбменТЧСтрока.Вставить(«Товар», НазваниеТовара);

            ДанныеОбменТЧСтрока.Вставить(«Цена», ЦенаТовара);

            НомерСтроки = Индекс + 1;

            ДанныеОбменТЧ.Добавить(ДанныеОбменТЧСтрока);

        КонецЦикла;    

        
        ДанныеОбмен.Вставить(«ТабЧасть», ДанныеОбменТЧ);

        

        МассивОбмен.Добавить(ДанныеОбмен);          

    КонецЦикла;

    

    //Сериализуем массив в JSON

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

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

    ЗаписатьJSON(ЗаписьJOIN, МассивОбмен, тНастройкиСериализации);

    СтрокаДляОтвета = ЗаписьJOIN.Закрыть();

    
    //Сообщить (СтрокаДляОтвета);

    
    //Формируем ответ веб-клиенту

    

    Ответ = Новый HTTPСервисОтвет(200);

    Ответ.Заголовки.Вставить(«Content-type»,»application/JOIN; charset=utf-8″);

    Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета,КодировкаТекста.UTF8,

    ИспользованиеByteOrderMark.НеИспользовать);

    Возврат Ответ;

  

KemerovIvan

40 — 28.09.20 — 09:36

Вот как передаю с помощью структур

  

KemerovIvan

41 — 28.09.20 — 09:37

возможно есть вариант передать все таки по проще?!

  

KemerovIvan

42 — 28.09.20 — 09:38

(36) Может подскажете как сделать вместо сарказма?

  

hhhh

43 — 28.09.20 — 10:48

(42) вот тут у тебя невероятная хрень

Документы.Обмен.НайтиПоНомеру(НомерДокумента)

у метода НайтиПоНомеру должно быть 2 парметра.

  

hhhh

44 — 28.09.20 — 10:53

(42) и вообще, откуда эти номера какие-то? Пиши нормально

       |ГДЕ

        |    Обмен.Ссылка = &Ссылка»;

  

hhhh

45 — 28.09.20 — 10:57

(42) и вот это

Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название

дебилизм какой-то

Пиши в запросе

       |    Обмен.Название КАК Название,

и

НазваниеДокумента = Обмен.Название;

  

KemerovIvan

46 — 28.09.20 — 11:53

(45) Друг, спасибо конечно, но мне не это нужно, а нужно то что бы все документы из одной базы отправить в другую базу. И надо сделать это через http сервис. Спасибо за исправления, учту.

  

KemerovIvan

47 — 28.09.20 — 11:56

Или если есть варианты, как проще это реализовать

  

KemerovIvan

48 — 28.09.20 — 11:57

Но желательно именно через HTTP сервисы

  

KemerovIvan

49 — 28.09.20 — 11:57

Буду очень признателен

  

DexterMorgan

50 — 28.09.20 — 12:46

конфигурации баз одинковые или разные?

  

KemerovIvan

51 — 28.09.20 — 14:10

(50) одинаковые

  

MadJhey

52 — 28.09.20 — 14:40

Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название — это конечно сильно.

Разбить json на блоки по видам документов, для каждого вида документа отдельно написать разбор. Отдельно выгружать ключевые справочники. Передавать примитивные типы (число, строка).

Недавно делал тоже самое (согласовывал номенклатуру, цены, приходы), но через xml. За все документы я бы не взялся, там куча работы по согласованию данных.

  

MadJhey

53 — 28.09.20 — 14:43

Для Индекс = 0 по СуммаТаб — 1 Цикл

            НазваниеТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Товар;

            ЦенаТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Цена;

            
страшно приставить, что покажет парсер SQL на такое, а через запрос сделать не судьба?

  

KemerovIvan

54 — 28.09.20 — 15:11

(53) Я не прошу исправлять тот код, это был первый вариант

  

KemerovIvan

55 — 28.09.20 — 15:11

по HTTP сервисам если есть что добавить, тогда пишите

  

MadJhey

56 — 28.09.20 — 15:23

По думай об верификации переданной информации. Например номенклатура передана успешно — возвращаешь какой — нибудь параметр.  Мне пришлось разбить данные на пакеты, иначе выдавал ошибку по таймингу.

https://xn—-1-bedvffifm4g.xn--p1ai/articles/2017-09-07-exchange-with-internet-services/ — вот целая статья по http

  

KemerovIvan

57 — 29.09.20 — 07:52

(56) Спасибо

получаю ответ на запрос.
Ответ приходит в виде 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с как исправить

Источник

добрый день. Хотел попросить помощь у опытных спецов, кои я уверен являются форумчане. В версии 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

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

   KemerovIvan

25.09.20 — 14:56

Вопрос вот в чем.

В интернете нашел статью как делать сериализацию одного документа. Но когда пытаюсь сделать на несколько документов, выдает ошибку. Каким образом сделать это?!

//Сериализация

Процедура ЗаписьJSON()

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

    //Или в строку

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

    //Или в файл

    ЗаписьJSON.ОткрытьФайл(«C:test.txt»);

    
    Номенклатура = Справочники.Номенклатура.НайтиПоКоду(«00000000001»).ПолучитьОбъект();

    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Номенклатура, НазначениеТипаXML.Явное);

    
    СериализованнаяСтрока = ЗаписьJSON.Закрыть();

    
КонецПроцедуры

//Десериализация

Процедура ЧтениеJSON()

    
    ЧтениеJSON = Новый ЧтениеJSON;

    //Или из строки

    ЧтениеJSON.УстановитьСтроку(«»);

    //Или из файла    

    ЧтениеJSON.ОткрытьФайл(«C:test.txt»);

        
    Номенклатура = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);    

    
    ЧтениеJSON.Закрыть();

        
КонецПроцедуры

   KemerovIvan

1 — 25.09.20 — 14:57

Хоть справочники, хоть документы. Везде выдает ошибку

   Ёпрст

2 — 25.09.20 — 14:58

(0) в этом коде нет записи документа в жсон.

   KemerovIvan

3 — 25.09.20 — 14:59

(2) разве?

   Ёпрст

4 — 25.09.20 — 15:00

(3) железобетонно

   KemerovIvan

5 — 25.09.20 — 15:00

Вот создание: ЗаписьJSON = Новый ЗаписьJSON;

Вот в какой файл: ЗаписьJSON.ОткрытьФайл(«C:test.txt»);

Вот запись: СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Номенклатура, НазначениеТипаXML.Явное);

Вот закрытие: СериализованнаяСтрока = ЗаписьJSON.Закрыть();

   KemerovIvan

6 — 25.09.20 — 15:01

(4) каким образом тогда должен быть создан JSON?

   Ёпрст

7 — 25.09.20 — 15:01

(5) Где в этом коде ДОКУМЕНТ ?

   Ёпрст

8 — 25.09.20 — 15:02

И где в этом коде твои НЕСКОЛЬКО документов, которые не работают ?

   KemerovIvan

9 — 25.09.20 — 15:02

(7) Так ясно

Придиры приперли

   KemerovIvan

10 — 25.09.20 — 15:02

это код из статьи

   tan76

11 — 25.09.20 — 15:03

(0) Документы в массив, массив в JSON, и получать объект не нужно

   KemerovIvan

12 — 25.09.20 — 15:03

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

    ПараметрыЗаписиJSON = новый ПараметрыЗаписиJSON(, Символы.Таб);

    ЗаписьJSON.ОткрытьФайл(«c:11.json»,,,ПараметрыЗаписиJSON);

    Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Обмен.Ссылка КАК Ссылка

        |ИЗ

        |    Документ.Обмен КАК Обмен»;

    
    РезультатЗапроса = Запрос.Выполнить();

    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

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

    КонецЦикла;

    
    ЗаписьJSON.Закрыть();

   KemerovIvan

13 — 25.09.20 — 15:04

Из массива он потом не читает (11)

   KemerovIvan

14 — 25.09.20 — 15:04

пробовал через массив

   Ёпрст

15 — 25.09.20 — 15:08

(12) выкинь ПолучитьОбъект() из кода, для начала

   Ёпрст

16 — 25.09.20 — 15:08

и установитьСтроку после записи

   Ёпрст

17 — 25.09.20 — 15:10

  Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВыборкаДетальныеЗаписи.Ссылка,НазначениеТипаXML.Явное);
    КонецЦикла;
 сообщить(ЗаписатьJSON.Закрыть());
   KemerovIvan

18 — 25.09.20 — 15:14

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

   KemerovIvan

19 — 25.09.20 — 15:14

Такую ошибку выдает

   KemerovIvan

20 — 25.09.20 — 15:22

Больше вариантов ни у кого нет?

   Ёпрст

21 — 25.09.20 — 15:32

Точное описание ошибки какое?

   Ёпрст

22 — 25.09.20 — 15:32

Этот код выполняется где?

   KemerovIvan

23 — 25.09.20 — 15:35

в http Сервисе (22)

   Ёпрст

24 — 25.09.20 — 15:39

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

   KemerovIvan

25 — 25.09.20 — 15:45

(24) Ничего не поменялось, все так же висит ошибка

   Ёпрст

26 — 25.09.20 — 15:59

Если подсунуть простой тип, строку «вася», например, работает? Заместо ссылки дока

   KemerovIvan

27 — 25.09.20 — 16:01

(26) Если отправить только один документ, все работает. Но как только начинаю отправлять несколько документов то все ломается

   zuza

28 — 25.09.20 — 16:35

(18) очепятка в (17), поэтому и ошибка

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

    КонецЦикла;

сообщить(ЗаписьJSON.Закрыть());

   KemerovIvan

29 — 25.09.20 — 17:08

(28) Какая опечатка? Я вписал то что вы отправили, все равно такая же ошибка.

   Ёпрст

30 — 25.09.20 — 18:22

(27) так, не работает ?

    ВыборкаДетальныеЗаписи = мРезультатЗапроса.Выбрать();
    МассивJSON = Новый Массив;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        МассивJSON.Добавить(ВыборкаДетальныеЗаписи.ССылка);
    КонецЦикла;
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивJSON,НазначениеТипаXML.Явное);
    Сообщить(ЗаписьJSON.Закрыть());
   KemerovIvan

31 — 28.09.20 — 09:11

(30) Ооо работает.

Но возникла новая проблема. Когда внутри одной базы я Сериализую, а потом считываю, он все показывает. Но когда передаю в другую базу через HTTP сервис то там не пишется ссылка не найдена

    Соединение = Новый HTTPСоединение(«localhost/test/hs/js/json»);

    Запрос = Новый HTTPЗапрос(«/»);

    Ответ = Соединение.Получить(Запрос);

    Данные = Ответ.ПолучитьТелоКакСтроку();

    
    
    Чтение = Новый ЧтениеJSON;

    Чтение.УстановитьСтроку(Данные);

    ДанныеJSON = СериализаторXDTO.ПрочитатьJSON(Чтение);

    Чтение.Закрыть();

   KemerovIvan

32 — 28.09.20 — 09:11

Вот такой код что бы прочитать

   KemerovIvan

33 — 28.09.20 — 09:12

Может я что то не так делаю?

   KemerovIvan

34 — 28.09.20 — 09:15

Пишет на каждой строке объект не найден

   Garykom

35 — 28.09.20 — 09:22

(33) Угу задачку слишком сложную взял пока не по силам.

   Garykom

36 — 28.09.20 — 09:23

(34) Дык объекта (в другой базе) нет по ссылке которая в JSON фуй ли шотишь?

   KemerovIvan

37 — 28.09.20 — 09:34

ну а как мне передать тогда через json все на другую базу?

   KemerovIvan

38 — 28.09.20 — 09:35

я сделал это через структуры, но мне сказали что можно и делать сериализацию и так сразу документы передавать целиком

   KemerovIvan

39 — 28.09.20 — 09:36

Запрос = Новый Запрос;

    Запрос.Текст =

        «ВЫБРАТЬ

        |    ОбменВопросы.Ссылка КАК Ссылка,

        |    ОбменВопросы.НомерСтроки КАК НомерСтроки,

        |    ОбменВопросы.Товар КАК Товар,

        |    ОбменВопросы.Цена КАК Цена,

        |    Обмен.Номер КАК Номер

        |ИЗ

        |    Документ.Обмен.Вопросы КАК ОбменВопросы

        |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.Обмен КАК Обмен

        |        ПО ОбменВопросы.Ссылка = Обмен.Ссылка

        |ГДЕ

        |    Обмен.Номер = &Номер»;

    
    //Формируем массив оборудования    

    Обмен = Документы.Обмен.Выбрать();

    
    Колл = Документы.Обмен.Выбрать();

    Количество = 0;

        
    Пока Колл.Следующий() Цикл

        Количество = Количество + 1;

    КонецЦикла;

    МассивОбмен = Новый Массив;

    
    Пока Обмен.Следующий() Цикл

        НомерДокумента = Обмен.Номер;

        
        Запрос.УстановитьПараметр(«Номер», НомерДокумента);    

        РезультатЗапроса = Запрос.Выполнить();     

        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

        СуммаТаб = 0;

        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

            СуммаТаб = СуммаТаб + 1;

        КонецЦикла;

        
        НазваниеДокумента = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название;

        
        ДанныеОбмен = Новый Структура;

        ДанныеОбмен.Вставить(«Название», НазваниеДокумента);

        ДанныеОбмен.Вставить(«Дата», Дата(Обмен.Дата));

        
        тНастройкиСериализации = Новый НастройкиСериализацииJSON;

         тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;

        тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;

        
        ДанныеОбменТЧ = Новый Массив;

        Для Индекс = 0 по СуммаТаб — 1 Цикл

            НазваниеТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Товар;

            ЦенаТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Цена;

            
            ДанныеОбменТЧСтрока = Новый Структура;

            ДанныеОбменТЧСтрока.Вставить(«Товар», НазваниеТовара);

            ДанныеОбменТЧСтрока.Вставить(«Цена», ЦенаТовара);

            НомерСтроки = Индекс + 1;

            ДанныеОбменТЧ.Добавить(ДанныеОбменТЧСтрока);

        КонецЦикла;    

        
        ДанныеОбмен.Вставить(«ТабЧасть», ДанныеОбменТЧ);

        
        МассивОбмен.Добавить(ДанныеОбмен);          

    КонецЦикла;

    
    //Сериализуем массив в JSON

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

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

    ЗаписатьJSON(ЗаписьJOIN, МассивОбмен, тНастройкиСериализации);

    СтрокаДляОтвета = ЗаписьJOIN.Закрыть();

    
    //Сообщить (СтрокаДляОтвета);

    
    //Формируем ответ веб-клиенту

    
    Ответ = Новый HTTPСервисОтвет(200);

    Ответ.Заголовки.Вставить(«Content-type»,»application/JOIN; charset=utf-8″);

    Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета,КодировкаТекста.UTF8,

    ИспользованиеByteOrderMark.НеИспользовать);

    Возврат Ответ;

   KemerovIvan

40 — 28.09.20 — 09:36

Вот как передаю с помощью структур

   KemerovIvan

41 — 28.09.20 — 09:37

возможно есть вариант передать все таки по проще?!

   KemerovIvan

42 — 28.09.20 — 09:38

(36) Может подскажете как сделать вместо сарказма?

   hhhh

43 — 28.09.20 — 10:48

(42) вот тут у тебя невероятная хрень

Документы.Обмен.НайтиПоНомеру(НомерДокумента)

у метода НайтиПоНомеру должно быть 2 парметра.

   hhhh

44 — 28.09.20 — 10:53

(42) и вообще, откуда эти номера какие-то? Пиши нормально

       |ГДЕ

        |    Обмен.Ссылка = &Ссылка»;

   hhhh

45 — 28.09.20 — 10:57

(42) и вот это

Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название

дебилизм какой-то

Пиши в запросе

       |    Обмен.Название КАК Название,

и

НазваниеДокумента = Обмен.Название;

   KemerovIvan

46 — 28.09.20 — 11:53

(45) Друг, спасибо конечно, но мне не это нужно, а нужно то что бы все документы из одной базы отправить в другую базу. И надо сделать это через http сервис. Спасибо за исправления, учту.

   KemerovIvan

47 — 28.09.20 — 11:56

Или если есть варианты, как проще это реализовать

   KemerovIvan

48 — 28.09.20 — 11:57

Но желательно именно через HTTP сервисы

   KemerovIvan

49 — 28.09.20 — 11:57

Буду очень признателен

   DexterMorgan

50 — 28.09.20 — 12:46

конфигурации баз одинковые или разные?

   KemerovIvan

51 — 28.09.20 — 14:10

(50) одинаковые

   MadJhey

52 — 28.09.20 — 14:40

Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название — это конечно сильно.

Разбить json на блоки по видам документов, для каждого вида документа отдельно написать разбор. Отдельно выгружать ключевые справочники. Передавать примитивные типы (число, строка).

Недавно делал тоже самое (согласовывал номенклатуру, цены, приходы), но через xml. За все документы я бы не взялся, там куча работы по согласованию данных.

   MadJhey

53 — 28.09.20 — 14:43

Для Индекс = 0 по СуммаТаб — 1 Цикл

            НазваниеТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Товар;

            ЦенаТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Цена;

            
страшно приставить, что покажет парсер SQL на такое, а через запрос сделать не судьба?

   KemerovIvan

54 — 28.09.20 — 15:11

(53) Я не прошу исправлять тот код, это был первый вариант

   KemerovIvan

55 — 28.09.20 — 15:11

по HTTP сервисам если есть что добавить, тогда пишите

   MadJhey

56 — 28.09.20 — 15:23

По думай об верификации переданной информации. Например номенклатура передана успешно — возвращаешь какой — нибудь параметр.  Мне пришлось разбить данные на пакеты, иначе выдавал ошибку по таймингу.

https://xn—-1-bedvffifm4g.xn--p1ai/articles/2017-09-07-exchange-with-internet-services/ — вот целая статья по http

  

KemerovIvan

57 — 29.09.20 — 07:52

(56) Спасибо

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-сериализации

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


0 / 0 / 0

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

Сообщений: 3

1

04.09.2021, 13:06. Показов 808. Ответов 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

1904 / 1304 / 465

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

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

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account

Closed

PerlAmutor opened this issue

Feb 8, 2023

· 1 comment

Labels

отклонено

Изменение программы не планируется

проблема

Неожиданное или неудобное поведение программы

Comments

@PerlAmutor

2023-02-08.20-28-03.mp4

Информация для технической поддержки

Платформа: 8.3.20.1996
Режим БД: файловый
Конфигурация. Название: 1С:ERP Управление предприятием 2 (2.5.8.369)
Конфигурация. Основной режим запуска: Управляемое приложение
Конфигурация. Вариант встроенного языка: Русский
Конфигурация. Режим управления блокировкой данных: Управляемый
Конфигурация. Режим совместимости: Версия8_3_17
Конфигурация. Режим использования синхронных вызовов: Использовать
Конфигурация. Версия БСП: 301
Инструменты разработчика. Версия: Портативный 6.63.1p
Инструменты разработчика. Инструмент: Таблица значений
Инструменты разработчика. Перехват клавиатурного ввода: Да
Инструменты разработчика. Объекты на сервере: Да
Инструменты разработчика. Серверный модуль: Да
Клиент. Приложение: Обычное приложение 64б
Клиент. Проверка модальных вызовов: Да
Клиент. Язык интерфейса конфигурации: ru
Клиент. Язык интерфейса системы: ru
Клиент. Отладка разрешена: Да
Клиент. Постоянный кэш метаданных: Да
Клиент. ОС: Майкрософт Windows 10 Pro 64-разрядная Русский
Клиент. ОС от имени администратора: Нет
Клиент. ОС Текущая кодовая страница: 866
Клиент. ОС выполнение BAT: Да

Воспроизведение проблемы

  1. Открыл Консоль запросов
  2. Выполнил запрос:
ВЫБРАТЬ ПЕРВЫЕ 2
	Т.Ссылка КАК Поле1
ИЗ
	Документ.АвансовыйОтчет КАК Т
  1. Выгрузил в Таблицу Значений
  2. Вызвал команду «В строку JSON»
  3. Получил ошибку:
Ошибка при вызове метода контекста (ЗаписатьJSON)
{(1)}:ЗаписатьJSON(ЗаписьJSON, Объект)
{ВнешняяОбработка.ирОбщий.МодульОбъекта(16317)}:	Выполнить("ЗаписатьJSON(ЗаписьJSON, Объект)");
{ВнешняяОбработка.ирПлатформа.Форма.ТаблицаЗначений.Форма(1256)}:	Результат = ирОбщий.ОбъектВСтрокуJSONЛкс(Массив, Истина);
по причине:
Передано значение недопустимого типа

@tormozit

Исправлю подсказку кнопки на «в строку JSON через массив структур. Допустимы только значения примитивных типов.»

Labels

отклонено

Изменение программы не планируется

проблема

Неожиданное или неудобное поведение программы

2 participants

@tormozit

@PerlAmutor

  • Ошибка при вызове метода контекста записать ошибка доступа к файлу
  • Ошибка при вызове метода контекста записать не удалось записать номенклатура
  • Ошибка при вызове метода контекста записать не удалось записать ндс предъявленный
  • Ошибка при вызове метода контекста записать не удалось записать договоры контрагентов
  • Ошибка при вызове метода контекста записать нарушение прав доступа