Строка 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); // Иван
Второй параметр — ключевой. Ложь просит вернуть Структуру: удобно,
когда имена полей — валидные идентификаторы 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 дефисы встречаются — тогда только Соответствие.
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.Строка Тогда
Сообщить(ИмяПоля + " = " + Чтение.ТекущееЗначение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Для потоковой обработки HTTP-ответа удобно связка «ответ → поток → ЧтениеJSON»:
Чтение.ОткрытьПоток(ОтветHTTP.ПолучитьТелоКакПоток()). Так вы не собираете
весь ответ в память как строку — это критично для выгрузок остатков на десятки тысяч позиций.
Ошибки парсинга JSON и обработка кодировки
Битый JSON, «непредвиденный символ», лишняя запятая — всё это выбрасывает исключение прямо
из ПрочитатьJSON. Для интеграций такие ошибки нужно перехватывать и логировать,
иначе фоновое задание падает без диагностики:
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();
Исключение
ЗаписьЖурналаРегистрации(
"Интеграция.JSON",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Не удалось разобрать ответ API: " + ОписаниеОшибки()
+ Символы.ПС + "Первые 500 символов ответа: "
+ Лев(ТекстJSON, 500));
Возврат Неопределено;
КонецПопытки;
Кодировка — вторая частая причина «непредвиденного символа». Если API отдаёт cp1251, а
ответ прочитан как UTF-8, кириллица в JSON превратится в мусор ещё до парсинга.
Для файлов и потоков кодировка задаётся вторым параметром
ОткрытьФайл()/ОткрытьПоток(). BOM в начале файла
ЧтениеJSON обрабатывает сам — вручную его убирать не нужно.
Чтение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). Значения таких полей вернутся сразу типа
Дата, конвертировать их вручную из строки не нужно.