В современной разработке на платформе 1С:Предприятие 8.3 обмен данными через формат 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(). Важным моментом является то, что по умолчанию 1С преобразует JSON-объекты в Соответствие, а не в Структуру. Если вы хотите работать именно со структурами (что удобнее из-за возможности обращения через точку), это нужно указать явно.
Рассмотрим подробнее процесс десериализации:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстИзВнешнегоИсточника);
// Читаем данные в структуру (по умолчанию возвращается Соответствие)
ДанныеОбъекта = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
// Обращение к данным
Если ДанныеОбъекта.Свойство("НомерЗаказа") Тогда
Сообщить("Обработка заказа: " + ДанныеОбъекта.НомерЗаказа);
КонецЕсли;
Использование второго параметра Истина в функции ПрочитатьJSON заставляет платформу создавать структуры. Это позволяет обращаться к полям как ДанныеОбъекта.НомерЗаказа вместо ДанныеОбъекта["НомерЗаказа"]. Однако помните, что ключи в структурах 1С должны соответствовать правилам именования переменных (не могут начинаться с цифр и содержать спецсимволы). Если JSON содержит ключи типа "1_Item", используйте только Соответствие.
Одной из главных проблем при работе с 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.Прочитать().ТипУзла (начало объекта, начало массива, имя свойства, значение).Посмотрим на пример реализации потокового чтения имен всех товаров из огромного массива:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\Temp\BigData.json");
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаJSON.ИмяСвойства И Чтение.Значение = "Наименование" Тогда
// Читаем следующее значение, которое и будет строкой с названием
Чтение.Прочитать();
Сообщить("Найден товар: " + Чтение.Значение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Этот метод работает максимально быстро и потребляет минимальное количество памяти, так как в каждый момент времени в памяти находится только один фрагмент (узел) JSON-структуры.
При работе с внешними API часто возникают ситуации, когда структура приходящего JSON заранее неизвестна или может меняться. Проанализируем несколько советов по повышению отказоустойчивости вашего кода:
Попытка...Исключение при вызове ПрочитатьJSON. Некорректный символ в строке может привести к аварийному завершению фонового задания.Свойство() для структур или Получить() для соответствий перед обращением к значениям.ТекстовыйДокумент для предварительной конвертации.ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON) с включенным отступом, чтобы видеть иерархию в отладчике.Таким образом, мы рассмотрели полный цикл работы с JSON в 1С. Понимание разницы между потоковым чтением и полной десериализацией, а также умение работать с XDTO-сериализатором, позволяет создавать надежные и быстрые интеграционные решения.