Взаимодействие с внешними системами через API часто требует отправки и получения данных в формате JSON. Запись JSON непосредственно в код 1С может быть затруднена из-за необходимости экранирования кавычек и переносов строк, что снижает читаемость и удобство. Рассмотрим различные подходы к решению этой задачи, исходя из практического опыта разработчиков.
Основная сложность заключается в том, что JSON-строка, содержащая двойные кавычки и переносы строк, требует их экранирования при вставке в строковый литерал 1С. Это делает код громоздким и неудобочитаемым. Например, для простого JSON { "a": 1, "b": 2 } пришлось бы писать что-то вроде "{""a"": 1, ""b"": 2}". А для многострочного JSON это становится еще сложнее.
Разработчики стремятся найти способ, который позволит:
Один из наиболее удобных и наглядных способов хранения многострочных JSON-шаблонов – это использование макетов в конфигурации 1С. Мы можем разместить полный текст JSON в ячейке табличного документа или в текстовом макете.
Преимущества данного подхода:
Как реализовать:
МойJSONШаблонЗаказа).
// Предположим, макет находится в ОбщейФорме, ОбщемМодуле, или любом другом объекте с макетами.
// В данном примере мы получаем макет из объекта обработки (или формы).
// Замените "ИмяОбъектаСМакетом" на реальное имя объекта (например, "Обработка.МояОбработка")
// и "МакетИмя" на имя вашего макета в конфигурации.
Перем ИмяОбъектаСМакетом Экспорт; // Например, так можно получить имя из модуля
ИмяОбъектаСМакетом = "МакетДляОбмена"; // Предполагаем, что есть такой макет в конфигурации
// Если макет находится в форме или обработке, можно получить его так:
ОбъектСсылка = РеквизитФормыВЗначение("Объект"); // Получаем текущий объект формы или обработки
Макет = ОбъектСсылка.ПолучитьМакет("МойМакетJSON");
// Если макет текстовый:
// СтрокаJSONШаблон = Макет.ПолучитьТекст();
// Если макет табличный и JSON хранится в именованной ячейке:
СтрокаJSONШаблон = Макет.Области.МояЯчейка.Текст;
// В СтрокаJSONШаблон теперь содержится текст 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, что очень важно при сверке с документацией внешней системы.
Альтернативным подходом является полное программное построение JSON с использованием встроенных объектов 1С: Структура, Массив и ЗаписьJSON. Этот метод предоставляет максимальную гибкость и контроль над формируемой структурой данных. Для автоматической генерации такого кода по готовой строке можно использовать инструмент для формирования кода структур и массивов 1С.
Как реализовать:
Новый Структура и Новый Массив для пошагового построения структуры данных, которая соответствует требуемому JSON.Запись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С отсутствует автодополнение свойств, что может усложнить написание и поддержку кода, если структура часто меняется или очень велика. Разработчику приходится вручную помнить названия всех полей.Платформа 1С предоставляет механизм XDTO-пакетов, который изначально предназначен для работы с XML, но также поддерживает прямое преобразование в JSON и обратно. Это может быть мощным инструментом для интеграции, особенно если у вас есть формализованные схемы данных. Для подготовки схемы под такой пакет можно использовать обработку для автоматического формирования XSD-файла.
Как это работает:
ЗаписьJSON с соответствующими параметрами, указывающими на объект XDTO.Преимущества:
Потенциальные сложности:
Помимо основных методов, обсуждавшихся на форуме, существуют и другие, которые могут быть полезны в различных сценариях:
.json). Эти файлы можно читать с помощью объектов ЧтениеТекста или ТекстовыйДокумент в 1С. Этот подход позволяет изменять шаблоны без пересоздания и обновления конфигурации.` или тройные кавычки """, '''). Это позволяет избежать экранирования кавычек внутри строки, если выбрать разделитель, который не встречается в JSON. Это значительно упрощает вставку многострочных JSON-строк в код, делая его более читаемым.
// Пример использования строкового литерала с обратными кавычками
JSONСтрока = `
{
"id": "123",
"data": {
"name": "ТестовыйПродукт",
"quantity": 10
}
}
`;
Сообщить(JSONСтрока);
СтрШаблон.Выбор оптимального подхода зависит от конкретных требований вашего проекта: сложности JSON-структур, частоты их изменений, требований к читаемости кода и предпочтений команды разработчиков. Для статических шаблонов с небольшими изменениями макеты или внешние файлы могут быть удобны, тогда как для сильно динамических структур предпочтительнее программное формирование через объектную модель 1С.