Как лучше записывать в код многострочный JSON?
Нужно общаться с внешней системой, которая принимает данные в формате JSON. Он же дает наглядное представление о структуре данных. Поэтому хочется писать JSON прямо в коде.
Однако осложняется это необходимостью экранирования двойных кавычек и переводов строки.
Например, для
придется написать что-то типа
А хотелось бы просто брать нужный JSON и вставлять его куда надо без таких вот изменений.
Логично было бы вынести в какое-то служебное хранилище, куда можно положить строку в режиме конфигуратора. Технически для этого подходят константы, но заводить константу на каждый такой случай не хочется.
Как тут грамотно действовать? Поделитесь опытом.
Однако осложняется это необходимостью экранирования двойных кавычек и переводов строки.
Например, для
{
"a": 1,
"b": 2
}придется написать что-то типа
"{
| ""a"": 1,
| ""b"": 2
|}"А хотелось бы просто брать нужный JSON и вставлять его куда надо без таких вот изменений.
Логично было бы вынести в какое-то служебное хранилище, куда можно положить строку в режиме конфигуратора. Технически для этого подходят константы, но заводить константу на каждый такой случай не хочется.
Как тут грамотно действовать? Поделитесь опытом.
Найденные решения
(9) По крайней мере, ячейки таблицы можно использовать для хранения одного JSON целиком, если удобно хранить текстом.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:
пИмяМакета = "Макет2";
Обработка = РеквизитФормыВЗначение("Объект");
Макет = Обработка.ПолучитьМакет(пИмяМакета);
СтрокаJSON = Макет.Области.МояЯчейка.Текст;
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Это конечно жестко текстом хранить что бы это ни было. Но так в принципе можно макеты таблицы или макеты тексты использовать.
Но я б не стал (в смысле просто текстом, но если надо) UPD Свойства и значения всё-таки по отдельности сохранял. В табличном документе можно так-то условно дерево набросать.
Но я б не стал (в смысле просто текстом, но если надо) UPD Свойства и значения всё-таки по отдельности сохранял. В табличном документе можно так-то условно дерево набросать.
(2)
Насчет макетов текста почитаю, спасибо.
Задумка в том, чтобы иметь шаблон структуры JSON с метками под значения, которые подставлять туда с помощью СтрШаблон().
Таблицу можно было бы рассматривать для двумерных структур. А для разветвленных со вложенными массивами это не годится. Пример из практики - в .
можно макеты таблицы или макеты тексты использовать
Насчет макетов текста почитаю, спасибо.
Задумка в том, чтобы иметь шаблон структуры JSON с метками под значения, которые подставлять туда с помощью СтрШаблон().
Таблицу можно было бы рассматривать для двумерных структур. А для разветвленных со вложенными массивами это не годится. Пример из практики - в .
(9) По крайней мере, ячейки таблицы можно использовать для хранения одного JSON целиком, если удобно хранить текстом.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:
пИмяМакета = "Макет2";
Обработка = РеквизитФормыВЗначение("Объект");
Макет = Обработка.ПолучитьМакет(пИмяМакета);
СтрокаJSON = Макет.Области.МояЯчейка.Текст;
(5) "Это не менее наглядно"
Когда схема данных совсем простая, то может быть. Хотя если в ней встречаются массивы, то уже возникают сложности, т.к. массив нельзя создать и тут же сходу заполнить элементами, в отличие от структуры.
Вот пример из жизни, причем не самый сложный.
JSON:
Код 1С:
Как по мне, о наглядности здесь говорить не приходится.
Когда схема данных совсем простая, то может быть. Хотя если в ней встречаются массивы, то уже возникают сложности, т.к. массив нельзя создать и тут же сходу заполнить элементами, в отличие от структуры.
Вот пример из жизни, причем не самый сложный.
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
)
)
);
ПоказатьКак по мне, о наглядности здесь говорить не приходится.
(12) Представьте, что вам нужно наладить обмен данными с посторонней информационной системой по API. В документации к системе формат данных, которые нужно посылать, описан в виде JSON.
Как вы будете писать код в таком случае? Пошагово вручную воспроизводить JSON в синтаксисе 1С, как в моем ?
Как вы будете писать код в таком случае? Пошагово вручную воспроизводить JSON в синтаксисе 1С, как в моем ?
Есть два варианта алгоритма.
Первый:
Второй:
Какие из принципов, изложенных в приведенной вами статье, нарушает второй вариант и при этом не нарушает первый?
Первый:
Данные_1 = ПостроитьДанныеДляПервогоСлучая(Величина);
Данные_2 = ПостроитьДанныеДляВторогоСлучая(Величина);
Данные_3 = ПостроитьДанныеДляТретьегоСлучая(Величина); Второй:
Данные_1 = ПостроитьДанныеПоШаблону(ИдентификаторШаблона_1, Величина);
Данные_2 = ПостроитьДанныеПоШаблону(ИдентификаторШаблона_2, Величина);
Данные_3 = ПостроитьДанныеПоШаблону(ИдентификаторШаблона_3, Величина);Какие из принципов, изложенных в приведенной вами статье, нарушает второй вариант и при этом не нарушает первый?
(18) Я имею в виду конвертировать в самом начале при переносе в систему извне.
Вот есть у меня страница документации, на ней написан JSON. Как я его в XDTO превращу? Мне явно нужно его занести в какую-то форму, там нажать какую-то кнопку и получить XML, который потом вставить куда-то в систему. А я хочу сразу JSON в систему.
Вот есть у меня страница документации, на ней написан JSON. Как я его в XDTO превращу? Мне явно нужно его занести в какую-то форму, там нажать какую-то кнопку и получить XML, который потом вставить куда-то в систему. А я хочу сразу JSON в систему.
(23)
Такая, что исходник структуры данных - в JSON. Его можно взять из источника, скопировав как есть с минимальными изменениями, и использовать, переведя в объект 1С средствами платформы.
А не вручную переводить JSON в код построения объекта на 1С.
При этом структура данных представляет собой шаблон с минимальными вкраплениями динамической информации, которую туда нужно привнести от себя, разбирать такую - себе дороже.
Такая, что исходник структуры данных - в JSON. Его можно взять из источника, скопировав как есть с минимальными изменениями, и использовать, переведя в объект 1С средствами платформы.
А не вручную переводить JSON в код построения объекта на 1С.
При этом структура данных представляет собой шаблон с минимальными вкраплениями динамической информации, которую туда нужно привнести от себя, разбирать такую - себе дороже.
// ...
а = Новый Структура(СписокПолейЧерезЗапятую);
а.ПолеЭн = ДанныеПоляЭн;
// ...
джисон = ПолучитьДжисонДляСтруктуры(а);
ЗапросХТТП.УстановитьТелоИзСтроки(джисон);
ЗапросХТТП.ОтправитьДляОбработки();
Грамотно не лезть на такие низкие уровни абстракции, как json, xml, assembler, html и т.п.
Из них вылезли уж сколько лет как и в здравом уме никто обратно не полезет.
Из них вылезли уж сколько лет как и в здравом уме никто обратно не полезет.
(10)
Вот это ключевой момент! Спасибо за наводку, именно так и поступлю.
Хорошо, что можно включить отображение имени ячейки с помощью кнопки "Отображать именованные ячейки" на панели инструментов. А быстро добраться до имени, чтобы отредактировать или скопировать, можно, нажав Ctrl+Shift+N, когда ячейка в фокусе.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам
Вот это ключевой момент! Спасибо за наводку, именно так и поступлю.
Хорошо, что можно включить отображение имени ячейки с помощью кнопки "Отображать именованные ячейки" на панели инструментов. А быстро добраться до имени, чтобы отредактировать или скопировать, можно, нажав Ctrl+Shift+N, когда ячейка в фокусе.
Прикрепленные файлы:
(13) Ты это сам сопровождать замучаешся. Да и две недели забудешь детали своей Гениальной Задумки.
Весь цивильный мир думает объектами и понимает, что JSON, это тупо строковое представление объекта.
И только избранные 1Ски упорно думают символами в строке. Потому что слишком глупы и ленивы, чтобы писать самодокументирующийся код, следящий за структурой объекта.
На, держи.
Весь цивильный мир думает объектами и понимает, что 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", ЦенаСНалогами);
НаборЦен = Новый Массив;
НаборЦен.Добавить(Цена);
Возврат НаборЦен;
КонецФункции
Показатьсамодокументирующийся код, следящий за структурой объекта
И как 1С следит за структурой объекта в данном случае? В чем это заключается?
НаборЦен = НаборЦенПродукта(123.456);
НаборЦен.
// Хочу, чтобы после точки выскакивали названия свойств и методов
// Не хочу дописывать "value_with_tax" вручную, а приходится :(На, держи.
А теперь представь, что методов API есть полсотни, и у каждого таких атрибутов - с десяток. Писать для всего множества НазваниеМетодаAPIНазваниеАтрибута() и иметь эту кучу в коде модуля?
(26)
А при чем здесь макеты? Как будто если бы не они, то подсказки вдруг появились бы. Насколько я знаю (буду рад ошибиться), в общем случае в 1С такого добиться невозможно. Есть т.н. описание функции, где можно указать тип входных и выходных данных. Но описать не тип, а структуру выходных данных нельзя, и если ты возвращаешь произвольную структуру или соответствие, а не какой-то экземпляр объекта дерева конфигурации (справочник, документ и пр.), то так и так будешь сидеть без подсказок свойств/методов.
А при чем здесь макеты? Как будто если бы не они, то подсказки вдруг появились бы. Насколько я знаю (буду рад ошибиться), в общем случае в 1С такого добиться невозможно. Есть т.н. описание функции, где можно указать тип входных и выходных данных. Но описать не тип, а структуру выходных данных нельзя, и если ты возвращаешь произвольную структуру или соответствие, а не какой-то экземпляр объекта дерева конфигурации (справочник, документ и пр.), то так и так будешь сидеть без подсказок свойств/методов.
(17)
Вам бы дойти до мысли, что сначала надо читать, а потом писать.
Я , как собираюсь действовать, еще до того, как вы свой написали комментарий. Специально для вас дублирую тут, а то вдруг вам искать тяжело:
Вам бы дойти до мысли, что сначала надо читать, а потом писать.
Я , как собираюсь действовать, еще до того, как вы свой написали комментарий. Специально для вас дублирую тут, а то вдруг вам искать тяжело:
иметь шаблон структуры JSON с метками под значения, которые подставлять туда с помощью СтрШаблон()
(31)
А, так это ? Запутаешься тут с вашими цифровыми никами...
Еще раз тебя спрашиваю. Когда таких функций, как твоя НаборЦенПродукта(), понадобится 50 штук, что будешь делать? Писать рядом НаборТакихТоДанных(), НаборЕщеКакихТоДанных() и так 50 раз? Если не рядом, то где? Расплодишь общих модулей? Или, может, команд или обработок? Давай, расскажи про волшебное средство, которое не даст твоему красивому учебному коду превратиться в говно при масштабировании.
А, так это ? Запутаешься тут с вашими цифровыми никами...
Еще раз тебя спрашиваю. Когда таких функций, как твоя НаборЦенПродукта(), понадобится 50 штук, что будешь делать? Писать рядом НаборТакихТоДанных(), НаборЕщеКакихТоДанных() и так 50 раз? Если не рядом, то где? Расплодишь общих модулей? Или, может, команд или обработок? Давай, расскажи про волшебное средство, которое не даст твоему красивому учебному коду превратиться в говно при масштабировании.
(32)
Ты уже встречался с неразрывным пробелом? Знаешь про экранирование символов? Понимаешь представление даты с таймзонами? Если не рядом, то как? Давай, покажи свое решение.
Еще раз тебя спрашиваю
Интересный формат. Надо попробовать:
Ты уже встречался с неразрывным пробелом? Знаешь про экранирование символов? Понимаешь представление даты с таймзонами? Если не рядом, то как? Давай, покажи свое решение.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
