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

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

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

Основы работы с JSON: выбор метода

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

Разберем по шагам наиболее популярный и удобный сценарий — преобразование JSON-строки в объект 1С. Для этого нам понадобится следующая последовательность действий:

  1. Создать объект типа ЧтениеJSON.
  2. Установить строку или открыть файл для чтения.
  3. Вызвать функцию ПрочитатьJSON, которая вернет результат в виде коллекции 1С.
  4. Закрыть чтение.

Рассмотрим подробнее пример кода для парсинга простой JSON-строки:


// Инициализируем объект чтения
Чтение = Новый ЧтениеJSON;

// Строка, которую мы получили, например, из HTTP-ответа
ТекстJSON = "{""Имя"": ""Иван"", ""Возраст"": 30, ""Сотрудник"": true}";

// Устанавливаем строку для чтения
Чтение.УстановитьСтроку(ТекстJSON);

// Читаем данные в структуру 1С
Данные = ПрочитатьJSON(Чтение);

// Теперь мы можем обращаться к полям напрямую
ИмяСотрудника = Данные.Имя;
Возраст = Данные.Возраст;

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

Работа со сложными и вложенными структурами

На практике JSON редко бывает плоским. Чаще всего мы сталкиваемся с глубокой вложенностью массивов и объектов. Для предварительного анализа таких данных удобно использовать инструменты для просмотра файлов json в дереве значений. Проанализируем ситуацию, когда нам нужно извлечь данные из массива объектов. Платформа 1С автоматически конвертирует квадратные скобки [] в Массив, а фигурные скобки {} в Структуру (или Соотвествие, если имена ключей не соответствуют правилам именования переменных в 1С).

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

Посмотрим на пример обработки сложного JSON:


// Пример JSON с вложенным массивом
// {
//   "Отдел": "ИТ",
//   "Сотрудники": [
//     {"ФИО": "Петров", "Должность": "Разработчик"},
//     {"ФИО": "Сидоров", "Должность": "Тестировщик"}
//   ]
// }

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстСДанными);

// Читаем данные, указывая, что хотим получить соответствие для надежности
Результат = ПрочитатьJSON(Чтение, Истина); 

Если ТипЗнч(Результат) = Тип("Соответствие") Тогда
    МассивСотрудников = Результат["Сотрудники"];
    Для Каждого ТекущийСотрудник Из МассивСотрудников Цикл
        Сообщить(ТекущийСотрудник["ФИО"] + " - " + ТекущийСотрудник["Должность"]);
    КонецЦикла;
КонецЕсли;

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

Сериализация данных в JSON

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

Рассмотрим алгоритм создания JSON по шагам:

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

// Подготовим структуру для отправки
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("ДатаЗапроса", ТекущаяДата());
ДанныеДляОтправки.Вставить("Статус", "Active");

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

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

// Настраиваем параметры записи для красивого отображения (Pretty Print)
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ");

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

// Сериализуем объект
ЗаписатьJSON(Запись, ДанныеДляОтправки);

РезультатJSON = Запись.Закрыть();
Сообщить(РезультатJSON);

Важные нюансы при работе с датами

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

Проанализируем использование системного перечисления ФорматДатыJSON. Мы можем указать платформе, в каком виде мы хотим видеть дату. По умолчанию используется формат ISO, который понимает большинство внешних систем. Однако, если нам нужно кастомизировать процесс, мы можем использовать функции обратного вызова (callback).

Рассмотрим пример настройки формата даты:


// При чтении JSON с датами
Функция ПреобразоватьДату(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
    // Здесь можно реализовать свою логику парсинга специфичных форматов
    Возврат Значение; 
КонецФункции

// При записи можно указать формат
ЗаписатьJSON(Запись, СтруктураСДатой, НазначениеТипаДанныхJSON.Явное, "ПреобразоватьДату", ЭтотОбъект);

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

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

Разберем пример обхода файла по токенам:


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

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

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

Заключение и рекомендации

Мы рассмотрели основные инструменты 1С для работы с JSON. Главное правило: для небольших и средних пакетов данных всегда используйте ПрочитатьJSON и ЗаписатьJSON с коллекциями Структура и Массив — это значительно ускоряет разработку и делает код читаемым. Для интеграций, требующих передачи ссылочных типов, не забывайте предварительно конвертировать их в примитивные типы или использовать XDTO сериализацию, если это предусмотрено архитектурой решения.

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

← На главную