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

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

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

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

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

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

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

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

Как тут грамотно действовать? Поделитесь опытом.
---
По крайней мере, ячейки таблицы можно использовать для хранения одного JSON целиком, если удобно хранить текстом.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:

```1c
    пИмяМакета = "Макет2";
    Обработка = РеквизитФормыВЗначение("Объект");
    Макет = Обработка.ПолучитьМакет(пИмяМакета);

    СтрокаJSON = Макет.Области.МояЯчейка.Текст;
```
---
Это конечно жестко текстом хранить что бы это ни было. Но так в принципе можно макеты таблицы или макеты тексты использовать.
Но я б не стал (в смысле просто текстом, но если надо) UPD Свойства и значения всё-таки по отдельности сохранял. В табличном документе можно так-то условно дерево набросать.
---
можно макеты таблицы или макеты тексты использовать
Насчет макетов текста почитаю, спасибо.

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

Таблицу можно было бы рассматривать для двумерных структур. А для разветвленных со вложенными массивами это не годится. Пример из практики - в комментарии рядом.
---
По крайней мере, ячейки таблицы можно использовать для хранения одного JSON целиком, если удобно хранить текстом.
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам:

```1c
    пИмяМакета = "Макет2";
    Обработка = РеквизитФормыВЗначение("Объект");
    Макет = Обработка.ПолучитьМакет(пИмяМакета);

    СтрокаJSON = Макет.Области.МояЯчейка.Текст;
```
---
можно создать текстовые макеты и каждому дать нужное имя
---
```1c
    ст = новый структура;
    ст.вставить("а",1);
    ст.вставить("б",2);
```

Это не менее наглядно. И вы все равно к этому потом придете, т.к. вам наверняка потребуется формировать JSON динамически
---
"Это не менее наглядно"

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

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

JSON:

```1c
    {
    "productType": "PRODUCT",
    "patches": [
    {
    "op": "replace",
    "path": "/attributes/purchasable_offer",
    "value": {
    "currency": "EUR",
    "our_price": [
    [
    {
    "value_with_tax": Цена
    }
    ]
    ]
    }
    }
    ]
    }
```

Код 1С:

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

    Данные.Вставить("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
    )
    )
    );
```

Как по мне, о наглядности здесь говорить не приходится.
---
о наглядности для кого? У вас там клининг json в конфигураторе пишет?
---
Представьте, что вам нужно наладить обмен данными с посторонней информационной системой по API. В документации к системе формат данных, которые нужно посылать, описан в виде JSON.

Как вы будете писать код в таком случае? Пошагово вручную воспроизводить JSON в синтаксисе 1С, как в моем примере выше?
---
вам надо больше времени уделить теории. https://infostart.ru/1c/articles/1191718/?ysclid=m6hudgbnq931850906
---
Есть два варианта алгоритма.

Первый:

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

Второй:

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

Какие из принципов, изложенных в приведенной вами статье, нарушает второй вариант и при этом не нарушает первый?
---
Сообщение было скрыто модератором.
---
Для описания схем можно использовать XDTO-пакеты.
---
Для этого нужно JSON конвертировать в XML. А хотелось бы просто вставлять JSON в оригинале.
---
Для этого нужно JSON конвертировать в XML Не нужно, ОбъектXDTO напрямую преобразовывается в json и обратно средствами платформы.
---
Я имею в виду конвертировать в самом начале при переносе в систему извне.

Вот есть у меня страница документации, на ней написан JSON. Как я его в XDTO превращу? Мне явно нужно его занести в какую-то форму, там нажать какую-то кнопку и получить XML, который потом вставить куда-то в систему. А я хочу сразу JSON в систему.
---
Вот есть у меня страница документации Бумажная?
---
Бумажная?
Страница сайта, где расположена документация. Электронная, значит. Или веб-страница. Сложно догадаться?
---
Какая вам разница JSON или XML - в коде 1С следует работать с объектной моделью.
---
Такая, что исходник структуры данных - в JSON. Его можно взять из источника, скопировав как есть с минимальными изменениями, и использовать, переведя в объект 1С средствами платформы.
А не вручную переводить JSON в код построения объекта на 1С.

При этом структура данных представляет собой шаблон с минимальными вкраплениями динамической информации, которую туда нужно привнести от себя, разбирать такую - себе дороже.
---
```1c
    // ...
    а = Новый Структура(СписокПолейЧерезЗапятую);
    а.ПолеЭн = ДанныеПоляЭн;
    // ...
    джисон = ПолучитьДжисонДляСтруктуры(а);
    ЗапросХТТП.УстановитьТелоИзСтроки(джисон);
    ЗапросХТТП.ОтправитьДляОбработки();
```
---
Работать через структуру в данном случае неудобно, подробнее описал в соседнем комментарии.
---
Грамотно не лезть на такие низкие уровни абстракции, как json, xml, assembler, html и т.п.
Из них вылезли уж сколько лет как и в здравом уме никто обратно не полезет.
---
Ячейкам можно присваивать имена, таким образом можно из макета дергать текст просто по именам
Вот это ключевой момент! Спасибо за наводку, именно так и поступлю.

Хорошо, что можно включить отображение имени ячейки с помощью кнопки "Отображать именованные ячейки" на панели инструментов. А быстро добраться до имени, чтобы отредактировать или скопировать, можно, нажав Ctrl+Shift+N, когда ячейка в фокусе.
---
Ты это сам сопровождать замучаешся. Да и две недели забудешь детали своей Гениальной Задумки.

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

На, держи.

```1c
    Процедура Создать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С следит за структурой объекта в данном случае? В чем это заключается?

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

На, держи.
А теперь представь, что методов API есть полсотни, и у каждого таких атрибутов - с десяток. Писать для всего множества НазваниеМетодаAPIНазваниеАтрибута() и иметь эту кучу в коде модуля?
---
Хочу, чтобы после точки выскакивали названия свойств и методов
Конечно-конечно. Вот при формировании json строкой через макеты оно так и будет.
---
А при чем здесь макеты? Как будто если бы не они, то подсказки вдруг появились бы. Насколько я знаю (буду рад ошибиться), в общем случае в 1С такого добиться невозможно. Есть т.н. описание функции, где можно указать тип входных и выходных данных. Но описать не тип, а структуру выходных данных нельзя, и если ты возвращаешь произвольную структуру или соответствие, а не какой-то экземпляр объекта дерева конфигурации (справочник, документ и пр.), то так и так будешь сидеть без подсказок свойств/методов.
---
ого как эволюционировали магические строки!!!
---
Ты подожди, сейчас он дойдет до мысли, что значения "DEFAULT", 9 и 2 надо менять на свои.
---
Вам бы дойти до мысли, что сначала надо читать, а потом писать.

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

иметь шаблон структуры JSON с метками под значения, которые подставлять туда с помощью СтрШаблон()
---
Я объяснил, как собираюсь действоватьБоженьки, ты за эти две недели так и не сделал ничего, всё собираешся что ли?
---
А, так это ты? Запутаешься тут с вашими цифровыми никами...

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

Ты уже встречался с неразрывным пробелом? Знаешь про экранирование символов? Понимаешь представление даты с таймзонами? Если не рядом, то как? Давай, покажи свое решение.
---
Запутаешься тут с вашими цифровыми никами
Готово!
---
Сообщение было скрыто модератором.
---
Вот, другое дело. Теперь хоть на человека похож стал.
---
Но хватило ненадолго.