Разработка и Конфигурация · 11 мин
Как прочитать JSON файл в 1С
Как прочитать JSON файл в 1С: объекты ПрочитатьJSON и ЧтениеJSON, работа с массивами и вложенными структурами, типичные ошибки и готовые примеры кода.
JSON — стандартный формат обмена данными между 1С и внешними системами: веб-сервисами, сайтами, банковскими API, мобильными приложениями. Во встроенном языке 1С есть штатные объекты для разбора JSON, и сторонние библиотеки для этой задачи не нужны.
Основной инструмент — глобальная процедура ПрочитатьJSON(), которая преобразует текст JSON в структуру, соответствие или массив. Для больших файлов, которые нерационально загружать в память целиком, используется потоковый объект ЧтениеJSON. Оба подхода доступны начиная с платформы 8.3.6, поэтому работают практически во всех актуальных конфигурациях.
Ниже разобраны оба способа: чтение файла с диска, разбор строки, обход вложенных объектов и массивов, обработка ошибок и типичные проблемы с кодировкой. Примеры кода можно копировать в модуль и адаптировать под свою структуру данных.
Как устроено чтение JSON в платформе 1С
Платформа предлагает два принципиально разных механизма. Первый — ПрочитатьJSON(): вся строка JSON разбирается за один вызов, и вы получаете готовое дерево данных в памяти. Это удобно для файлов разумного размера — ответов API, выгрузок справочников, настроек.
Второй механизм — объект ЧтениеJSON, который читает поток последовательно: вы шаг за шагом получаете тип текущего элемента (начало объекта, имя свойства, значение) и сами решаете, что с ним делать. Такой подход требует больше кода, но позволяет обрабатывать файлы, которые целиком не помещаются в память, и пропускать ненужные фрагменты.
Сравнение вариантов
Подходит для файлов умеренного размера и ответов API. Возвращает готовую структуру данных. Ограничение — весь JSON загружается в память.
Подходит для очень больших файлов и выборочного разбора. Требует написания цикла обхода и ручного контроля вложенности.
Чтение JSON из файла на диске
Типовая задача — прочитать файл, который внешняя система положила в каталог обмена. Сначала файл загружается как текст, затем текст передаётся в ПрочитатьJSON. Важно явно указать кодировку: чаще всего JSON-файлы сохраняются в UTF-8.
Функция ПрочитатьJSONИзФайла(ПутьКФайлу)
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
СтрокаJSON = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат Результат;
КонецФункции
Функция ПрочитатьJSON по умолчанию возвращает Структуру для объектов и Массив для массивов JSON. Если вызвать её со вторым параметром Истина (ПрочитатьJSON(ЧтениеJSON, Истина)), объекты будут преобразованы в Соответствие. Соответствие удобнее, когда имена свойств заранее неизвестны или содержат символы, недопустимые для ключей структуры (пробелы, дефисы, цифры в начале).
Разбор строки JSON без файла
Когда JSON приходит как строка — из HTTP-ответа, из регистра сведений, из параметра запроса — файл на диске не нужен. Строка передаётся напрямую через метод УстановитьСтроку:
СтрокаJSON = "{""Номенклатура"":""Кабель"",""Цена"":150.5,""Активен"":true}";
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить(Данные.Номенклатура); // Кабель
Сообщить(Данные.Цена); // 150.5
Обратите внимание на типы результата: строки JSON становятся строками 1С, числа — числами, true/false — булево, null — значением Неопределено. Даты автоматически не преобразуются: JSON не имеет типа «дата», поэтому даты приходят строками и их нужно парсить отдельно.
Работа с массивами и вложенными объектами
Реальные выгрузки редко состоят из одного плоского объекта. Обычно это массив записей с вложенными структурами. Обход выполняется стандартными циклами:
// JSON: {"Заказы":[{"Номер":"001","Сумма":1000},{"Номер":"002","Сумма":2500}]}
Данные = ПрочитатьJSON(ЧтениеJSON);
Если Данные.Свойство("Заказы") Тогда
Для Каждого Заказ Из Данные.Заказы Цикл
Сообщить(Заказ.Номер + " — " + Заказ.Сумма);
КонецЦикла;
КонецЕсли;
Ключевое правило безопасного разбора — всегда проверять наличие свойства через Свойство("Имя") перед обращением. Внешние системы могут пропускать необязательные поля, и прямое обращение к отсутствующему свойству структуры вызовет исключение. Для соответствия аналогичная проверка — получение значения и сравнение с Неопределено.
- 1Загрузите текст JSON: из файла через ЧтениеТекста или получите строку из HTTP-ответа
- 2Создайте объект ЧтениеJSON и вызовите УстановитьСтроку(СтрокаJSON)
- 3Вызовите ПрочитатьJSON(ЧтениеJSON); при проблемных именах свойств добавьте второй параметр Истина
- 4Проверяйте наличие каждого свойства через Свойство() перед обращением
- 5Обойдите массивы циклом Для Каждого и преобразуйте строковые даты в тип Дата
- 6Закройте ЧтениеJSON после завершения разбора
Потоковое чтение больших файлов через ЧтениеJSON
Если файл весит десятки или сотни мегабайт, загружать его целиком в память рискованно: сеанс может завершиться по нехватке памяти. Потоковый вариант читает данные последовательно:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПутьКФайлу);
Пока ЧтениеJSON.Прочитать() Цикл
Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
// обработка значения
КонецЕсли;
КонецЦикла;
ЧтениеJSON.Закрыть();
Метод Прочитать() возвращает Ложь, когда поток закончился. Тип текущего элемента определяется перечислением ТипЗначенияJSON: НачалоОбъекта, КонецОбъекта, НачалоМассива, ИмяСвойства, Строка, Число, Булево, Null. Такой код сложнее, зато расход памяти не зависит от размера файла.
Практический компромисс — комбинировать подходы: потоковым чтением дойти до начала массива записей, а каждую отдельную запись разбирать через ПрочитатьJSON с параметром ПрочитатьВСоответствие. Это даёт удобный код при контролируемом потреблении памяти.
Обработка ошибок и кодировки
Разбор JSON — место, где исключения возникают регулярно: внешняя система прислала обрезанный файл, HTML-страницу с ошибкой вместо JSON, невалидные символы. Любой вызов ПрочитатьJSON следует оборачивать в попытку:
Попытка
Данные = ПрочитатьJSON(ЧтениеJSON);
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Обмен JSON",
УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
Возврат Неопределено;
КонецПопытки;
Отдельная группа проблем — кодировка. Если после чтения файла вместо кириллицы видны «кракозябры», файл сохранён не в UTF-8. Проверьте, какой кодировкой пишет внешняя система, и укажите её в ЧтениеТекста явно: КодировкаТекста.ANSI или КодировкаТекста.UTF16. Также учитывайте, что файл в UTF-8 может содержать BOM — ЧтениеТекста обрабатывает его корректно, а вот при ручном чтении через ЧтениеДанных BOM может попасть в начало строки и сломать разбор.
Проверка результата и отладка
Быстрый способ убедиться, что JSON разобран правильно, — вывести полученную структуру в сообщения или в отладчике. В конфигураторе поставьте точку останова сразу после ПрочитатьJSON и посмотрите переменную через «Вычислить выражение»: структура раскрывается деревом, видно все ключи и типы значений.
Для проверки валидности JSON до разбора удобно открыть файл в любом редакторе с подсветкой (Notepad++, VS Code): редактор сразу покажет синтаксическую ошибку — незакрытую скобку, лишнюю запятую. Запятая перед закрывающей скобкой — самая частая причина невалидного JSON, который генерируют самописные выгрузки.
Как проверить результат
Структура, Соответствие или Массив — в зависимости от корня JSON
Неопределено или исключение при разборе
Текст читается нормально
Кракозябры — неверная кодировка при чтении файла
Все ожидаемые свойства присутствуют и имеют нужный тип
Часть полей отсутствует — добавьте проверки Свойство() и значения по умолчанию
Часто задаваемые вопросы
Чем отличается ПрочитатьJSON от ЧтениеJSON?
ЧтениеJSON — это объект-«считыватель», который открывает источник данных (строку или файл). ПрочитатьJSON — глобальная процедура, которая за один вызов превращает весь поток из ЧтениеJSON в готовое дерево значений (Структуру, Соответствие, Массив). Обычно они используются вместе: сначала создаётся ЧтениеJSON, затем вызывается ПрочитатьJSON.
Как преобразовать строковую дату из JSON в тип Дата 1С?
JSON не имеет типа «дата», поэтому даты приходят строками, чаще в формате ISO 8601 («2026-05-17T10:30:00»). Универсальный способ — разобрать строку функцией ПрочитатьДатуJSON (доступна в составе глобального контекста в свежих версиях платформы) или вручную выделить подстроки и собрать дату через Дата(Год, Месяц, День, Час, Минута, Секунда).
Почему возникает ошибка «Недопустимое имя свойства»?
ПрочитатьJSON по умолчанию создаёт Структуру, а ключи структуры должны подчиняться правилам имён переменных: без пробелов, дефисов, не начинаться с цифры. Если во входящем JSON есть свойства вида «order-id» или «123abc», читайте данные в Соответствие, передав вторым параметром Истина.
Можно ли прочитать JSON в управляемых формах и на тонком клиенте?
Да, ПрочитатьJSON и ЧтениеJSON доступны на тонком и веб-клиенте. Ограничение касается файловой системы: на клиенте чтение файла требует интерактивного выбора или расширения работы с файлами. Стандартная схема — передать файл на сервер (НачатьПомещениеФайлаНаСервер) и разобрать его в серверной процедуре.
Что делать, если JSON содержит вложенные массивы внутри массивов?
Глубина вложенности не ограничена: каждый вложенный массив после ПрочитатьJSON остаётся обычным Массивом, который обходится вложенным циклом Для Каждого. Перед обходом уровня полезно проверять тип элемента через ТипЗнч(Элемент) = Тип("Массив"), чтобы код не падал на неоднородных данных.
Как записать данные обратно в JSON?
Используется зеркальная пара: объект ЗаписьJSON и процедура ЗаписатьJSON(Запись, Данные). Структуры, соответствия, массивы и примитивные типы сериализуются автоматически. Для дат применяется функция ЗаписатьДатуJSON с указанием формата, например ФорматДатыJSON.ISO.
Что важно запомнить
Основной путь: ЧтениеТекста для файла → ЧтениеJSON с УстановитьСтроку → ПрочитатьJSON. Читайте в Соответствие при проблемных именах свойств, проверяйте наличие полей через Свойство(), оборачивайте разбор в Попытку, а для больших файлов применяйте потоковое чтение.