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

1. 1234ru 27.01.25 20:35 Сейчас в теме
Нужно общаться с внешней системой, которая принимает данные в формате JSON. Он же дает наглядное представление о структуре данных. Поэтому хочется писать JSON прямо в коде.

Однако осложняется это необходимостью экранирования двойных кавычек и переводов строки.

Например, для

{
	"a": 1,
	"b": 2
}

придется написать что-то типа

"{
|	""a"": 1,
|	""b"": 2
|}"

А хотелось бы просто брать нужный JSON и вставлять его куда надо без таких вот изменений.

Логично было бы вынести в какое-то служебное хранилище, куда можно положить строку в режиме конфигуратора. Технически для этого подходят константы, но заводить константу на каждый такой случай не хочется.

Как тут грамотно действовать? Поделитесь опытом.
Найденные решения
10. miniogn 44 28.01.25 19:27 Сейчас в теме
(9) По крайней мере, ячейки таблицы можно использовать для хранения одного JSON целиком, если удобно хранить текстом.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:

	пИмяМакета = "Макет2";
	Обработка =  РеквизитФормыВЗначение("Объект");
	Макет = Обработка.ПолучитьМакет(пИмяМакета);
	
	СтрокаJSON = Макет.Области.МояЯчейка.Текст;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. miniogn 44 27.01.25 20:39 Сейчас в теме
(1) Это конечно жестко текстом хранить что бы это ни было. Но так в принципе можно макеты таблицы или макеты тексты использовать.
Но я б не стал (в смысле просто текстом, но если надо) UPD Свойства и значения всё-таки по отдельности сохранял. В табличном документе можно так-то условно дерево набросать.
9. 1234ru 28.01.25 19:18 Сейчас в теме
(2)
можно макеты таблицы или макеты тексты использовать

Насчет макетов текста почитаю, спасибо.

Задумка в том, чтобы иметь шаблон структуры JSON с метками под значения, которые подставлять туда с помощью СтрШаблон().

Таблицу можно было бы рассматривать для двумерных структур. А для разветвленных со вложенными массивами это не годится. Пример из практики - в комментарии рядом.
10. miniogn 44 28.01.25 19:27 Сейчас в теме
(9) По крайней мере, ячейки таблицы можно использовать для хранения одного JSON целиком, если удобно хранить текстом.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:

	пИмяМакета = "Макет2";
	Обработка =  РеквизитФормыВЗначение("Объект");
	Макет = Обработка.ПолучитьМакет(пИмяМакета);
	
	СтрокаJSON = Макет.Области.МояЯчейка.Текст;
19. gybson 29.01.25 14:42 Сейчас в теме
(10) можно создать текстовые макеты и каждому дать нужное имя
5. mkalimulin 1444 28.01.25 11:05 Сейчас в теме
(1)
ст = новый структура;
ст.вставить("а",1);
ст.вставить("б",2);


Это не менее наглядно. И вы все равно к этому потом придете, т.к. вам наверняка потребуется формировать JSON динамически
Трактор; +1 Ответить
6. 1234ru 28.01.25 13:09 Сейчас в теме
(5) "Это не менее наглядно"

Когда схема данных совсем простая, то может быть. Хотя если в ней встречаются массивы, то уже возникают сложности, т.к. массив нельзя создать и тут же сходу заполнить элементами, в отличие от структуры.

Вот пример из жизни, причем не самый сложный.

JSON:

{
  "productType": "PRODUCT",
  "patches": [
    {
      "op": "replace",
      "path": "/attributes/purchasable_offer",
      "value": {
        "currency": "EUR",
        "our_price": [
          [
            {
              "value_with_tax": Цена
            }
          ]
        ]
      }
    }
  ]
}
Показать

Код 1С:

Данные = Новый Структура;

Данные.Вставить("productType", "PRODUCT");                                  
Данные.Вставить("patches", Новый Массив);

vt = Новый Массив;
vt = Новый Структура("value_with_tax", Цена);

schedule = Новый Массив;
schedule.Добавить(VT);  

our_price = Новый Массив;
our_price.Добавить(schedule);

Данные["patches"].Добавить(
	Новый Структура("op, path, value",
		"replace",
		"/attributes/purchasable_offer",
		Новый Структура("currency,our_price",
			"EUR",  
			our_price
		)
	)
);	
Показать

Как по мне, о наглядности здесь говорить не приходится.
11. gybson 28.01.25 21:41 Сейчас в теме
(6) о наглядности для кого? У вас там клининг json в конфигураторе пишет?
14. 1234ru 28.01.25 22:49 Сейчас в теме
(12) Представьте, что вам нужно наладить обмен данными с посторонней информационной системой по API. В документации к системе формат данных, которые нужно посылать, описан в виде JSON.

Как вы будете писать код в таком случае? Пошагово вручную воспроизводить JSON в синтаксисе 1С, как в моем примере выше?
20. gybson 29.01.25 14:47 Сейчас в теме
28. 1234ru 07.02.25 20:32 Сейчас в теме
Есть два варианта алгоритма.

Первый:

Данные_1 = ПостроитьДанныеДляПервогоСлучая(Величина);
Данные_2 = ПостроитьДанныеДляВторогоСлучая(Величина); 
Данные_3 = ПостроитьДанныеДляТретьегоСлучая(Величина); 

Второй:

Данные_1 = ПостроитьДанныеПоШаблону(ИдентификаторШаблона_1, Величина);
Данные_2 = ПостроитьДанныеПоШаблону(ИдентификаторШаблона_2, Величина);
Данные_3 = ПостроитьДанныеПоШаблону(ИдентификаторШаблона_3, Величина);

Какие из принципов, изложенных в приведенной вами статье, нарушает второй вариант и при этом не нарушает первый?
33. пользователь 08.02.25 10:57
Сообщение было скрыто модератором.
...
3. SlavaKron 27.01.25 20:49 Сейчас в теме
Для описания схем можно использовать XDTO-пакеты.
7. 1234ru 28.01.25 19:11 Сейчас в теме
(3) Для этого нужно JSON конвертировать в XML. А хотелось бы просто вставлять JSON в оригинале.
18. SlavaKron 29.01.25 12:21 Сейчас в теме
(7)
Для этого нужно JSON конвертировать в XML
Не нужно, ОбъектXDTO напрямую преобразовывается в json и обратно средствами платформы.
21. 1234ru 02.02.25 20:53 Сейчас в теме
(18) Я имею в виду конвертировать в самом начале при переносе в систему извне.

Вот есть у меня страница документации, на ней написан JSON. Как я его в XDTO превращу? Мне явно нужно его занести в какую-то форму, там нажать какую-то кнопку и получить XML, который потом вставить куда-то в систему. А я хочу сразу JSON в систему.
22. user2107191 02.02.25 21:31 Сейчас в теме
(21)
Вот есть у меня страница документации
Бумажная?
29. 1234ru 07.02.25 20:35 Сейчас в теме
(22)
Бумажная?

Страница сайта, где расположена документация. Электронная, значит. Или веб-страница. Сложно догадаться?
23. SlavaKron 02.02.25 21:51 Сейчас в теме
(21) Какая вам разница JSON или XML - в коде 1С следует работать с объектной моделью.
25. 1234ru 02.02.25 22:23 Сейчас в теме
(23)
Такая, что исходник структуры данных - в JSON. Его можно взять из источника, скопировав как есть с минимальными изменениями, и использовать, переведя в объект 1С средствами платформы.
А не вручную переводить JSON в код построения объекта на 1С.

При этом структура данных представляет собой шаблон с минимальными вкраплениями динамической информации, которую туда нужно привнести от себя, разбирать такую - себе дороже.
4. starik-2005 3163 28.01.25 10:15 Сейчас в теме
// ...
а = Новый Структура(СписокПолейЧерезЗапятую);
а.ПолеЭн = ДанныеПоляЭн;
//  ...
джисон = ПолучитьДжисонДляСтруктуры(а);
ЗапросХТТП.УстановитьТелоИзСтроки(джисон);
ЗапросХТТП.ОтправитьДляОбработки();
8. 1234ru 28.01.25 19:13 Сейчас в теме
(4) Работать через структуру в данном случае неудобно, подробнее описал в соседнем комментарии.
12. gybson 28.01.25 21:44 Сейчас в теме
Грамотно не лезть на такие низкие уровни абстракции, как json, xml, assembler, html и т.п.
Из них вылезли уж сколько лет как и в здравом уме никто обратно не полезет.
user1936660; +1 1 Ответить
13. 1234ru 28.01.25 22:39 Сейчас в теме
(10)
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам

Вот это ключевой момент! Спасибо за наводку, именно так и поступлю.

Хорошо, что можно включить отображение имени ячейки с помощью кнопки "Отображать именованные ячейки" на панели инструментов. А быстро добраться до имени, чтобы отредактировать или скопировать, можно, нажав Ctrl+Shift+N, когда ячейка в фокусе.
Прикрепленные файлы:
15. user1936660 28.01.25 22:50 Сейчас в теме
(13) Ты это сам сопровождать замучаешся. Да и две недели забудешь детали своей Гениальной Задумки.

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

На, держи.
Процедура СоздатьJSON()
	
	ТипПродукта = "PRODUCT";
	Действия = Новый Массив;
	
	Валюта = "EUR";
	ЦенаСНалогами = 123.456;
	НаборЦен = НаборЦенПродукта(ЦенаСНалогами);
	
	ДобавитьДействие(Действия,
		"replace", "/attributes/purchasable_offer", ПараметрыДействия(Валюта, НаборЦен)
	);

	Данные = ДанныеОбновления(ТипПродукта, Действия);

	
	ПараметрыJSON = Новый ПараметрыЗаписиJSON( , Символы.Таб);

	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку(ПараметрыJSON);
	ЗаписатьJSON(Запись, Данные);
	
	Строка = Запись.Закрыть();
	Сообщить(Строка);
	
КонецПроцедуры

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

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

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

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

	НаборЦен = Новый Массив;
	НаборЦен.Добавить(Цена);
	
	Возврат НаборЦен;
	
КонецФункции
Показать
orakool; Sashares; Трактор; +3 Ответить
24. 1234ru 02.02.25 22:12 Сейчас в теме
самодокументирующийся код, следящий за структурой объекта

И как 1С следит за структурой объекта в данном случае? В чем это заключается?

НаборЦен = НаборЦенПродукта(123.456);
НаборЦен.
// Хочу, чтобы после точки выскакивали названия свойств и методов
// Не хочу дописывать "value_with_tax" вручную, а приходится :(

На, держи.

А теперь представь, что методов API есть полсотни, и у каждого таких атрибутов - с десяток. Писать для всего множества НазваниеМетодаAPIНазваниеАтрибута() и иметь эту кучу в коде модуля?
26. user1936660 03.02.25 21:56 Сейчас в теме
(24)
Хочу, чтобы после точки выскакивали названия свойств и методов

Конечно-конечно. Вот при формировании json строкой через макеты оно так и будет.
27. 1234ru 06.02.25 19:46 Сейчас в теме
(26)
А при чем здесь макеты? Как будто если бы не они, то подсказки вдруг появились бы. Насколько я знаю (буду рад ошибиться), в общем случае в 1С такого добиться невозможно. Есть т.н. описание функции, где можно указать тип входных и выходных данных. Но описать не тип, а структуру выходных данных нельзя, и если ты возвращаешь произвольную структуру или соответствие, а не какой-то экземпляр объекта дерева конфигурации (справочник, документ и пр.), то так и так будешь сидеть без подсказок свойств/методов.
16. gybson 28.01.25 23:02 Сейчас в теме
(13) ого как эволюционировали магические строки!!!
17. user1936660 28.01.25 23:05 Сейчас в теме
(16) Ты подожди, сейчас он дойдет до мысли, что значения "DEFAULT", 9 и 2 надо менять на свои.
30. 1234ru 07.02.25 20:42 Сейчас в теме
(17)
Вам бы дойти до мысли, что сначала надо читать, а потом писать.

Я объяснил, как собираюсь действовать, еще до того, как вы свой написали комментарий. Специально для вас дублирую тут, а то вдруг вам искать тяжело:

иметь шаблон структуры JSON с метками под значения, которые подставлять туда с помощью СтрШаблон()
31. user1936660 07.02.25 22:10 Сейчас в теме
(30)
Я объяснил, как собираюсь действовать
Боженьки, ты за эти две недели так и не сделал ничего, всё собираешся что ли?
32. 1234ru 08.02.25 03:18 Сейчас в теме
(31)
А, так это ты? Запутаешься тут с вашими цифровыми никами...

Еще раз тебя спрашиваю. Когда таких функций, как твоя НаборЦенПродукта(), понадобится 50 штук, что будешь делать? Писать рядом НаборТакихТоДанных(), НаборЕщеКакихТоДанных() и так 50 раз? Если не рядом, то где? Расплодишь общих модулей? Или, может, команд или обработок? Давай, расскажи про волшебное средство, которое не даст твоему красивому учебному коду превратиться в говно при масштабировании.
34. user2107184 08.02.25 11:07 Сейчас в теме
(32)
Запутаешься тут с вашими цифровыми никами...
Цифровизация всего - наша цель! Если верить Главному Гражданину Всея Руси.
35. user1936660 08.02.25 11:52 Сейчас в теме
(32)
Еще раз тебя спрашиваю
Интересный формат. Надо попробовать:

Ты уже встречался с неразрывным пробелом? Знаешь про экранирование символов? Понимаешь представление даты с таймзонами? Если не рядом, то как? Давай, покажи свое решение.
36. user1936660 08.02.25 11:56 Сейчас в теме
(32)
Запутаешься тут с вашими цифровыми никами

Готово!
37. пользователь 08.02.25 12:22
Сообщение было скрыто модератором.
...
38. 1234ru 11.02.25 20:40 Сейчас в теме
(36)
Вот, другое дело. Теперь хоть на человека похож стал.
Прикрепленные файлы:
39. 1234ru 14.02.25 02:30 Сейчас в теме
(38)
Но хватило ненадолго.
Прикрепленные файлы:
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот