Как лучше записывать многострочный JSON в код 1С для обмена с внешними системами?

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

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

Проблема записи JSON в коде 1С

Основная сложность заключается в том, что JSON-строка, содержащая двойные кавычки и переносы строк, требует их экранирования при вставке в строковый литерал 1С. Это делает код громоздким и неудобочитаемым. Например, для простого JSON { "a": 1, "b": 2 } пришлось бы писать что-то вроде "{""a"": 1, ""b"": 2}". А для многострочного JSON это становится еще сложнее.

Разработчики стремятся найти способ, который позволит:

  1. Вставлять JSON как есть, с минимальными изменениями, напрямую из документации.
  2. Сохранять визуальную наглядность структуры данных.
  3. Легко подставлять динамические значения в шаблон JSON.

Решение 1: Использование макетов (текстовых или табличных)

Один из наиболее удобных и наглядных способов хранения многострочных JSON-шаблонов – это использование макетов в конфигурации 1С. Мы можем разместить полный текст JSON в ячейке табличного документа или в текстовом макете.

Преимущества данного подхода:

  1. Визуальная наглядность: JSON хранится в своем исходном виде без экранирования, что значительно упрощает его чтение и редактирование. Это позволяет легко сверять шаблон с документацией внешней системы.
  2. Централизованное хранение: Шаблоны JSON можно хранить в одном месте, что удобно для сопровождения и администрирования.
  3. Именованный доступ: Мы можем присваивать имена ячейкам или макетам, что позволяет легко извлекать нужный JSON по имени из кода, делая его более читаемым.

Как реализовать:

  1. Создайте новый макет: В дереве конфигурации создайте новый макет (например, типа "Табличный документ" или "Текст"). Выберите тип в зависимости от ваших предпочтений и сложности макета.
  2. Разместите JSON: Вставьте ваш JSON-шаблон в одну из ячеек табличного документа или в поле текстового макета. Для табличного документа выделите ячейку (или несколько объединенных ячеек), в которую будете вставлять JSON.
  3. Присвойте имя (для табличного документа): Если используете табличный документ, на панели инструментов включите отображение имен ячеек (кнопка "Отображать именованные ячейки"). Выделите ячейку с JSON и нажмите комбинацию клавиш Ctrl+Shift+N, чтобы задать ей уникальное и осмысленное имя (например, МойJSONШаблонЗаказа).
  4. Извлеките JSON из кода: В вашем модуле получите доступ к макету и его области по имени. Рассмотрим пример получения макета из объекта обработки или формы:
    
    // Предположим, макет находится в ОбщейФорме, ОбщемМодуле, или любом другом объекте с макетами.
    // В данном примере мы получаем макет из объекта обработки (или формы).
    // Замените "ИмяОбъектаСМакетом" на реальное имя объекта (например, "Обработка.МояОбработка")
    // и "МакетИмя" на имя вашего макета в конфигурации.
    Перем ИмяОбъектаСМакетом Экспорт; // Например, так можно получить имя из модуля
    ИмяОбъектаСМакетом = "МакетДляОбмена"; // Предполагаем, что есть такой макет в конфигурации
    
    // Если макет находится в форме или обработке, можно получить его так:
    ОбъектСсылка = РеквизитФормыВЗначение("Объект"); // Получаем текущий объект формы или обработки
    Макет = ОбъектСсылка.ПолучитьМакет("МойМакетJSON");
    
    // Если макет текстовый:
    // СтрокаJSONШаблон = Макет.ПолучитьТекст();
    
    // Если макет табличный и JSON хранится в именованной ячейке:
    СтрокаJSONШаблон = Макет.Области.МояЯчейка.Текст;
    // В СтрокаJSONШаблон теперь содержится текст JSON без экранирования.
    
  5. Подставьте динамические значения: Если ваш JSON является шаблоном с метками для подстановки значений (например, %1, %2), используйте функцию СтрШаблон() для их замены. Это позволяет легко интегрировать переменные данные в ваш шаблон.
    
    // Пример JSON-шаблона, который может храниться в макете:
    // {
    //   "productType": "%1",
    //   "patches": [
    //     {
    //       "op": "replace",
    //       "path": "/attributes/purchasable_offer",
    //       "value": {
    //         "currency": "EUR",
    //         "our_price": [
    //           [
    //             { "value_with_tax": %2 }
    //           ]
    //         ]
    //       }
    //     }
    //   ]
    // }
    
    Цена = 123.45; // Динамическое значение, которое нужно подставить
    productType = "PRODUCT"; // Другое динамическое значение
    
    // Предполагаем, что СтрокаJSONШаблон уже содержит текст из макета
    // JSONСтрокаИзМакета = "{ \"productType\": \"%1\", ... \"value_with_tax\": %2 ... }"
    
    JSONДляОтправки = СтрШаблон(СтрокаJSONШаблон, productType, Цена);
    
    Сообщить("Сформированный JSON для отправки:");
    Сообщить(JSONДляОтправки);
    

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

Решение 2: Программное формирование JSON с использованием объектов 1С

Альтернативным подходом является полное программное построение JSON с использованием встроенных объектов 1С: Структура, Массив и ЗаписьJSON. Этот метод предоставляет максимальную гибкость и контроль над формируемой структурой данных. Для автоматической генерации такого кода по готовой строке можно использовать инструмент для формирования кода структур и массивов 1С.

Как реализовать:

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

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


// Исходный JSON для примера, который нам нужно сформировать:
// {
//   "productType": "PRODUCT",
//   "patches": [
//     {
//       "op": "replace",
//       "path": "/attributes/purchasable_offer",
//       "value": {
//         "currency": "EUR",
//         "our_price": [
//           [
//             { "value_with_tax": 123.456 }
//           ]
//         ]
//       }
//     }
//   ]
// }

// *** Основная процедура, инициирующая создание JSON ***
Процедура СоздатьJSONПрограммно()
    ТипПродукта = "PRODUCT";
    Валюта = "EUR";
    ЦенаСНалогами = 123.456;

    // Шаг 1: Создаем массив действий (patches)
    Действия = Новый Массив;
    ДобавитьДействие(Действия, "replace", "/attributes/purchasable_offer", ПараметрыДействия(Валюта, НаборЦенПродукта(ЦенаСНалогами)));

    // Шаг 2: Создаем корневую структуру данных
    Данные = ДанныеОбновления(ТипПродукта, Действия);

    // Шаг 3: Записываем структуру в JSON-строку
    ПараметрыЗаписи = Новый ПараметрыЗаписиJSON( , Символы.Таб); // Для форматированного вывода с отступами
    ЗаписьJSONОбъект = Новый ЗаписьJSON;
    ЗаписьJSONОбъект.УстановитьСтроку(ПараметрыЗаписи);
    ЗаписатьJSON(ЗаписьJSONОбъект, Данные);
    СтрокаJSON = ЗаписьJSONОбъект.Закрыть();

    Сообщить("Сформированный JSON с помощью объектов 1С:");
    Сообщить(СтрокаJSON);
КонецПроцедуры

// *** Вспомогательные функции для построения отдельных частей JSON ***

// Формирует корневую структуру данных обновления
Функция ДанныеОбновления(Знач ТипПродукта, Знач ДействияМассив)
    ДанныеОбновленияСтруктура = Новый Структура;
    ДанныеОбновленияСтруктура.Вставить("productType", ТипПродукта);
    ДанныеОбновленияСтруктура.Вставить("patches", ДействияМассив);
    Возврат ДанныеОбновленияСтруктура;
КонецФункции

// Добавляет одно действие (патч) в массив
Процедура ДобавитьДействие(Знач НаборДействий, Знач Операция, Знач Путь, Знач Параметры)
    ДействиеСтруктура = Новый Структура;
    ДействиеСтруктура.Вставить("op", Операция);
    ДействиеСтруктура.Вставить("path", Путь);
    ДействиеСтруктура.Вставить("value", Параметры);
    НаборДействий.Добавить(ДействиеСтруктура);
КонецПроцедуры

// Формирует структуру "value" для действия (валюта и цена)
Функция ПараметрыДействия(Знач Валюта, Знач НаборЦен)
    ПараметрыДействияСтруктура = Новый Структура;
    ПараметрыДействияСтруктура.Вставить("currency", Валюта);
    ПараметрыДействияСтруктура.Вставить("our_price", НаборЦен);
    Возврат ПараметрыДействияСтруктура;
КонецФункции

// Формирует массив "our_price" (включая вложенные массивы)
Функция НаборЦенПродукта(Знач ЦенаСНалогами)
    ЦенаСтруктура = Новый Структура;
    ЦенаСтруктура.Вставить("value_with_tax", ЦенаСНалогами);

    МассивВложенныйЦен = Новый Массив;
    МассивВложенныйЦен.Добавить(ЦенаСтруктура);

    НаборЦенМассив = Новый Массив;
    НаборЦенМассив.Добавить(МассивВложенныйЦен); // Добавляем вложенный массив

    Возврат НаборЦенМассив;
КонецФункции

Преимущества данного подхода:

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

Особенности и потенциальные недостатки:

  1. Снижение наглядности для сложных структур: Для очень сложных и глубоко вложенных JSON-структур код, пошагово строящий объекты 1С, может стать менее читаемым, чем исходный JSON-шаблон. Это особенно актуально, когда нужно визуально сверять структуру с документацией API.
  2. Отсутствие автодополнения (IntelliSense): При работе с динамически созданными Структурами и Массивами в 1С отсутствует автодополнение свойств, что может усложнить написание и поддержку кода, если структура часто меняется или очень велика. Разработчику приходится вручную помнить названия всех полей.
  3. Больше кода: Для формирования сложной структуры может потребоваться написание значительного объема кода. Для решения этой проблемы рекомендуется декомпозировать процесс на множество небольших вспомогательных функций, каждая из которых формирует часть JSON, как показано в примере выше.

Решение 3: Использование XDTO-пакетов

Платформа 1С предоставляет механизм XDTO-пакетов, который изначально предназначен для работы с XML, но также поддерживает прямое преобразование в JSON и обратно. Это может быть мощным инструментом для интеграции, особенно если у вас есть формализованные схемы данных. Для подготовки схемы под такой пакет можно использовать обработку для автоматического формирования XSD-файла.

Как это работает:

  1. Определите схему данных: Мы создаем XDTO-пакет в конфигурации 1С. В этом пакете мы описываем структуру данных в терминах объектов, свойств и типов, аналогично тому, как это делается в XML-схемах (XSD). Это по сути является формализованной схемой вашего JSON.
  2. Создайте объект XDTO: На основе определенной схемы мы создаем экземпляры объектов XDTO и заполняем их данными, используя методы 1С.
  3. Преобразуйте в JSON: Платформа 1С может напрямую сериализовать объект XDTO в строку JSON. Для этого используется объект ЗаписьJSON с соответствующими параметрами, указывающими на объект XDTO.

Преимущества:

  1. Строгая типизация и валидация: XDTO-пакеты обеспечивают строгую типизацию данных и позволяют выполнять валидацию, что полезно для предотвращения ошибок и обеспечения соответствия формату внешней системы.
  2. Удобство для комплексных схем: Для очень сложных и часто используемых схем данных, которые могут быть описаны в виде формализованной схемы (например, если API предоставляет XSD-схемы), XDTO может быть мощным инструментом для их представления в 1С.

Потенциальные сложности:

  1. Начальная конвертация: Если у вас есть JSON-документация, вам потребуется сначала преобразовать этот JSON в схему XDTO (чаще всего в виде XML-схемы XSD) для создания XDTO-пакета в конфигурации 1С. Это добавляет дополнительный шаг и может быть нетривиальной задачей.
  2. Сложность освоения: Использование XDTO может потребовать дополнительного изучения, особенно для разработчиков, не знакомых с концепциями XML-схем и принципами работы XDTO в 1С.

Дополнительные подходы и рекомендации

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

  1. Хранение JSON во внешних файлах: Для шаблонов, которые не требуют частых изменений через конфигуратор или которые должны быть легко доступны для редактирования вне 1С, мы можем хранить JSON в отдельных текстовых файлах (например, с расширением .json). Эти файлы можно читать с помощью объектов ЧтениеТекста или ТекстовыйДокумент в 1С. Этот подход позволяет изменять шаблоны без пересоздания и обновления конфигурации.
  2. Использование регистра сведений: Для более гибкого управления JSON-шаблонами или их фрагментами можно создать регистр сведений. Например, в измерениях мы можем указать идентификатор шаблона или метод API, а в ресурсе хранить сам JSON-текст. Это позволяет изменять JSON динамически через пользовательский интерфейс 1С без обновления конфигурации.
  3. Строковые литералы с разделителями (для новых версий 1С): В последних версиях платформы 1С (начиная с 8.3.10) появилась возможность использовать строковые литералы с альтернативными разделителями (например, обратные кавычки ` или тройные кавычки """, '''). Это позволяет избежать экранирования кавычек внутри строки, если выбрать разделитель, который не встречается в JSON. Это значительно упрощает вставку многострочных JSON-строк в код, делая его более читаемым.
    
    // Пример использования строкового литерала с обратными кавычками
    JSONСтрока = `
    {
        "id": "123",
        "data": {
            "name": "ТестовыйПродукт",
            "quantity": 10
        }
    }
    `;
    Сообщить(JSONСтрока);
    
    Однако, этот метод все равно требует ручной подстановки динамических значений или использования СтрШаблон.
  4. Применение специализированных библиотек или модулей: В сообществе 1С разработчики часто делятся готовыми решениями, которые могут упростить работу с JSON, предоставляя более высокоуровневые функции для формирования сложных структур или работы с шаблонами. Мы можем поискать такие решения на специализированных ресурсах (например, на Infostart) для экономии времени.

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

← На главную