В современной разработке на платформе «1С:Предприятие 8.3» обмен данными через формат JSON стал стандартом де-факто. Это обусловлено его легкостью, читаемостью и нативной поддержкой со стороны большинства веб-сервисов и сторонних баз данных. В этой статье мы подробно разберем, как программно прочитать данные из JSON-файла, какие инструменты предоставляет платформа и на что стоит обратить внимание при десериализации сложных структур.
Начиная с версии платформы 8.3.6, в 1С появились встроенные средства для работы с JSON. Основной механизм работы строится на взаимодействии двух составляющих: объекта ЧтениеJSON, который отвечает за низкоуровневый доступ к потоку данных, и функции ПрочитатьJSON(), которая преобразует этот поток в привычные нам типы данных 1С (Структура, Массив, Соответствие).
Рассмотрим ситуацию: у нас есть файл, выгруженный из сторонней системы, содержащий информацию о документах. Наша задача — загрузить эти данные в информационную базу 1С.
Если файл имеет небольшой объем (до нескольких десятков мегабайт), самым простым и эффективным способом будет использование функции ПрочитатьJSON(). Проанализируем пример кода, который позволяет быстро получить данные из файла:
// Инициализируем объект для чтения
Чтение = Новый ЧтениеJSON;
// Открываем файл. Платформа самостоятельно определит кодировку (UTF-8, ANSI или Unicode)
Чтение.ОткрытьФайл("C:\Exchange\data.json");
// Читаем данные в структуру 1С
// Второй параметр Истина означает, что объекты JSON будут преобразованы в Соответствия,
// Ложь (по умолчанию) — в Структуры.
Данные = ПрочитатьJSON(Чтение, Ложь);
// Обязательно закрываем файл после чтения
Чтение.Закрыть();
В результате выполнения этого кода в переменной Данные окажется объект типа Структура, ключи которой будут соответствовать именам полей в JSON, а значения будут автоматически типизированы (Число, Строка, Булево, Дата).
Иногда данные приходят не в виде файла, а в виде текстового ответа от HTTP-сервиса. В этом случае вместо метода ОткрытьФайл() мы используем УстановитьСтроку(). Разберем этот вариант:
// Предположим, переменная ТекстJSON содержит строку в формате JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
// Превращаем строку в объект 1С
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Для удобства разработки рекомендуется создать универсальную функцию, которую можно вызывать из любого места конфигурации. Проанализируем следующий пример, который объединяет оба подхода и добавляет базовую обработку параметров:
Функция ИзJSON(Значение, ВСоответствие = Истина, ЭтоПутьКФайлу = Ложь) Экспорт
Чтение = Новый ЧтениеJSON;
Попытка
Если ЭтоПутьКФайлу Тогда
Чтение.ОткрытьФайл(Значение);
Иначе
Чтение.УстановитьСтроку(Значение);
КонецЕсли;
// Читаем данные. Вторая настройка определяет, использовать ли Соответствие
Результат = ПрочитатьJSON(Чтение, ВСоответствие);
Чтение.Закрыть();
Возврат Результат;
Исключение
// Важно обрабатывать ошибки структуры JSON
ЗаписьЖурналаРегистрации("Чтение JSON", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение "Ошибка при разборе JSON: " + ОписаниеОшибки();
КонецПопытки;
КонецФункции
Использование блока Попытка...Исключение является обязательным, так как JSON из внешних систем может быть поврежден или содержать синтаксические ошибки, что приведет к аварийному завершению работы кода 1С.
Часто возникает вопрос: как быть, если в файле передается дерево объектов или массив документов? В формате JSON массивы обозначаются квадратными скобками []. Платформа 1С автоматически преобразует их в объект типа Массив. Если корень файла начинается с { "documents": [...] }, то после вызова ПрочитатьJSON() вы получите структуру, где по ключу "documents" будет лежать массив структур.
Разберем, как обращаться к таким данным:
Данные = ИзJSON("C:\temp\data.json", Ложь, Истина);
Если Данные.Свойство("documents") Тогда
Для Каждого ТекДокумент Из Данные.documents Цикл
Сообщить("Обработка документа №" + ТекДокумент.NOMERDOC);
// Здесь можно реализовать поиск или создание документа в 1С
КонецЦикла;
КонецЕсли;
Формат JSON официально не содержит типа "Дата". Обычно даты передаются в виде строк (формат ISO 8601, например "2021-05-05T00:00:00.000Z"). Платформа 1С умеет автоматически распознавать такие строки и превращать их в тип Дата, но только если они соответствуют стандарту.
Если в вашем файле даты записаны в нестандартном формате, вы можете использовать третий параметр функции ПрочитатьJSON — ФункцияВосстановления. Это имя функции, которая будет вызываться для каждого прочитанного значения, позволяя вам вручную преобразовать строку в дату или любой другой специфичный объект.
Если вам необходимо прочитать JSON-файл размером в несколько гигабайт, метод ПрочитатьJSON() не подойдет, так как он попытается загрузить весь объем данных в оперативную память, что вызовет ошибку Out of Memory. В таких ситуациях мы используем последовательное (потоковое) чтение.
Рассмотрим, как это работает по шагам:
ЧтениеJSON и открываем файл.Прочитать(). Он перемещает курсор на следующий узел JSON (начало объекта, имя свойства, значение и т.д.).ТипТекущегоЗначения и реагируем соответствующим образом.Пример реализации потокового обхода:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\BigData.json");
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипТекущегоЗначения = ТипУзлаJSON.ИмяСвойства Тогда
ИмяСвойства = Чтение.ТекущееЗначение;
// Читаем само значение свойства
Чтение.Прочитать();
Значение = Чтение.ТекущееЗначение;
Если ИмяСвойства = "IDDOC" Тогда
// Обрабатываем конкретное поле
КонецЕсли;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Важный момент: автоматическая обработка экранированных символов (например, кириллицы вида \u0420) происходит автоматически. Вам не нужно писать дополнительные функции для декодирования текста, платформа сделает это сама при вызове методов ТекущееЗначение или ПрочитатьJSON.
Выясним, как типы данных JSON соотносятся с типами в языке 1С при автоматическом чтении:
Число.Строка.Булево.Неопределено.{}) преобразуется в Структура или Соответствие.[]) преобразуется в Массив.Проанализировав эти механизмы, мы видим, что 1С предоставляет мощный и гибкий инструментарий для интеграции. Для большинства повседневных задач достаточно функции ПрочитатьJSON, а для высоконагруженных систем обмена стоит освоить потоковый метод работы с объектом ЧтениеJSON.