К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как прочитать JSON в 1С: пошаговое руководство

Как прочитать JSON в 1С: ПрочитатьJSON с датами, ЧтениеJSON и потоковый разбор, обработка ошибок, работа с файлами и HTTP-ответами, типовые ошибки и FAQ.

JSON — стандартный формат обмена данными между 1С и внешними системами: веб-сервисами, сайтами, банковскими API, мобильными приложениями. Во встроенном языке 1С есть штатные средства разбора JSON, и сторонние библиотеки для этой задачи не нужны. Основной инструмент — глобальный метод ПрочитатьJSON, который преобразует текст JSON в структуры, соответствия и массивы 1С.

Типичная задача выглядит так: вы получили строку JSON из файла, HTTP-ответа или веб-сервиса и хотите обратиться к её полям как к обычным данным 1С. Для этого достаточно создать объект ЧтениеJSON, передать в него строку и вызвать ПрочитатьJSON. Результат — объект типа «Соответствие» (или «Структура», если указать параметр), с которым работают привычным способом.

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

Базовый способ: ПрочитатьJSON

Минимальный рабочий код для разбора JSON-строки состоит из четырёх строк. Создаём объект ЧтениеJSON, передаём ему текст методом УстановитьСтроку, читаем данные и закрываем объект:

Чтение = Новый ЧтениеJSON;

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

Данные = ПрочитатьJSON(Чтение, Истина); // Истина — результат в виде Соответствия

Чтение.Закрыть();

НазваниеОрганизации = Данные["name"];

Сумма = Данные["total"];

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

Вложенные объекты и массивы разбираются автоматически: вложенный объект станет таким же соответствием/структурой, а JSON-массив — объектом типа «Массив», который обходится циклом Для Каждого или по индексу.

bsl
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
Для Каждого Элемент Из Данные["items"] Цикл
    Сообщить(Элемент["sku"] + " — " + Элемент["price"]);
КонецЦикла;

Чтение JSON из файла и из HTTP-ответа

Если JSON хранится в файле, строку читать вручную не обязательно — ЧтениеJSON умеет открывать файл напрямую методом ОткрытьФайл. Вторым параметром можно указать кодировку, если файл не в UTF-8:

Чтение = Новый ЧтениеJSON;

Чтение.ОткрытьФайл("C:\Обмен\orders.json", КодировкаТекста.UTF8);

Данные = ПрочитатьJSON(Чтение, Истина);

Чтение.Закрыть();

При получении JSON через HTTP-запрос важно правильно прочитать тело ответа. Метод ПолучитьТелоКакСтроку() по умолчанию пытается определить кодировку из заголовков ответа; если сервер не передаёт корректный charset, кириллица превратится в нечитаемые символы. Надёжнее явно указать кодировку: Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8).

Чтение JSON из HTTP-ответа
  1. 1
    Создайте HTTPСоединение и HTTPЗапрос, выполните запрос методом Получить или ВызватьHTTPМетод
  2. 2
    Проверьте КодСостояния ответа: 200 — успех, иные коды требуют отдельной обработки
  3. 3
    Получите тело: Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8)
  4. 4
    Создайте ЧтениеJSON, вызовите УстановитьСтроку с полученным текстом
  5. 5
    Вызовите ПрочитатьJSON(Чтение, Истина) и закройте объект чтения
  6. 6
    Проверьте наличие нужных ключей в результате перед обращением к ним

На сервере 1С файловые операции выполняются в контексте сервера, поэтому путь к файлу должен быть доступен именно серверному процессу, а не клиентской машине. Это частая причина ошибки «файл не найден» при переносе обработки с файловой базы на клиент-серверную.

Как правильно прочитать даты из JSON

В JSON нет отдельного типа «дата» — даты передаются строками, чаще всего в формате ISO 8601: "2026-03-15T10:30:00". По умолчанию ПрочитатьJSON вернёт такое значение как строку, и сравнение дат или запись в реквизит типа «Дата» потребуют ручного преобразования.

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

ПоляДат = Новый Массив;

ПоляДат.Добавить("date");

ПоляДат.Добавить("createdAt");

Чтение = Новый ЧтениеJSON;

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

Данные = ПрочитатьJSON(Чтение, Истина, ПоляДат);

Чтение.Закрыть();

Если внешняя система передаёт даты в нестандартном формате (например, «15.03.2026» или Unix timestamp), автоматическое преобразование не сработает — значение останется строкой или числом. Unix timestamp (секунды с 01.01.1970) преобразуется выражением Дата(1970,1,1) + ЗначениеПоля, а произвольный строковый формат придётся разбирать вручную через строковые функции.

Обработка ошибок и проверка результата

Некорректный JSON — обычная ситуация при интеграциях: обрезанный ответ сервера, HTML-страница ошибки вместо JSON, BOM-символы в начале файла. Вызов ПрочитатьJSON на таких данных вызывает исключение, поэтому разбор всегда стоит оборачивать в попытку:

Попытка

Данные = ПрочитатьJSON(Чтение, Истина);

Исключение

ЗаписьЖурналаРегистрации("Загрузка JSON", УровеньЖурналаРегистрации.Ошибка,,,

ОписаниеОшибки());

Возврат;

КонецПопытки;

Вторая группа ошибок — обращение к несуществующим ключам. Если в JSON нет поля total, то Данные["total"] вернёт Неопределено для соответствия, а для структуры обращение к отсутствующему свойству вызовет исключение. Перед использованием значения проверяйте его наличие методом Свойство (для структуры) или сравнением с Неопределено (для соответствия).

Отдельного внимания заслуживает значение null в JSON: оно преобразуется в Неопределено. Если логика дальше предполагает число или строку, явно подставляйте значение по умолчанию, например: Сумма = ?(Данные["total"] = Неопределено, 0, Данные["total"]).

Типичные ошибки
01
Чтение тела HTTP-ответа без указания кодировки — кириллица превращается в кракозябры, и JSON либо не парсится, либо содержит испорченные строки
02
Использование Структуры вместо Соответствия для JSON с ключами вида "order-id" — обращение к такому полю через точку невозможно и вызывает ошибку
03
Отсутствие Попытка/Исключение вокруг ПрочитатьJSON — один битый ответ внешнего сервиса останавливает всю обработку
04
Игнорирование null-значений: Неопределено попадает в арифметику или запрос, и итоговые данные становятся неверными без явной ошибки
05
Чтение многомегабайтного файла целиком через ПрочитатьJSON — чрезмерный расход памяти и падение серверного вызова

Потоковое чтение больших JSON-файлов

Метод ПрочитатьJSON загружает весь документ в память и строит дерево объектов. Для файлов в десятки и сотни мегабайт это приводит к большому расходу памяти и длительному выполнению. Альтернатива — последовательное чтение методом Читать() объекта ЧтениеJSON, который перемещается по документу токен за токеном.

При потоковом чтении после каждого вызова Читать() проверяется ТипТекущегоЗначения: начало объекта, имя свойства, значение, начало массива и так далее. Такой подход позволяет обрабатывать элементы массива по одному — например, сразу записывать каждую накладную в базу, не накапливая весь список в памяти:

Чтение = Новый ЧтениеJSON;

Чтение.ОткрытьФайл(ИмяФайла);

Пока Чтение.Прочитать() Цикл

Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда

// обработка очередного объекта

КонецЕсли;

КонецЦикла;

Чтение.Закрыть();

Компромиссный вариант — комбинировать подходы: потоково найти начало нужного массива, а каждый его элемент читать целиком через ПрочитатьJSON с параметром ЧтениеJSON в качестве источника. Это сохраняет удобство работы с соответствиями и при этом ограничивает потребление памяти размером одного элемента.

Выбор способа чтения

ПрочитатьJSON целиком

Подходит для ответов API и файлов разумного размера. Код проще всего, но весь документ загружается в память.

Потоковое Читать()

Для больших файлов и массивов с тысячами элементов. Код сложнее, зато память расходуется минимально и данные можно писать в базу порциями.

Смешанный подход

Потоково ищется нужный массив, элементы читаются через ПрочитатьJSON. Баланс удобства и экономии памяти.

Проверка корректности разбора

После разбора полезно убедиться, что данные соответствуют ожиданиям, прежде чем записывать их в базу. Минимальный набор проверок: тип верхнего уровня (соответствие или массив), наличие обязательных ключей, типы критичных значений. Функция ТипЗнч помогает отличить соответствие от массива и число от строки.

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

Контрольные точки

Как проверить результат

Тип результата ПрочитатьJSON
Норма

Соответствие или Массив, соответствующий структуре исходного JSON

Тревожный признак

Строка или Число — вероятно, прочитан не тот фрагмент или JSON содержит скалярное значение

Строковые поля с кириллицей
Норма

Текст читаемый, без символов � и вопросительных знаков

Тревожный признак

Кракозябры — неверная кодировка при чтении файла или тела ответа

Поля дат
Норма

Тип Дата, значения совпадают с исходными

Тревожный признак

Строка — поле не передано в списке полей дат или формат не ISO

Обязательные ключи
Норма

Все нужные ключи присутствуют, значения не равны Неопределено

Тревожный признак

Ключ отсутствует или null — нужна обработка значения по умолчанию

FAQ

Чем отличается Соответствие от Структуры при чтении JSON?

Соответствие допускает любые имена ключей, включая дефисы и пробелы, и безопасно возвращает Неопределено для отсутствующего ключа. Структура удобнее в коде (обращение через точку), но требует, чтобы имена полей были допустимыми идентификаторами 1С. Для данных из внешних систем надёжнее Соответствие.

Как прочитать JSON, если файл в кодировке Windows-1251?

Передайте кодировку вторым параметром метода ОткрытьФайл: Чтение.ОткрытьФайл(ИмяФайла, КодировкаТекста.ANSI) или явно КодировкаТекста.ПолучитьКодировку("windows-1251"). Если читаете файл через ЧтениеТекста, кодировка указывается аналогично в его конструкторе.

Что делать, если ПрочитатьJSON выдаёт ошибку на первом символе?

Чаще всего причина в BOM (служебных байтах в начале файла), HTML-странице ошибки вместо JSON или пустой строке. Выведите первые 100–200 символов текста и проверьте, что это действительно JSON, начинающийся с { или [. BOM обычно устраняется корректным указанием кодировки при чтении файла.

Как преобразовать Unix timestamp из JSON в дату 1С?

Unix timestamp — это число секунд с 1 января 1970 года UTC. Выражение Дата(1970,1,1) + ЗначениеПоля даст дату в 1С. Учтите часовой пояс: timestamp обычно в UTC, поэтому для локального времени добавьте смещение вашего часового пояса в секундах.

Можно ли прочитать JSON на клиенте в управляемых формах?

Да, ЧтениеJSON и ПрочитатьJSON доступны на тонком и веб-клиенте. Ограничение касается файловых операций: ОткрытьФайл требует доступа к файловой системе клиента, поэтому в веб-клиенте файл обычно сначала помещают во временное хранилище и передают на сервер для разбора.

Как прочитать JSON с повторяющимися полями или нестандартной структурой?

Стандартный разбор при дублирующихся ключах оставит последнее значение. Если структура документа нестандартная и требует полного контроля, используйте потоковое чтение через Читать() — оно позволяет обработать каждое свойство вручную в том порядке, в котором оно встречается в документе.

Итог

Что важно запомнить

Основной способ чтения JSON в 1С — ЧтениеJSON плюс ПрочитатьJSON с параметром Истина для получения Соответствия. Даты преобразуйте через список полей дат, разбор оборачивайте в Попытка/Исключение, кодировку указывайте явно, а большие файлы читайте потоково методом Читать(). Перед записью в базу проверяйте наличие ключей и значения null.