Разработка и Конфигурация · 12 мин
Как разобрать JSON в 1С: практическое руководство
Как разобрать JSON в 1С: ЧтениеJSON, ПрочитатьJSON и СериализаторXDTO. Примеры кода, проверка результата, типичные ошибки и ответы на вопросы.
JSON — основной формат обмена данными между 1С и внешними системами: веб-сервисами, сайтами, мобильными приложениями, банковскими API. Задача «разобрать JSON» возникает при загрузке курсов валют, получении заказов с маркетплейсов, интеграции с CRM и десятках других сценариев. В платформе 1С есть три рабочих способа разбора: потоковое чтение через ЧтениеJSON, разбор в структуру через ПрочитатьJSON и разбор через СериализаторXDTO для регистров сведений и простых типов.
Выбор способа зависит от объёма данных и структуры ответа. Для небольших ответов удобнее ПрочитатьJSON — он сразу возвращает структуру или соответствие. Для больших файлов, которые нежелательно целиком загружать в память, подходит потоковое ЧтениеJSON. Ниже — рабочие примеры кода, проверка результата и типичные ошибки, с которыми сталкиваются разработчики.
Все примеры написаны для управляемых форм и работают на актуальных версиях платформы 8.3. Код можно выполнять как на сервере, так и на клиенте (в толстом клиенте), если иное не оговорено.
Какие инструменты разбора JSON есть в платформе 1С
Платформа 1С:Предприятие 8.3 предоставляет встроенные средства работы с JSON без подключения внешних компонентов. Основных объекта три, и каждый решает свою задачу.
ПрочитатьJSON — глобальный метод, который принимает объект ЧтениеJSON и возвращает готовую структуру данных: Структура, Соответствие, Массив и примитивные значения. Это самый простой и самый используемый вариант.
ЧтениеJSON — объект потокового чтения. Он последовательно проходит по элементам документа и позволяет обрабатывать данные по мере чтения, не загружая весь документ в память. Полезен для файлов в десятки и сотни мегабайт.
Сравнение способов разбора
Подходит для большинства ответов API и небольших файлов. Весь документ загружается в память, результат — структура или соответствие.
Для больших файлов и случаев, когда нужно контролировать каждый элемент. Код сложнее, но память расходуется экономно.
Для обмена простыми типами 1С (даты, ссылки, UUID) в JSON между базами 1С. Не подходит для произвольных внешних API.
Быстрый разбор через ПрочитатьJSON
Типовая задача: получен ответ от HTTP-сервиса в виде строки, нужно извлечь значения полей. Минимальный код выглядит так:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаОтвета);
Данные = ПрочитатьJSON(Чтение, Ложь); // Ложь — читаем в Структуру
Чтение.Закрыть();
ЗаказНомер = Данные.НомерЗаказа;
Для Каждого СтрокаТовара Из Данные.Товары Цикл
// обработка каждой строки массива
КонецЦикла;
Второй параметр ПрочитатьВСоответствие определяет тип результата. Значение Ложь возвращает Структуру — обращение к полям идёт через точку, что удобно и читаемо. Значение Истина возвращает Соответствие — обращение через квадратные скобки Данные["номер заказа"].
Выбирайте соответствие, когда имена полей JSON не являются допустимыми идентификаторами 1С: содержат пробелы, дефисы, начинаются с цифры или написаны кириллицей с особыми символами. Структура в таких случаях просто не даст обратиться к полю через точку.
Обработка массивов и вложенных объектов
Массив JSON превращается в объект Массив, вложенный объект — во вложенную структуру. Перед обращением к вложенному полю проверяйте его существование через Свойство(), иначе при отсутствии поля получите ошибку «Поле объекта не обнаружено»:
Если Данные.Свойство("Контрагент") Тогда
ИНН = Данные.Контрагент.ИНН;
Иначе
ИНН = "";
КонецЕсли;
Значения null в JSON преобразуются в Неопределено. Булевы значения true/false — в Булево, числа — в Число. Даты автоматически не распознаются: строка "2026-01-15T10:30:00" останется строкой, её нужно преобразовывать вручную или через параметры чтения.
Потоковый разбор через ЧтениеJSON
Когда файл велик или структура заранее неизвестна, используют последовательный обход. Метод Прочитать() переходит к следующему элементу, а свойство ТипТекущегоЗначения сообщает, что именно встретилось:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ПутьКФайлу);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
ИмяПоля = Чтение.ТекущееЗначение;
ИначеЕсли Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
Значение = Чтение.ТекущееЗначение;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Такой подход требует больше кода, но даёт полный контроль: можно пропускать ненужные ветки (Пропустить()), обрабатывать элементы массива по одному и сразу записывать их в базу, не накапливая в памяти. Это единственный разумный вариант для файлов, сопоставимых по размеру с доступной оперативной памятью сервера.
- 1Выполните HTTP-запрос и получите тело ответа строкой через ПолучитьТелоКакСтроку()
- 2Проверьте код ответа: разбирайте тело только при успешном статусе (обычно 200)
- 3Создайте ЧтениеJSON и установите строку ответа
- 4Вызовите ПрочитатьJSON с нужным значением ПрочитатьВСоответствие
- 5Проверьте наличие обязательных полей через Свойство() перед обращением к ним
- 6Закройте объект чтения и обработайте данные
Получение JSON: откуда берутся данные
Перед разбором JSON нужно получить. Три типовых источника: HTTP-запрос к внешнему API, чтение файла с диска и строка, переданная из другой процедуры или из формы.
Для HTTP используется объект HTTPСоединение и HTTPЗапрос. Тело ответа получают методом ПолучитьТелоКакСтроку(). Для файла достаточно ЧтениеJSON.ОткрытьФайл() — тогда не нужно читать файл целиком в строку. Для строки из другого модуля — УстановитьСтроку().
Обратите внимание на кодировку. Метод ПолучитьТелоКакСтроку() по умолчанию определяет кодировку из заголовков ответа, но некоторые сервисы отдают неверные заголовки. Если в результате видны «кракозябры» вместо кириллицы, укажите кодировку явно: ПолучитьТелоКакСтроку(КодировкаТекста.UTF8).
Преобразование дат и особые типы
Слабое место стандартного разбора — даты. JSON не имеет типа «дата», поэтому сервисы передают их строками в разных форматах: ISO 8601, Unix timestamp, произвольные строки вида «15.01.2026».
У ПрочитатьJSON есть параметры ИменаСвойствСоЗначениямиДата и ФорматДатыJSON, которые позволяют указать, какие поля преобразовать в дату автоматически:
Данные = ПрочитатьJSON(Чтение, Ложь, "ДатаЗаказа,ДатаОтгрузки", ФорматДатыJSON.ISO);
Если формат нестандартный, проще прочитать значение строкой и преобразовать вручную. Для Unix timestamp (секунды с 01.01.1970) используйте сложение: Дата = Дата(1970,1,1) + Число(СтрокаTimestamp), учитывая смещение часового пояса, если оно важно.
Проверка результата и отладка
После разбора убедитесь, что данные соответствуют ожиданиям. Минимальный набор проверок: тип верхнего уровня (структура или массив), наличие обязательных полей, корректность типов значений.
Для отладки удобно выводить полученную структуру в сообщение или журнал регистрации. Быстрый способ посмотреть содержимое — сериализовать обратно через ЗаписьJSON или пройтись циклом по свойствам:
Для Каждого КлючИЗначение Из Данные Цикл
Сообщить(КлючИЗначение.Ключ + " = " + КлючИЗначение.Значение);
КонецЦикла;
Если исходная строка не парсится вообще, проверьте её валидность: JSON строг к синтаксису. Частые проблемы — лишняя запятая перед закрывающей скобкой, одинарные кавычки вместо двойных, неэкранированные спецсимволы, BOM в начале файла. Ошибка «Недопустимый символ» при чтении почти всегда означает, что в строке не JSON, а HTML-страница ошибки или текст с BOM.
Как проверить результат разбора
Структура или Соответствие для объекта, Массив для списка
Неопределено или примитивное значение там, где ожидался объект
Текст читаемый
Кракозябры — неверная кодировка при получении тела ответа
Тип Дата при указанных ИменаСвойствСоЗначениямиДата, иначе строка, преобразованная вручную
Строка используется в сравнениях как дата
Тип Число
Строка с числом — внешний сервис отдал число в кавычках, нужно преобразование
Разбор через СериализаторXDTO и когда он нужен
Третий способ — СериализаторXDTO.ПрочитатьJSON. Он предназначен для обмена данными между базами 1С: сохраняет типы платформы, включая ссылки, даты и значения с типом «Дата». Если JSON сформирован другой базой 1С через СериализаторXDTO.ЗаписатьJSON, то и читать его нужно сериализатором — обычный ПрочитатьJSON вернёт структуру со служебными полями типа #value и #type.
Для внешних API этот способ не подходит: он ожидает строгий формат сериализации платформы и упадёт на произвольном JSON от стороннего сервиса.
Как выбрать способ разбора
FAQ: частые вопросы о разборе JSON в 1С
Что делать, если ПрочитатьJSON выдаёт ошибку «Недопустимый символ»?
Почти всегда это означает, что в строке не JSON. Проверьте начало строки: там может быть HTML-страница ошибки сервера, пустой ответ или BOM-символ в начале файла. Выведите первые 200 символов строки в сообщение перед разбором — это сразу покажет, что реально пришло.
Как разобрать JSON, если имена полей написаны с дефисом, например «order-id»?
Используйте ПрочитатьJSON с параметром ПрочитатьВСоответствие = Истина. Результатом будет Соответствие, и обращение к полю будет выглядеть как Данные["order-id"]. Структура такие имена через точку не поддерживает.
Почему дата из JSON сравнивается неправильно?
Стандартный разбор не преобразует даты автоматически — значение остаётся строкой, а строковое сравнение дат работает некорректно. Укажите имена полей с датами в параметрах ПрочитатьJSON или преобразуйте строку в тип Дата вручную после разбора.
Можно ли разобрать JSON на клиенте в тонком клиенте?
Да, ЧтениеJSON и ПрочитатьJSON доступны на тонком клиенте. Ограничение касается источника данных: HTTP-запросы с клиента возможны, но чаще запрос выполняют на сервере, а на клиент передают уже готовую строку или разобранную структуру.
Как обработать JSON, где на верхнем уровне массив, а не объект?
ПрочитатьJSON корректно возвращает Массив в этом случае. Проверьте тип результата через ТипЗнч(Данные) = Тип("Массив") и обходите его циклом Для Каждого. Не пытайтесь обращаться к свойствам массива как к структуре.
Чем заменить сторонние библиотеки для работы с JSON в 1С?
Ничем заменять не нужно: встроенных средств платформы (ЧтениеJSON, ПрочитатьJSON, ЗаписьJSON, ЗаписатьJSON) достаточно для всех типовых задач интеграции. Внешние компоненты требуются только в экзотических случаях, например для работы с JSONPath-запросами.
Что важно запомнить
Для большинства задач используйте ПрочитатьJSON: Ложь — в структуру, Истина — в соответствие для полей с нестандартными именами. Большие файлы читайте потоково через ЧтениеJSON. Всегда проверяйте наличие полей через Свойство(), помните, что даты приходят строками, и оборачивайте разбор внешних данных в Попытка/Исключение с логированием.