JSON в 1С: чтение, запись и частые ошибки

ЧтениеJSON и ЗаписьJSON на примерах, даты, экранирование и разбор ошибок

В 1С:Предприятии 8.3 JSON читают объектом ЧтениеJSON и функцией ПрочитатьJSON, а пишут объектом ЗаписьJSON и функцией ЗаписатьJSON. Объекты JSON превращаются в Структуру или Соответствие, массивы — в Массив; даты остаются строками, пока вы явно не попросите их разобрать.

Чтение JSON в 1С

ЧтениеJSON открывает источник — файл методом ОткрытьФайл или строку методом УстановитьСтроку, — а ПрочитатьJSON разбирает его целиком и возвращает значение 1С. Второй параметр ПрочитатьJSON решает, во что превращать объекты: Ложь (по умолчанию) — в Структуру, Истина — в Соответствие.

Чтение файла в Соответствие
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ИмяФайла, КодировкаТекста.UTF8);
Данные = ПрочитатьJSON(Чтение, Истина); // объекты станут Соответствием
Чтение.Закрыть();

Для Каждого Товар Из Данные["items"] Цикл
    Сообщить(Товар["sku"] + ": " + Товар["qty"]);
КонецЦикла;

Читайте в Соответствие, если ключи приходят из чужой системы. Структура требует, чтобы ключ был допустимым именем переменной 1С, поэтому ключи с дефисом, пробелом или из одних цифр — "order-id", "2026" — при чтении в структуру вызовут ошибку. Кроме того, ключи структуры не различают регистр: "Id" и "id" в ней совпадут. В Соответствии любые ключи остаются как есть, а обращение — по точному имени: Данные["order-id"].

Ответ HTTP-сервиса читается так же, только через УстановитьСтроку. Перед разбором проверьте код ответа: если сервер вернул ошибку, в теле будет HTML-страница, а не JSON.

Разбор ответа HTTP-сервиса
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
    ВызватьИсключение "Сервер вернул код " + Ответ.КодСостояния;
КонецЕсли;

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();

Запись JSON в 1С

ЗаписатьJSON сериализует Структуру, Соответствие, Массив, строки, числа, булевы значения, даты и Неопределено (оно станет null). Писать можно в файл методом ОткрытьФайл или в строку методом УстановитьСтроку; во втором случае готовый текст возвращает метод Закрыть().

Запись структуры в строку без переносов
Заказ = Новый Структура;
Заказ.Вставить("id", 1057);
Заказ.Вставить("status", "paid");
Заказ.Вставить("comment", Неопределено);

Параметры = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Параметры);
ЗаписатьJSON(Запись, Заказ);
Текст = Запись.Закрыть(); // весь JSON в одну строку, comment станет null

Ссылки, объекты справочников и документов, ТаблицуЗначений ЗаписатьJSON напрямую не запишет. Соберите из них Массив структур с нужными полями — так вы заодно сами решите, какие поля и под какими именами получит принимающая сторона.

ПараметрыЗаписиJSON: переносы, отступы, экранирование

Внешний вид результата задаёт объект ПараметрыЗаписиJSON, который передают в УстановитьСтроку или ОткрытьФайл. Параметры конструктора по порядку:

  • ПереносСтрок — значение ПереносСтрокJSON: Авто (по умолчанию), Unix, Windows или Нет — всё в одну строку.
  • СимволыОтступа — чем делать отступ, например два пробела или Символы.Таб.
  • ИспользоватьДвойныеКавычки — по умолчанию Истина; стандарт JSON разрешает только двойные, не меняйте.
  • ЭкранированиеСимволов — значение ЭкранированиеСимволовJSON: Нет (по умолчанию), СимволыВнеASCII — кириллица запишется кодами \u0417, СимволыВнеBMP — кодами только символы за пределами базовой плоскости, например эмодзи.
  • ЭкранироватьУгловыеСкобки, ЭкранироватьРазделителиСтрок, ЭкранироватьАмперсанд, ЭкранироватьОдинарныеКавычки, ЭкранироватьСлеш — точечные настройки, нужны редко.

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

Если JSON нужно вставить прямо в код модуля, помните о правилах самого встроенного языка: кавычка внутри строкового литерала удваивается — Текст = "{""id"": 1057}";.

Даты в JSON и 1С

В JSON нет типа «дата», поэтому ПрочитатьJSON по умолчанию оставляет даты строками. Чтобы получить Дату, перечислите такие свойства в третьем параметре ИменаСвойствСоЗначениямиДата и укажите формат в четвёртом — значение ФорматДатыJSON: ISO ("2026-11-04T10:30:00"), JavaScript или Microsoft ("/Date(1793777400000)/").

Свойство created_at прочитается как Дата
Данные = ПрочитатьJSON(Чтение, Истина, "created_at", ФорматДатыJSON.ISO);

Если значение в перечисленных свойствах не похоже на дату — например, пустая строка или другой формат, — ПрочитатьJSON может выбросить исключение, и из его текста не всегда понятно, что дело в дате. Чтобы проверить, уберите третий параметр: если без него всё читается, ищите неподходящее значение даты. Надёжнее читать даты строками и преобразовывать отдельно функцией ПрочитатьДатуJSON.

При записи формат дат задают объектом НастройкиСериализацииJSON: свойство ФорматСериализацииДаты и ВариантЗаписиДаты — ЛокальнаяДата, УниверсальнаяДата или ЛокальнаяДатаСоСмещением, если принимающей стороне нужен часовой пояс. Настройки передают третьим параметром ЗаписатьJSON.

JSON в таблицу значений

Готовой функции «JSON в таблицу значений» в платформе нет: прочитайте JSON в Массив соответствий и заполните таблицу в цикле. Колонки задавайте сами — так вы не зависите от порядка и набора полей в ответе.

Массив товаров в ТаблицуЗначений
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Артикул");
Таблица.Колонки.Добавить("Количество");

Для Каждого Товар Из Данные["items"] Цикл
    НоваяСтрока = Таблица.Добавить();
    НоваяСтрока.Артикул = Товар["sku"];
    НоваяСтрока.Количество = Товар["qty"];
КонецЦикла;
Такой JSON разбирает код выше
{
  "order_id": "00-00001057",
  "items": [
    { "sku": "00-00012345", "name": "Кабель ВВГнг 3х2,5", "qty": 50, "price": 87.5 },
    { "sku": "00-00012346", "name": "Автомат 16А", "qty": 4, "price": 410 }
  ]
}

Чтобы заранее увидеть структуру незнакомого ответа и пути к полям, откройте его в «Дереве»: при клике по узлу оно покажет путь вида items[0].sku. Если нужно отдать данные человеку, а не программе, инструмент «Excel и CSV» превратит такой массив в таблицу без кода.

«Непредвиденный символ при чтении JSON»

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

  • Вместо JSON пришла HTML-страница: ошибка сервера, перенаправление (301, 302), страница авторизации. Проверьте КодСостояния и начало тела ответа — если оно начинается с <, это не JSON.
  • Сервис ответил в другом формате. Добавьте в запрос заголовок Accept: application/json.
  • BOM в начале текста. Если тело прочитано в строку вместе с BOM, первым символом окажется невидимый U+FEFF, а при неверно указанной кодировке — «п»ї».
  • JSON написан руками или собран конкатенацией строк: висячая запятая, одинарные кавычки, комментарий, неэкранированная кавычка внутри значения.
  • Пустой или оборванный ответ: соединение закрылось на середине, или тело не дочитали.

Сохраните полученный текст в файл или выведите его в отладчике и вставьте в «Проверку»: она покажет все ошибки со строкой и колонкой и объяснит их по-русски. Предупредит и о BOM. Если ошибки похожи на исправимые — запятые, кавычки, комментарии, — «Починка» исправит их и покажет список изменений.

JSON, собранный конкатенацией: одинарные кавычки, десятичная запятая, висячая запятая
{
  "Номенклатура": "Кабель ВВГнг 3х2,5",
  'Артикул': "00-00012345",
  "Цена": 87,5,
  "Остаток": 120,
}

Кириллица как \uXXXX и BOM

Многие сервисы отдают русские буквы кодами: "\u0417\u0430\u043a\u0430\u0437" вместо «Заказ». Это корректный JSON, и ПрочитатьJSON сам превратит коды в буквы — ничего делать не нужно. Чтобы прочитать такой ответ глазами при отладке, раскодируйте его в инструменте «Кириллица»; он же сделает обратное, если принимающая сторона требует только ASCII. В 1С для этого есть ЭкранированиеСимволовJSON.СимволыВнеASCII.

Если в данных не коды, а «Р—Р°РєР°Р·», текст в UTF-8 прочитали как Windows-1251: явно укажите КодировкаТекста.UTF8 в ОткрытьФайл или ПолучитьТелоКакСтроку. Уже испорченные строки вернёт та же «Кириллица».

BOM — три байта в начале файла в UTF-8. Стандарт JSON запрещает добавлять его при передаче по сети, и некоторые получатели, особенно на PHP и Python, на нём падают. Если ваш файл не принимают, проверьте его в «Проверке»: она предупредит о BOM. Наш сайт при открытии файла убирает BOM сам.

Частые вопросы

Как прочитать JSON в 1С

Создайте ЧтениеJSON, откройте файл методом ОткрытьФайл или строку методом УстановитьСтроку и вызовите ПрочитатьJSON(Чтение, Истина). Получите Соответствие или Массив, по которому можно идти циклом.

Чем ПрочитатьJSON в Структуру отличается от Соответствия

В Структуру попадают только ключи, допустимые как имена переменных 1С, и регистр в них не различается. Соответствие принимает любые ключи. Для данных из чужих API надёжнее Соответствие — второй параметр Истина.

Как записать JSON в строку в 1С

Создайте ЗаписьJSON, вызовите УстановитьСтроку, затем ЗаписатьJSON(Запись, Значение). Текст вернёт метод Закрыть(). Чтобы получить одну строку без переносов, передайте Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет).

Как отключить экранирование кириллицы в JSON 1С

По умолчанию 1С кириллицу не экранирует: ЭкранированиеСимволов равно Нет. Если в результате всё же коды \uXXXX, проверьте, не передан ли в ПараметрыЗаписиJSON режим СимволыВнеASCII.

Что значит «Непредвиденный символ при чтении JSON»

В тексте символ, недопустимый по правилам JSON. Чаще всего вместо JSON пришла HTML-страница с ошибкой, в начале стоит BOM или JSON собран вручную с лишней запятой. Вставьте текст в «Проверку» — она покажет место.

Как преобразовать JSON в таблицу значений

Прочитайте JSON в массив соответствий, создайте ТаблицаЗначений с нужными колонками и заполните её в цикле Для Каждого. Готовой функции для этого в платформе нет.

Инструменты по теме

Ещё в справке