Как правильно выгрузить данные из 1С в формат JSON?

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

Перед многими разработчиками 1С встает задача интеграции с другими системами, и часто форматом обмена данными выступает JSON. Новички могут задаться вопросом: можно ли просто сформировать текстовый файл с нужной структурой, добавить скобки, кавычки и сохранить его с расширением .json? Технически да, но это крайне плохая практика, чреватая синтаксическими ошибками, проблемами с экранированием спецсимволов и сложностями в поддержке кода. Рассмотрим, как делать это правильно, используя встроенные инструменты платформы 1С:Предприятие. При необходимости визуализировать структуру и проверить корректность разметки можно использовать универсальный валидатор и генератор кода 1С для работы с JSON.

Основы: сопоставление структур данных 1С и JSON

Чтобы эффективно работать с JSON в 1С, в первую очередь нужно понять, как его основные элементы соотносятся с типами данных в 1С. Запомнить это очень просто:

  1. Объект JSON (заключается в фигурные скобки {}) — это набор пар "ключ-значение". В 1С ему соответствуют объекты Структура или Соответствие. Чаще всего используется Структура, если ключи являются валидными идентификаторами 1С.
  2. Массив JSON (заключается в квадратные скобки []) — это упорядоченный список значений. В 1С ему соответствует объект Массив.

Понимая эти два простых правила, мы можем собрать в 1С практически любую необходимую JSON-структуру, комбинируя массивы и структуры.

Способ 1: Ручное формирование с помощью объекта `ЗаписьJSON`

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

В этом коде мы вручную перебираем массив структур (полученный из таблицы значений), открываем и закрываем каждый объект и массив, а также записываем каждое свойство и его значение. Обратите внимание на ручную обработку типов данных — это одна из причин, почему этот способ не самый удобный.


// Предполагается, что ТвояТаблицаЗначений уже заполнена
МассивСтруктур = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТвояТаблицаЗначений);
 
ЗаписьДЖСОН = Новый ЗаписьJSON;
ЗаписьДЖСОН.УстановитьСтроку(); // Результат будем получать в виде строки
 
Попытка
    ЗаписьДЖСОН.ЗаписатьНачалоМассива(); // Начинаем массив - [
 
    Для Каждого Структ Из МассивСтруктур Цикл
        ЗаписьДЖСОН.ЗаписатьНачалоОбъекта(); // Начинаем объект - {
 
        Для Каждого Элемент Из Структ Цикл
            ЗаписьДЖСОН.ЗаписатьИмяСвойства(Элемент.Ключ);
            
            // Ручная обработка типов
            ЗначениеНаЗапись = Элемент.Значение;
            Если ТипЗнч(Элемент.Значение) = Тип("Дата") Тогда
                ЗначениеНаЗапись = Формат(Элемент.Значение, "ДФ=yyyy-MM-dd");
            ИначеЕсли Не (ТипЗнч(Элемент.Значение) = Тип("Строка")
                Или ТипЗнч(Элемент.Значение) = Тип("Число")
                Или ТипЗнч(Элемент.Значение) = Тип("Булево"))
            Тогда
                ЗначениеНаЗапись = СокрЛП(Строка(Элемент.Значение));
            КонецЕсли;
            
            ЗаписьДЖСОН.ЗаписатьЗначение(ЗначениеНаЗапись);
        КонецЦикла;
        
        ЗаписьДЖСОН.ЗаписатьКонецОбъекта(); // Завершаем объект - }
    КонецЦикла;
 
    ЗаписьДЖСОН.ЗаписатьКонецМассива(); // Завершаем массив - ]
Исключение
    // обработка исключения
КонецПопытки;
 
РезультатJSON = ЗаписьДЖСОН.Закрыть();

Вывод: Этот метод работает, но требует много кода для простых задач. Для большинства случаев есть способ лучше и проще.

Способ 2: Автоматическая сериализация — простой и рекомендуемый путь

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

Пример 1: Выгрузка таблицы значений в массив объектов

Допустим, нам нужно получить JSON вида, как в `Сообщении 3` на форуме: массив объектов, где каждый объект — это строка таблицы. Разберем по шагам.

  1. Создадим данные в 1С, которые соответствуют нужной структуре. Нам нужен Массив, элементами которого будут Структуры.
  2. Передадим этот массив в функцию ЗаписатьJSON().

Посмотрим на пример кода:


// 1. Подготовка данных
// Допустим, у нас есть ТаблицаЗначений ТЗ с колонками "col01", "col02"
МассивСтруктур = Новый Массив;
Для Каждого СтрокаТЗ Из ТЗ Цикл
    НоваяСтруктура = Новый Структура;
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        НоваяСтруктура.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);
    КонецЦикла;
    МассивСтруктур.Добавить(НоваяСтруктура);
КонецЦикла;
 
// 2. Сериализация
ЗаписьJSON = Новый ЗаписьJSON;
// Установим параметры для красивого форматирования с отступами
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрок.Авто, "  "));
 
// ВОТ КЛЮЧЕВОЙ МОМЕНТ! Вся магия в одной строке
ЗаписатьJSON(ЗаписьJSON, МассивСтруктур);
 
РезультатJSON = ЗаписьJSON.Закрыть();
Сообщить(РезультатJSON); // Получим готовый, отформатированный JSON

Важно: В новых версиях платформы (например, 8.3.23 и выше) работа с JSON еще больше упрощается, и можно сериализовать ТаблицуЗначений напрямую, без предварительного преобразования в массив структур.

Пример 2: Создание объекта с вложенными объектами

Теперь решим задачу из `Сообщения 5`: создать JSON, где ключами являются "row01", "row02", а значениями — вложенные объекты с разными наборами полей. В 1С это будет Структура, значениями которой являются другие Структуры.


// 1. Подготовка данных
ГлавнаяСтруктура = Новый Структура;
 
// Заполняем "row01"
СтруктураRow01 = Новый Структура("col01, col02, col03, col04", 23.45, 34.5, 34, 45);
ГлавнаяСтруктура.Вставить("row01", СтруктураRow01);
 
// Заполняем "row02"
СтруктураRow02 = Новый Структура("col01, col03", 45, 34);
ГлавнаяСтруктура.Вставить("row02", СтруктураRow02);
 
// Заполняем "row03"
СтруктураRow03 = Новый Структура("col02, col04", 23, 45);
ГлавнаяСтруктура.Вставить("row03", СтруктураRow03);
 
// 2. Сериализация
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрок.Авто, "  "));
 
ЗаписатьJSON(ЗаписьJSON, ГлавнаяСтруктура);
 
РезультатJSON = ЗаписьJSON.Закрыть();
Сообщить(РезультатJSON);

Как видите, код получается чистым, наглядным и точно отражает требуемую структуру JSON.

Особые случаи: правильная работа с датами

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

Рассмотрим, как выгрузить дату в общепринятом формате ISO 8601 (например, "2023-10-27T15:30:00").


// Создаем объект с настройками
НастройкиСериализации = Новый НастройкиСериализацииJSON;
// Указываем, что дата должна быть в формате ISO
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
// Указываем, как обрабатывать временную зону (в данном случае, время на локальном компьютере)
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
 
// Пример данных с датой
ДанныеДляВыгрузки = Новый Структура;
ДанныеДляВыгрузки.Вставить("Событие", "Запуск выгрузки");
ДанныеДляВыгрузки.Вставить("ДатаСобытия", ТекущаяДата());
 
// Сериализуем, передавая третьим параметром наши настройки
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрок.Авто, "  "));
 
ЗаписатьJSON(ЗаписьJSON, ДанныеДляВыгрузки, НастройкиСериализации);
 
РезультатJSON = ЗаписьJSON.Закрыть();
Сообщить(РезультатJSON);

Использование НастройкиСериализацииJSON позволяет избежать проблем с неверной интерпретацией дат на стороне получателя и является обязательным элементом качественной интеграции.

Итог: для выгрузки данных из 1С в JSON всегда используйте встроенные механизмы. Предпочтение отдавайте автоматической сериализации, так как это просто, надежно и эффективно. Ручное формирование строки — путь к ошибкам, которого следует избегать. Для построения полноценного обмена без написания кода вручную можно использовать конструктор API для интеграции баз 1С в формате JSON.

← На главную