JSON в 1С нужен почти в каждой интеграции: интернет-магазин отдаёт заказы через REST API, маркетплейсы Ozon, Wildberries и Яндекс Маркет принимают остатки и цены, банки и службы доставки отвечают на HTTP-запросы именно в этом формате. Начиная с версии 8.3.6 платформа читает и пишет JSON штатными средствами, без ручного разбора строк. Ниже — готовый общий модуль, разбор ключевых строк кода, даты и причины ошибки «Непредвиденный символ при чтении JSON».
Объекты ЧтениеJSON, ЗаписьJSON и методы ПрочитатьJSON, ЗаписатьJSON появились в платформе 8.3.6 — это минимальная версия для всего кода ниже. Кодировку и метку BOM модуль задаёт явно, чтобы не зависеть от значений по умолчанию.
Функции СтрШаблон, СтрСоединить и СтрРазделить тоже появились в 8.3.6, но работают только без режима совместимости или с режимом 8.3.6 и выше. В УТ 10.3, УПП и других конфигурациях в режиме совместимости 8.2 их вызов даёт ошибку «Процедура или функция с указанным именем не определена». Такие базы часто выгружают остатки на маркетплейсы, поэтому в модуле и примерах этих функций нет — только конкатенация строк и СтрПолучитьСтроку.
Инструментов для JSON в платформе три:
ЧтениеJSON.Прочитать(), ЗаписьJSON.ЗаписатьНачалоОбъекта(), ЗаписатьИмяСвойства() и другие — для файлов, которые целиком в память не помещаются.Данные = ПрочитатьЗначениеJSON(ТекстJSON). Модуль ниже построен на классических методах, чтобы работать и на старых платформах.При чтении значения превращаются в такие типы:
| В JSON | В 1С | Что учесть |
|---|---|---|
объект {} | Структура или Соответствие | Зависит от параметра ПрочитатьВСоответствие |
массив [] | Массив | Индексы начинаются с нуля |
| строка | Строка | Даты тоже приходят строками |
| число | Число | Дробная часть — через точку, платформа разбирает её сама |
| true / false | Булево | — |
| null | Неопределено | Проверяйте перед арифметикой |
Заведите серверный общий модуль, например ИнструментыJSON (флажок «Сервер», «Вызов сервера» не нужен): JSON разбирают там же, где выполняют HTTP-запрос и пишут в базу. Для обычных форм (толстый клиент) включите ещё флажок «Клиент (обычное приложение)», для вызова через COM — «Внешнее соединение». БСП модулю не нужна.
// Общий модуль ИнструментыJSON
// Флажок «Сервер»; для обычных форм - ещё «Клиент (обычное приложение)».
// Платформа 8.3.6 и новее. СтрШаблон, СтрСоединить и СтрРазделить не используются:
// модуль компилируется и в конфигурациях с режимом совместимости 8.2.
#Область ПрограммныйИнтерфейс
// Преобразует Структуру, Соответствие, Массив или примитивное значение в строку JSON.
//
// Параметры:
// Значение - Произвольный - данные для записи.
// Компактно - Булево - Истина: одна строка без переносов (для отправки в API),
// Ложь: с переносами и отступами (для логов и файлов).
//
// Возвращаемое значение:
// Строка - текст JSON.
//
Функция ЗначениеВСтрокуJSON(Значение, Компактно = Истина) Экспорт
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(ПараметрыЗаписи(Компактно));
ЗаписатьJSON(Запись, Значение, НастройкиСериализации());
Возврат Запись.Закрыть();
КонецФункции
// Разбирает строку JSON в значения 1С.
//
// Параметры:
// ТекстJSON - Строка - исходный текст.
// ВСоответствие - Булево - Истина: объекты JSON станут Соответствием,
// Ложь: Структурой.
// ПоляДат - Массив, Неопределено - имена свойств, значения которых
// нужно сразу получить как Дата (строки в формате ISO 8601).
//
// Возвращаемое значение:
// Структура, Соответствие, Массив, Строка, Число, Булево, Неопределено.
//
Функция СтрокаJSONВЗначение(Знач ТекстJSON, ВСоответствие = Ложь, ПоляДат = Неопределено) Экспорт
ТекстJSON = ПодготовитьТекстJSON(ТекстJSON);
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Попытка
Если ПоляДат = Неопределено Тогда
Результат = ПрочитатьJSON(Чтение, ВСоответствие);
Иначе
Результат = ПрочитатьJSON(Чтение, ВСоответствие, ПоляДат, ФорматДатыJSON.ISO);
КонецЕсли;
Исключение
ТекстОшибки = ОписаниеОшибки();
Чтение.Закрыть();
ВызватьИсключение "Не удалось разобрать JSON: " + ТекстОшибки
+ Символы.ПС + "Начало текста: " + Лев(ТекстJSON, 200);
КонецПопытки;
Чтение.Закрыть();
Возврат Результат;
КонецФункции
// Записывает значение в файл JSON в кодировке UTF-8 без BOM.
// Сначала пишет во временный файл рядом с целевым и переименовывает его
// только после успешной записи: обрезанный JSON в каталоге обмена не появится.
//
// Параметры:
// Значение - Произвольный - данные для записи.
// ИмяФайла - Строка - полный путь к файлу на сервере.
// Компактно - Булево - см. ЗначениеВСтрокуJSON.
//
Процедура ЗаписатьФайлJSON(Значение, ИмяФайла, Компактно = Ложь) Экспорт
ИмяВременногоФайла = ИмяФайла + ".tmp";
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл(ИмяВременногоФайла, "UTF-8", Ложь, ПараметрыЗаписи(Компактно));
// Закрыть() тоже внутри Попытки: ошибка записи на диск
// может проявиться и при закрытии файла
Попытка
ЗаписатьJSON(Запись, Значение, НастройкиСериализации());
Запись.Закрыть();
Исключение
ТекстОшибки = ОписаниеОшибки();
Попытка
Запись.Закрыть();
Исключение
// Уже закрыт или не закрывается - исходная ошибка важнее
КонецПопытки;
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
// Временный файл не удалился - исходная ошибка важнее
КонецПопытки;
ВызватьИсключение ТекстОшибки;
КонецПопытки;
// Замена не атомарна: между удалением и переименованием файла нет
Попытка
ЦелевойФайл = Новый Файл(ИмяФайла);
Если ЦелевойФайл.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ПереместитьФайл(ИмяВременногоФайла, ИмяФайла);
Исключение
ВызватьИсключение "Не удалось заменить файл " + ИмяФайла
+ ", новые данные остались в " + ИмяВременногоФайла + ": " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
// Читает файл JSON в кодировке UTF-8 (с BOM или без).
//
// Параметры:
// ИмяФайла - Строка - полный путь к файлу на сервере.
// ВСоответствие, ПоляДат - см. СтрокаJSONВЗначение.
//
// Возвращаемое значение:
// См. СтрокаJSONВЗначение.
//
Функция ПрочитатьФайлJSON(ИмяФайла, ВСоответствие = Ложь, ПоляДат = Неопределено) Экспорт
Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
ТекстJSON = Текст.Прочитать();
Текст.Закрыть();
Возврат СтрокаJSONВЗначение(ТекстJSON, ВСоответствие, ПоляДат);
КонецФункции
// Преобразует таблицу значений в массив структур, который можно передать в ЗаписатьJSON.
// Ссылки заранее замените строками или кодами; Null и УникальныйИдентификатор
// функция приводит сама.
//
Функция ТаблицаВМассивСтруктур(Таблица) Экспорт
ИменаКолонок = Новый Массив;
СписокКлючей = "";
Для Каждого Колонка Из Таблица.Колонки Цикл
ИменаКолонок.Добавить(Колонка.Имя);
СписокКлючей = СписокКлючей + ?(СписокКлючей = "", "", ",") + Колонка.Имя;
КонецЦикла;
Результат = Новый Массив;
Для Каждого СтрокаТаблицы Из Таблица Цикл
Элемент = Новый Структура(СписокКлючей);
ЗаполнитьЗначенияСвойств(Элемент, СтрокаТаблицы);
Для Каждого ИмяКолонки Из ИменаКолонок Цикл
Значение = Элемент[ИмяКолонки];
Если Значение = Null Тогда
Элемент.Вставить(ИмяКолонки, Неопределено);
ИначеЕсли ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда
Элемент.Вставить(ИмяКолонки, Строка(Значение));
КонецЕсли;
КонецЦикла;
Результат.Добавить(Элемент);
КонецЦикла;
Возврат Результат;
КонецФункции
// Преобразует значение свойства из прочитанного JSON в Дата.
// Пустая строка, null и строка не в формате ISO 8601 дают пустую дату, а не исключение.
//
// Параметры:
// Значение - Строка, Дата, Неопределено - значение свойства.
//
// Возвращаемое значение:
// Дата - распознанная дата или Дата(1, 1, 1).
//
Функция ДатаИзJSON(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Дата") Тогда
Возврат Значение;
КонецЕсли;
Если ТипЗнч(Значение) <> Тип("Строка") Или ПустаяСтрока(Значение) Тогда
Возврат Дата(1, 1, 1);
КонецЕсли;
Попытка
Возврат ПрочитатьДатуJSON(Значение, ФорматДатыJSON.ISO);
Исключение
Возврат Дата(1, 1, 1);
КонецПопытки;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Убирает то, что чаще всего ломает разбор: BOM и пробельные символы по краям.
// Пустой текст и HTML вместо JSON отсекает с понятным сообщением.
//
Функция ПодготовитьТекстJSON(Знач ТекстJSON)
Если ТипЗнч(ТекстJSON) <> Тип("Строка") Тогда
ТекстJSON = "";
КонецЕсли;
// Символ с кодом 65279 (U+FEFF) - метка порядка байтов (BOM).
// В отладчике она не видна, но парсер JSON на ней спотыкается.
Если СтрДлина(ТекстJSON) > 0 И КодСимвола(ТекстJSON, 1) = 65279 Тогда
ТекстJSON = Сред(ТекстJSON, 2);
КонецЕсли;
ТекстJSON = СокрЛП(ТекстJSON);
Если ПустаяСтрока(ТекстJSON) Тогда
ВызватьИсключение "Получен пустой текст вместо JSON";
КонецЕсли;
Если Лев(ТекстJSON, 1) = "<" Тогда
ВызватьИсключение "Вместо JSON получен HTML или XML: " + Лев(ТекстJSON, 200);
КонецЕсли;
Возврат ТекстJSON;
КонецФункции
Функция ПараметрыЗаписи(Компактно)
Если Компактно Тогда
Возврат Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
КонецЕсли;
Возврат Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
КонецФункции
Функция НастройкиСериализации()
Настройки = Новый НастройкиСериализацииJSON;
Настройки.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
Настройки.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
Возврат Настройки;
КонецФункции
#КонецОбласти
Запись.УстановитьСтроку() направляет вывод в память, а Запись.Закрыть() возвращает готовую строку: без Закрыть() строки не будет.ПодготовитьТекстJSON снимает невидимую метку BOM и отсекает случаи, когда вместо JSON пришла HTML-страница.Допустим, сервис вернул такой ответ:
{"id": 15, "status": "paid", "items": [{"sku": "A-100", "qty": 2}, {"sku": "B-205", "qty": 1}]}
Примеры выполняются на сервере. Директива &НаСервере нужна только в модуле управляемой формы, в общем модуле и обычной форме её не пишут. Разбор ответа — один вызов:
&НаСервере
Процедура ПримерЧтенияВСтруктуру()
ТекстJSON = "{""id"": 15, ""status"": ""paid"", ""items"": [{""sku"": ""A-100"", ""qty"": 2}, {""sku"": ""B-205"", ""qty"": 1}]}";
Данные = ИнструментыJSON.СтрокаJSONВЗначение(ТекстJSON);
НомерЗаказа = Данные.id; // Число 15
Статус = Данные.status; // Строка "paid"
Для Каждого Позиция Из Данные.items Цикл
// Позиция - тоже Структура
Сообщить(Позиция.sku + ": " + Позиция.qty + " шт.");
КонецЦикла;
// Необязательное поле: Свойство() проверяет наличие и сразу возвращает значение
Телефон = Неопределено;
Если Данные.Свойство("phone", Телефон) И ЗначениеЗаполнено(Телефон) Тогда
Сообщить("Телефон покупателя: " + Телефон);
КонецЕсли;
КонецПроцедуры
Объект верхнего уровня стал структурой, массив items — массивом структур. Необязательные поля читайте через Свойство(), как в примере: обращение через точку к полю, которого нет в ответе, даёт ошибку «Поле объекта не обнаружено».
Ключ структуры обязан быть допустимым идентификатором 1С: без дефисов, точек и пробелов, не с цифры в начале. В JSON ключи вида order-id, 2024 или price.old встречаются постоянно, и в структуру такой текст не прочитается — платформа выдаст ошибку. Передайте Истина вторым параметром и работайте с соответствием:
&НаСервере
Процедура ПримерЧтенияВСоответствие()
ТекстJSON = "{""order-id"": ""A-7781"", ""2024"": 15300, ""price.old"": 990}";
// Второй параметр Истина - объекты JSON станут Соответствием
Данные = ИнструментыJSON.СтрокаJSONВЗначение(ТекстJSON, Истина);
НомерЗаказа = Данные["order-id"]; // "A-7781"
СтараяЦена = Данные.Получить("price.old"); // 990
Скидка = Данные.Получить("discount"); // ключа нет - Неопределено, без ошибки
Для Каждого КлючИЗначение Из Данные Цикл
Сообщить(КлючИЗначение.Ключ + " = " + КлючИЗначение.Значение);
КонецЦикла;
КонецПроцедуры
Второй случай: ключи структуры не различают регистр, а в JSON "id" и "ID" — разные свойства. Соответствие регистр различает, поэтому для API с непредсказуемыми ключами выбирайте его сразу.
Обратная задача — собрать данные и записать JSON для отправки. Объект JSON — это структура или соответствие, список — массив.
&НаСервере
Функция ТелоЗаказаJSON()
Заказ = Новый Структура;
Заказ.Вставить("number", "ЗК-00125");
Заказ.Вставить("date", Дата(2025, 3, 14, 10, 25, 0));
Заказ.Вставить("paid", Ложь);
Заказ.Вставить("comment", Неопределено);
Позиции = Новый Массив;
Позиции.Добавить(Новый Структура("sku, qty, price", "A-100", 2, 1490.5));
Позиции.Добавить(Новый Структура("sku, qty, price", "B-205", 1, 350));
Заказ.Вставить("items", Позиции);
// Ложь - с отступами, удобно смотреть глазами; для отправки в API передайте Истина
Возврат ИнструментыJSON.ЗначениеВСтрокуJSON(Заказ, Ложь);
КонецФункции
Результат будет примерно таким (отступы — табуляция):
{
"number": "ЗК-00125",
"date": "2025-03-14T10:25:00",
"paid": false,
"comment": null,
"items": [
{
"sku": "A-100",
"qty": 2,
"price": 1490.5
},
{
"sku": "B-205",
"qty": 1,
"price": 350
}
]
}
Неопределено записалось как null, дата — строкой ISO 8601, дробное число — через точку. Регистр имён свойств — тот, в котором они написаны в коде.
Метод понимает примитивные типы (Строка, Число, Булево, Дата, Неопределено) и коллекции: Структура, Соответствие, Массив и их фиксированные варианты; ключи соответствия — только строки. Ссылки, таблицы значений, УникальныйИдентификатор и Null (он постоянно приходит из запросов с левым соединением) дают ошибку о недопустимом типе значения. Поэтому данные сначала перекладывают: ссылку — в код или артикул, пустую ссылку и Null — в Неопределено (как распознать пустую ссылку — в статье про пустую ссылку в запросе), таблицу значений — в массив структур функцией ТаблицаВМассивСтруктур. Null и идентификаторы она приводит сама.
Альтернатива — передать в ЗаписатьJSON имя экспортной функции преобразования и её модуль: платформа вызовет её для значений, которые не умеет записать сама.
Чтобы записать JSON в файл, вместо УстановитьСтроку() вызывают ОткрытьФайл() с параметрами: имя файла, кодировка, признак записи BOM, параметры записи. Мы явно указываем UTF-8 без BOM: такой файл без сюрпризов прочитают PHP, Python и JavaScript.
ЗаписатьФайлJSON пишет сначала в соседний файл .tmp и переименовывает его только после успешной записи, поэтому обрыв на недопустимом значении или нехватке места не оставит в каталоге обмена обрезанный JSON. Закрыть() тоже стоит внутри блока Попытка: ошибка записи может проявиться при закрытии файла. Замена файла не атомарна: между удалением старого файла и переименованием есть короткий момент, когда файла нет. Если переименовать не удалось (файл занят, нет прав), исключение подскажет, где лежат новые данные.
Для чтения модуль использует ЧтениеТекста, чтобы файл прошёл ту же очистку, что и ответы HTTP-сервисов. Огромные файлы открывайте сразу в ЧтениеJSON методом ОткрытьФайл(ИмяФайла, "UTF-8") и читайте потоково.
Путь в серверном модуле — это путь на сервере 1С, а не на компьютере пользователя: файл пользователя сначала передают на сервер через временное хранилище.
Отдельного типа «дата» в JSON нет: даты передают строкой или числом. ЗаписатьJSON выводит значение типа Дата строкой ISO 8601, а как именно — задаёт объект НастройкиСериализацииJSON:
ФорматСериализацииДаты — обычно ФорматДатыJSON.ISO; вариант Microsoft встречается разве что у старых сервисов на .NET.ВариантЗаписиДаты — ЛокальнаяДата пишет время как есть, УниверсальнаяДата переводит в UTC, ЛокальнаяДатаСоСмещением добавляет смещение пояса. Если API ждёт UTC, выберите вариант, а не вычитайте часы вручную.При чтении даты по умолчанию остаются строками. Чтобы сразу получить тип Дата, передайте имена свойств третьим параметром ПрочитатьJSON (ИменаСвойствСоЗначениямиДата), а формат — четвёртым. В модуле это параметр ПоляДат; для одиночной строки есть ПрочитатьДатуJSON().
Подвох: если хоть одно поле из списка придёт пустой строкой или датой не в ISO (например "14.03.2025"), ПрочитатьJSON выдаст исключение на весь ответ. Такие поля преобразуйте после чтения функцией ДатаИзJSON: нераспознанное значение она вернёт пустой датой.
&НаСервере
Процедура ПримерРаботыСДатами(ТекстJSON)
// 1. Строки ISO 8601 - сразу в тип Дата
ПоляДат = Новый Массив;
ПоляДат.Добавить("created_at");
Данные = ИнструментыJSON.СтрокаJSONВЗначение(ТекстJSON, Ложь, ПоляДат);
ДатаСоздания = Данные.created_at; // тип Дата
// 2. Поле, которое может прийти пустым или не в ISO, - после чтения, без исключения
ДатаОплаты = Неопределено;
Данные.Свойство("paid_at", ДатаОплаты);
ДатаОплаты = ИнструментыJSON.ДатаИзJSON(ДатаОплаты); // пустая дата, если не распознана
// 3. Одиночная строка с датой
ДатаОтгрузки = ПрочитатьДатуJSON("2025-03-15T09:00:00", ФорматДатыJSON.ISO);
// 4. Время Unix: секунды с 01.01.1970 по UTC.
// 1741947900 - это 14.03.2025 10:25:00 по UTC
СекундыUnix = 1741947900;
ДатаUTC = Дата(1970, 1, 1) + СекундыUnix;
ДатаМестная = МестноеВремя(ДатаUTC); // в часовом поясе сеанса
// Если сервис присылает миллисекунды (13 цифр), дробную часть отбросьте явно
МиллисекундыUnix = 1741947900123;
ДатаUTC = Дата(1970, 1, 1) + Цел(МиллисекундыUnix / 1000);
КонецПроцедуры
Пустая дата запишется как "0001-01-01T00:00:00", и многие API такое отклонят — передавайте Неопределено, оно станет null.
Эта ошибка значит, что в тексте есть то, чего по стандарту JSON быть не может. Посмотрите начало полученного текста (модуль пишет его в исключение) и сверьтесь с таблицей.
| Причина | Как распознать | Что делать |
|---|---|---|
| Метка BOM в начале строки | Ошибка на первом символе, хотя в отладчике текст выглядит идеально: символ U+FEFF невидим | Удалить первый символ, если его код 65279. Это делает ПодготовитьТекстJSON |
| Вместо JSON пришёл HTML | Текст начинается с <: страница ошибки 404 или 500, перенаправление на форму входа, заглушка прокси | Проверять код ответа до разбора и записывать в журнал начало тела |
| Не та кодировка | Файл в UTF-16 или windows-1251 читается как UTF-8: разбор падает или кириллица становится нечитаемой | Указать верную кодировку при открытии файла или в ПолучитьТелоКакСтроку() |
| Текст — не чистый JSON | Перед JSON есть префикс, ответ обёрнут в функцию вида callback(...), в одном ответе несколько объектов подряд (JSON Lines) | Вырезать JSON из текста; JSON Lines разбирать построчно |
| JSON собран вручную на другой стороне | Внутри значений стоят неэкранированные кавычки | Исправлять у источника: «чинить» такой текст заменами строк в 1С ненадёжно |
При HTTP-запросе сначала проверяйте код состояния, потом разбирайте тело:
// Серверный общий модуль. Соединение (HTTPСоединение) и Запрос (HTTPЗапрос) созданы заранее
Функция ПолучитьДанныеJSON(Соединение, Запрос) Экспорт
Ответ = Соединение.Получить(Запрос);
// Кодировка: из charset в заголовке Content-Type, а если его нет - UTF-8
ТипСодержимого = "";
Для Каждого Заголовок Из Ответ.Заголовки Цикл
Если НРег(Заголовок.Ключ) = "content-type" Тогда
ТипСодержимого = НРег(Заголовок.Значение);
КонецЕсли;
КонецЦикла;
Если Найти(ТипСодержимого, "charset=") > 0 Тогда
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(); // кодировка из заголовка
Иначе
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8"); // JSON по RFC 8259 - UTF-8
КонецЕсли;
Если ТекстОтвета = Неопределено Тогда
ТекстОтвета = "";
КонецЕсли;
// Сначала код ответа, потом разбор: страница ошибки - это HTML, а не JSON
Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния >= 300 Тогда
ВызватьИсключение "Сервис вернул код " + Ответ.КодСостояния + ": " + Лев(ТекстОтвета, 300);
КонецЕсли;
// Успешный ответ без тела (например, 204 No Content) - разбирать нечего
Если Ответ.КодСостояния = 204 Или ПустаяСтрока(ТекстОтвета) Тогда
Возврат Неопределено;
КонецЕсли;
Возврат ИнструментыJSON.СтрокаJSONВЗначение(ТекстОтвета);
КонецФункции
Кодировка берётся из charset в Content-Type, если сервер его указал, а если нет — задаётся UTF-8, стандартная для JSON по RFC 8259. Прописывать UTF-8 жёстко для всех ответов не стоит: ответ в windows-1251 с честным заголовком получит испорченную кириллицу. О соединении и авторизации — в статье про HTTP-запросы из 1С.
Свойство(), для соответствия — Получить()."{\"id\": 15}". ПрочитатьJSON вернёт Строку, и код упадёт на обращении к полю — разберите её повторно, как в примере ниже.Двойная упаковка и формат JSON Lines решаются несколькими строками:
// Серверный общий модуль.
// JSON, упакованный в строку ещё раз: "{\"id\": 15}"
Функция РазобратьОтвет(ТекстОтвета) Экспорт
Данные = ИнструментыJSON.СтрокаJSONВЗначение(ТекстОтвета);
// На выходе строка, а не структура. Разбираем повторно, только если она похожа на JSON:
// обычный текст вроде "ok" оставляем как есть
Если ТипЗнч(Данные) = Тип("Строка") Тогда
ПервыйСимвол = Лев(СокрЛП(Данные), 1);
Если ПервыйСимвол = "{" Или ПервыйСимвол = "[" Тогда
Данные = ИнструментыJSON.СтрокаJSONВЗначение(Данные);
КонецЕсли;
КонецЕсли;
Возврат Данные;
КонецФункции
// Формат JSON Lines: каждая строка текста - отдельный JSON-объект
Функция РазобратьJSONLines(ТекстОтвета) Экспорт
Результат = Новый Массив;
Для НомерСтроки = 1 По СтрЧислоСтрок(ТекстОтвета) Цикл
СтрокаJSON = СтрПолучитьСтроку(ТекстОтвета, НомерСтроки);
Если ПустаяСтрока(СтрокаJSON) Тогда
Продолжить;
КонецЕсли;
Результат.Добавить(ИнструментыJSON.СтрокаJSONВЗначение(СтрокаJSON));
КонецЦикла;
Возврат Результат;
КонецФункции
Передайте в ЗаписьJSON.УстановитьСтроку() параметры Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет). В модуле это вызов ЗначениеВСтрокуJSON(Данные) с параметром Компактно по умолчанию.
Это экранирование вида \uXXXX: так кириллицу пишет другая сторона, например PHP-функция json_encode с настройками по умолчанию. Платформа при чтении раскодирует его сама, а ЗаписатьJSON по умолчанию пишет кириллицу как есть. Если сервису нужен только ASCII, укажите четвёртым параметром ПараметрыЗаписиJSON значение ЭкранированиеСимволовJSON.СимволыВнеASCII.
Штатных объектов на платформе ниже 8.3.6 нет — обновите платформу. Разбор поиском по строкам ломается на первом же вложенном объекте или экранированной кавычке.
СериализаторXDTO.ЗаписатьJSON() запишет объект в собственном формате 1С со служебными полями о типах. Другой базе 1С он подходит, сайту или маркетплейсу — нет: для них собирайте структуру с нужными полями вручную.
Прочитайте строку и запишите заново с отступами: ИнструментыJSON.ЗначениеВСтрокуJSON(ИнструментыJSON.СтрокаJSONВЗначение(ТекстJSON, Истина), Ложь). Чтение в соответствие страхует от ключей вида order-id.
Разобрать JSON — полдела. Основная работа в интеграции — сопоставить данные со справочниками, обработать ошибки и повторные отправки, не потерять заказы при сбое связи. Если такой обмен нужен под ключ, посмотрите услугу обмен 1С с сайтом или разместите задачу на площадке: оценка бесплатная, ответ — в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.