Как программно работать с форматом JSON в 1С 8.3: чтение и запись данных

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основы работы с JSON: объекты ЗаписьJSON и ЧтениеJSON

Для взаимодействия с JSON в 1С используются специализированные объекты ЗаписьJSON и ЧтениеJSON. Разберем по шагам процесс подготовки системы к работе с этим форматом. Важно понимать, что эти объекты сами по себе не хранят данные, а являются "потоковыми" инструментами для записи или считывания информации.

Рассмотрим процесс инициализации записи. Прежде чем начать формирование структуры, необходимо подготовить объект и определить параметры форматирования. Проанализируем следующий пример:


ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);

В данном коде мы создаем ПараметрыЗаписиJSON, которые позволяют сделать итоговый текст читаемым (так называемый "pretty print"). Использование Истина в третьем параметре включает экранирование символов, что критически важно для корректной передачи кириллицы.

Сериализация данных: от простых типов к сложным структурам

Платформа 1С позволяет записывать данные в JSON двумя способами: ручным формированием и автоматической сериализацией. Выясним причину, по которой автоматический способ предпочтительнее. Функция ЗаписатьJSON() позволяет мгновенно превратить объекты 1С (такие как Структура, Массив, Соответствие) в валидный JSON-код.

Посмотрим на пример формирования сложного объекта, содержащего информацию о заказе и перечень товаров:


ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("НомерЗаказа", "INV-2023-001");
ДанныеДляОтправки.Вставить("Дата", ТекущаяДата());
ДанныеДляОтправки.Вставить("Сумма", 15500.50);

МассивТоваров = Новый Массив;
Товар1 = Новый Структура("Артикул, Количество", "A001", 10);
Товар2 = Новый Структура("Артикул, Количество", "B002", 5);
МассивТоваров.Добавить(Товар1);
МассивТоваров.Добавить(Товар2);

ДанныеДляОтправки.Вставить("Товары", МассивТоваров);

// Сериализация структуры в JSON
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
РезультатСтрокой = ЗаписьJSON.Закрыть();

Разберем, что произошло в этом примере. Мы создали вложенную структуру, где одним из полей является массив. Функция ЗаписатьJSON автоматически обходит все уровни вложенности и корректно расставляет квадратные и фигурные скобки. Это значительно сокращает объем кода и минимизирует риск возникновения синтаксических ошибок в формате.

Чтение и десериализация JSON-данных

Теперь проанализируем обратную задачу: получение данных из JSON-строки. Для этого мы используем объект ЧтениеJSON и функцию ПрочитатьJSON(). Важным моментом является то, что по умолчанию 1С преобразует JSON-объекты в Соответствие, а не в Структуру. Если вы хотите работать именно со структурами (что удобнее из-за возможности обращения через точку), это нужно указать явно.

Рассмотрим подробнее процесс десериализации:


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстИзВнешнегоИсточника);

// Читаем данные в структуру (по умолчанию возвращается Соответствие)
ДанныеОбъекта = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();

// Обращение к данным
Если ДанныеОбъекта.Свойство("НомерЗаказа") Тогда
    Сообщить("Обработка заказа: " + ДанныеОбъекта.НомерЗаказа);
КонецЕсли;

Использование второго параметра Истина в функции ПрочитатьJSON заставляет платформу создавать структуры. Это позволяет обращаться к полям как ДанныеОбъекта.НомерЗаказа вместо ДанныеОбъекта["НомерЗаказа"]. Однако помните, что ключи в структурах 1С должны соответствовать правилам именования переменных (не могут начинаться с цифр и содержать спецсимволы). Если JSON содержит ключи типа "1_Item", используйте только Соответствие.

Работа с датами и специальными типами через XDTO

Одной из главных проблем при работе с JSON является формат даты. Стандарт JSON не определяет строгий формат для дат, часто используя ISO 8601 или формат Microsoft. В 1С 8.3 реализован удобный механизм через СериализаторXDTO.

Выясним, как правильно записывать даты, чтобы их понимали другие системы. Проанализируем ситуацию, когда нам нужно передать дату в универсальном формате:


Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
// Используем XDTO для сериализации даты
ЗаписатьJSON(Запись, ТекущаяДата(), НазначениеТипаJSON.Обязательное, "Дата", СериализаторXDTO);
JSON_Дата = Запись.Закрыть();

Использование СериализаторXDTO гарантирует, что дата будет записана в формате, принятом в веб-разработке (например, "2023-10-27T12:00:00"). При чтении таких данных также рекомендуется передавать СериализаторXDTO в функцию ПрочитатьJSON, чтобы строки автоматически конвертировались обратно в тип Дата платформы 1С.

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

Если вам необходимо прочитать файл размером в несколько сотен мегабайт, функция ПрочитатьJSON может вызвать переполнение оперативной памяти, так как она пытается загрузить весь объект целиком. В таких случаях мы используем событийную модель обработки.

Разберем по шагам алгоритм потокового чтения:

  1. Открываем файл с помощью ЧтениеJSON.
  2. В цикле вызываем метод Прочитать().
  3. Анализируем свойство ТипУзла (начало объекта, начало массива, имя свойства, значение).
  4. Выполняем действия в зависимости от текущего узла.

Посмотрим на пример реализации потокового чтения имен всех товаров из огромного массива:


Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\Temp\BigData.json");

Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаJSON.ИмяСвойства И Чтение.Значение = "Наименование" Тогда
        // Читаем следующее значение, которое и будет строкой с названием
        Чтение.Прочитать();
        Сообщить("Найден товар: " + Чтение.Значение);
    КонецЕсли;
КонецЦикла;

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

Этот метод работает максимально быстро и потребляет минимальное количество памяти, так как в каждый момент времени в памяти находится только один фрагмент (узел) JSON-структуры.

Практические советы по отладке

При работе с внешними API часто возникают ситуации, когда структура приходящего JSON заранее неизвестна или может меняться. Проанализируем несколько советов по повышению отказоустойчивости вашего кода:

Таким образом, мы рассмотрели полный цикл работы с JSON в 1С. Понимание разницы между потоковым чтением и полной десериализацией, а также умение работать с XDTO-сериализатором, позволяет создавать надежные и быстрые интеграционные решения.

← На главную