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