Интеграции в 1С

Строка JSON в структуру в 1С: разбор ответа API от простого до вложенных массивов

Коротко

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

Ручной способ — тот же ЧтениеJSON, но с пошаговым обходом через ТипТекущегоЗначения. Нужен для потоковой обработки больших JSON или нестандартной логики. Для типового ответа API от HTTP-сервиса почти всегда достаточно ПрочитатьJSON.

Строка JSON в структуру 1С: быстрый способ через ПрочитатьJSON

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

ТекстJSON = "{""id"": 42, ""name"": ""Иван"", ""active"": true}";

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(Чтение, Ложь); // Ложь → вернётся Структура
Чтение.Закрыть();

Сообщить(Данные.id);   // 42
Сообщить(Данные.name); // Иван
ПрочитатьJSON (глобальная)
ЧтениеJSONоткрытый объект-читатель
ЧитатьВСоответствиеИстина → Соответствие, Ложь → Структура (по умолчанию Истина)
ИменаСвойствСоЗначениямиДатамассив имён полей, которые превращать в Дату
ФорматДатыJSONISO / JavaScript / UnixTime
Структура / Соответствие / Массив / примитив

Второй параметр — ключевой. Ложь просит вернуть Структуру: удобно, когда имена полей — валидные идентификаторы 1С (латиница, без пробелов) и к ним хочется обращаться через точку: Данные.name. Истина вернёт Соответствие — доступ через квадратные скобки: Данные["name"]. Соответствие нужно, если ключи содержат дефисы, пробелы или начинаются с цифры.

Соответствие или Структура: что выбрать

Когда распарсить JSON в 1С нужно «под запись в объект конфигурации» — берите Структуру. Когда JSON пришёл от чужого API с произвольными ключами — берите Соответствие.

// Ключи с дефисом — только Соответствие
ТекстJSON = "{""user-id"": 42, ""full-name"": ""Иван""}";

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

Сообщить(Данные["user-id"]);   // 42
Сообщить(Данные["full-name"]); // Иван

Попытка прочитать такой JSON в Структуру приведёт к ошибке: «Имя свойства структуры содержит недопустимые символы». Для «дружественных» API-ключей это редкость, но у Bitrix24, amoCRM и ряда банковских API дефисы встречаются — тогда только Соответствие.

В консоли кода Aether Lab можно выделить кусок JSON-ответа API и спросить: «разбери в структуру и покажи, как достать orders[0].date» — агент подставит имена полей вашего ответа и сразу учтёт формат дат.

Вложенные объекты и массив объектов: полный пример

Реальный ответ API — это почти всегда вложенные объекты и массивы. Прочитать вложенный JSON в 1С в структуру можно тем же вызовом: ПрочитатьJSON рекурсивно разбирает всё дерево. Пример — распарсить массив заказов:

ТекстJSON =
"{
    ""status"": ""ok"",
    ""orders"": [
        {""number"": ""0001"", ""sum"": 1500, ""client"": {""inn"": ""7701234567""}},
        {""number"": ""0002"", ""sum"": 2300, ""client"": {""inn"": ""7712345678""}}
    ]
}";

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Ответ = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();

Сообщить("Статус: " + Ответ.status);

// Ответ.orders — это Массив структур
Для Каждого Заказ Из Ответ.orders Цикл
    Сообщить("Заказ " + Заказ.number + " на сумму " + Заказ.sum
        + ", ИНН клиента: " + Заказ.client.inn);
КонецЦикла;

Правила доступа простые: у Структуры — через точку (Ответ.orders, Заказ.client.inn), у Соответствия — через квадратные скобки (Ответ["orders"][0]["client"]["inn"]). Массивы в обоих случаях — обычный Массив, обходится циклом Для Каждого.

Даты в JSON: параметр ИменаСвойствСоЗначениямиДата

JSON не знает про тип «Дата» — даты приходят строкой в формате ISO ("2026-07-17T10:15:00") или числом-таймстампом. Чтобы получить в 1С сразу Дату, а не строку, третьим параметром передайте массив имён полей, которые нужно распознать как даты, а четвёртым — формат:

ТекстJSON = "{""number"": ""0001"", ""date"": ""2026-07-17T10:15:00""}";

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

ПоляДаты = Новый Массив;
ПоляДаты.Добавить("date");

Данные = ПрочитатьJSON(Чтение, Ложь, ПоляДаты, ФорматДатыJSON.ISO);
Чтение.Закрыть();

Сообщить(ТипЗнч(Данные.date)); // Дата
Сообщить(Формат(Данные.date, "ДЛФ=DT"));

Формат задаётся системным перечислением ФорматДатыJSON: ISO (по умолчанию для большинства REST API), JavaScript ("/Date(1729161300000)/") и UnixTime (число секунд от эпохи). Имя поля указывается без пути — параметр применится ко всем полям с таким именем на любой глубине вложенности, что удобно для массивов однотипных объектов.

null, отсутствующие поля и Неопределено

JSON-значение null при парсинге в 1С превращается в Неопределено. Отсутствующее поле в Структуре — это не Неопределено, а отсутствие свойства: прямое обращение через точку упадёт с ошибкой. Правильные проверки:

ТекстJSON = "{""client"": null, ""number"": ""0001""}";

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();

// null → Неопределено
Если Данные.client = Неопределено Тогда
    Сообщить("Клиент не указан");
КонецЕсли;

// Отсутствующее поле — Свойство()
Значение = Неопределено;
Если Данные.Свойство("comment", Значение) Тогда
    Сообщить("Комментарий: " + Значение);
Иначе
    Сообщить("Поле comment в ответе отсутствует");
КонецЕсли;

Для Соответствия используется Данные.Получить("comment") — метод вернёт Неопределено и для отсутствующего ключа, и для ключа со значением null. Различить эти случаи можно только методом ПолучитьКлюч() или проверкой наличия ключа перебором.

Ручной обход: ЧтениеJSON без ПрочитатьJSON

Ручное чтение JSON нужно, когда в память нельзя загружать всё сразу (большие выгрузки — сотни мегабайт) или когда нужна нестандартная сборка результата. Тогда используется сам объект ЧтениеJSON и цикл по Прочитать():

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

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

Чтение.Закрыть();
ЧтениеJSON
УстановитьСтроку(СтрокаJSON)задать источник — строку
ОткрытьФайл(ИмяФайла, Кодировка)читать из файла — потоково
ОткрытьПоток(Поток, Кодировка)читать из потока (HTTP-ответа)
Прочитать()перейти к следующему токену
ТипТекущегоЗначенияТипЗначенияJSON: ИмяСвойства, Строка, Число, Литерал, НачалоМассива и т.д.
ТекущееЗначениезначение текущего токена
Пропустить()пропустить вложенный элемент целиком
Закрыть()освободить ресурс

Для потоковой обработки HTTP-ответа удобно связка «ответ → поток → ЧтениеJSON»: Чтение.ОткрытьПоток(ОтветHTTP.ПолучитьТелоКакПоток()). Так вы не собираете весь ответ в память как строку — это критично для выгрузок остатков на десятки тысяч позиций.

Ошибки парсинга JSON и обработка кодировки

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

Попытка
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТекстJSON);
    Данные = ПрочитатьJSON(Чтение, Ложь);
    Чтение.Закрыть();
Исключение
    ЗаписьЖурналаРегистрации(
        "Интеграция.JSON",
        УровеньЖурналаРегистрации.Ошибка,
        ,
        ,
        "Не удалось разобрать ответ API: " + ОписаниеОшибки()
        + Символы.ПС + "Первые 500 символов ответа: "
        + Лев(ТекстJSON, 500));
    Возврат Неопределено;
КонецПопытки;

Кодировка — вторая частая причина «непредвиденного символа». Если API отдаёт cp1251, а ответ прочитан как UTF-8, кириллица в JSON превратится в мусор ещё до парсинга. Для файлов и потоков кодировка задаётся вторым параметром ОткрытьФайл()/ОткрытьПоток(). BOM в начале файла ЧтениеJSON обрабатывает сам — вручную его убирать не нужно.

Если ответ API прилетает с нестандартной кодировкой или лишними символами перед JSON — вставьте фрагмент в консоль кода Aether Lab, агент подскажет, как безопасно очистить строку и в каком порядке выставлять кодировку у ЧтениеJSON.

ПараметрыЧтенияJSON: тонкая настройка

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

Параметры = Новый ПараметрыЧтенияJSON(
    ФорматДатыJSON.ISO,   // формат дат
    Ложь,                 // ЧитатьВСоответствие: Ложь → Структура
    50,                   // МаксимальнаяГлубина
    Истина);              // ПропускатьНестандартныеЭкранированныеСимволы

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(Чтение, Ложь, , ФорматДатыJSON.ISO);
Чтение.Закрыть();

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

Частые ошибки при парсинге JSON в 1С

  • Забыли Чтение.УстановитьСтроку() перед ПрочитатьJSON. Объект ЧтениеJSON нужно сначала «привязать» к источнику — строке, файлу или потоку. Иначе — ошибка «источник не задан».
  • Пытаются читать в Структуру JSON с «плохими» ключами. Ключи с дефисом, пробелом или цифрой в начале в Структуру не лягут — читайте в Соответствие (ЧитатьВСоответствие = Истина).
  • Проверяют дату через = "". С параметром ИменаСвойствСоЗначениямиДата поле становится Датой. Проверять пустоту нужно через = Дата(1,1,1) или ЗначениеЗаполнено().
  • Ловят null как строку "null". JSON-null превращается в Неопределено, а не в строку. Проверка — = Неопределено.
  • Не закрывают ЧтениеJSON. Для строк это не критично, но для файлов и потоков без Закрыть() дескриптор висит до сборки мусора. В долгих фоновых заданиях это оборачивается «слишком много открытых файлов».
  • Пробуют разобрать ответ вместе с HTTP-заголовками. ПрочитатьJSON ожидает только тело. Заголовки берутся из ОтветHTTP.Заголовки, а тело — ПолучитьТелоКакСтроку() или ПолучитьТелоКакПоток().

Частые вопросы о разборе JSON в 1С

Как в 1С 8.3 прочитать JSON из строки в структуру одной командой?

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

В чём разница между Соответствием и Структурой при парсинге JSON?

Структура позволяет обращаться к полям через точку (Данные.name), но требует, чтобы ключи были валидными идентификаторами 1С. Соответствие поддерживает любые ключи (с дефисами, цифрами, пробелами), обращение — через квадратные скобки (Данные["user-id"]).

Как правильно распарсить поле-дату в JSON-ответе?

Соберите массив имён полей с датами и передайте его третьим параметром в ПрочитатьJSON, а четвёртым — ФорматДатыJSON.ISO (или JavaScript / UnixTime). Значения таких полей вернутся сразу типа Дата, конвертировать их вручную из строки не нужно.