JSON и соответствия

1. ybatiaev 58 09.11.22 12:32 Сейчас в теме
Добрый день! Есть вопрос, если сможете помочь советом, буду очень признателен.
У меня есть некая переменная как соответствия
ПараметрыНастроек = новый соответствие;

где каждому контрагенту соответствует массив чисел или строк.
Его записать в JSON прекрасно получилось (файл прикреплён)
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ПараметрыНастроек, НазначениеТипаXML.Явное);

а вот корректно считать с JSON-файла уже не получается.
ПараметрыНастроек = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);

Ткните меня в ссылку плиз, пока не могу найти решения, кроме как построчного разбора (((((((
Прикрепленные файлы:
Настройки.json
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. spacecraft 09.11.22 12:50 Сейчас в теме
(1)
а вот корректно считать с JSON-файла уже не получается.
ПараметрыНастроек = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);

Не получится, так как читаете в структуру. А там такие имена ключей... которые не поддерживаются в структуре.
Или меняйте имена ключей или читайте в соответствие.
ПрочитатьJSON(ЧтениеJSON, Истина)
Raf_f; coollerinc; +2 Ответить
2. user1203706 13 09.11.22 12:50 Сейчас в теме
(1) а просто вася = ПрочитатьJSON(ЧтениеJSON); чего возвращает (без СериализаторXDTO) ?
5. ybatiaev 58 09.11.22 13:01 Сейчас в теме
(4)
(2)
СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);

ошибку возвращает
Недопустимое значение аргумента функции
[xdto - D:\Jenkins\ci_builder\WindowsBuild2_XQV1CCIIPB0O\Platform\src\xdto\src\XDTOFactoryImpl.cpp
С вываливанием из 1С.Предприятие

если
ЧтениеJSON = новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПолноеИмяФайлаНастроек);  
Нов = ПрочитатьJSON(ЧтениеJSON);

То
Ошибка при вызове метода контекста (ПрочитатьJSON)
{ВнешняяОбработка.ЗаполнениеТабличнойЧастиРеализации.Форма.Форма.Форма(384)}:Нов = ПрочитатьJSON(ЧтениеJSON);

по причине:
Недопустимое имя свойства: '#type' для чтения JSON в объект Структура

если
Нов = ПрочитатьJSON(ЧтениеJSON,Истина);

что более правильное, то структура странная в прикреплённом файле
Прикрепленные файлы:
10. spacecraft 09.11.22 13:27 Сейчас в теме
(5) зачем используете СериализаторXDTO? Используйте только примитивные типы для сохранения.
Просто:
ЗаписатьJSON(...)

Нов = ПрочитатьJSON(ЧтениеJSON,Истина);
4. user1203706 13 09.11.22 12:50 Сейчас в теме
ну и там можно еще параметрами поиграться
8. ybatiaev 58 09.11.22 13:09 Сейчас в теме
(4) тут по-ходу надо функцию разбора файла писать. У меня изначально СООТВЕТСТВИЯ. А уже в них массивы. А в итоге получаю соответствия соответствий, где ключи хотя вполне понятные, но нужен их разбор и собирание по результатам нужного мне соответствия с массивами
6. user1203706 13 09.11.22 13:03 Сейчас в теме
(5)
Нов = ПрочитатьJSON(ЧтениеJSON,Истина);
7. ybatiaev 58 09.11.22 13:05 Сейчас в теме
(6) это я и описал выше. Тоже сразу и сделал (описано выше, изменил текстовку). Там структура не читабельная, только разбор построчный уже (
9. user1203706 13 09.11.22 13:10 Сейчас в теме
(7) ну, для обычного json, что в файле, то и на выходе:


"#type": "jv8:Map",
"#value": [
{
"Key": {
"#type": "jxs:string",
"#value": "БП-002049"
},


Це ж не сериализатор, который конвертит во внутренний формат нечто.
11. ybatiaev 58 09.11.22 13:36 Сейчас в теме
(10)
(9) он конвертит не в ту структуру, которую я ему скрармливал при записи
массив = новый массив;
Массив1.Добавить(1);
Массив1.Добавить(2);
ПараметрыНастроек = новый соответствие;
ПараметрыНастроек.Добавить(Контрагент1, Массив1);
ПараметрыНастроек.Добавить(Контрагент2, Массив2);

и т.д.

а получаю при считывании как в файле, там ключ и массивы. В массивах - соответствия
Прикрепленные файлы:
13. VictorRGB2 14 09.11.22 13:44 Сейчас в теме
(11) делайте через обычный ЗаписатьJSON\ПрочитатьJSON
тогда получите, что положили, то и прочитали
и да, разбирать после чтения надо будет отдельно в любом случае и стерилизатор вам тут не поможет, а только усложнит задачу
14. ybatiaev 58 09.11.22 13:45 Сейчас в теме
(13) соответствия просто ЗаписьJSON не пишет. В этом то и проблема

Ошибка при вызове метода контекста (ЗаписатьJSON)
{ВнешняяОбработка.ЗаполнениеТабличнойЧастиРеализации.Форма.Форма.Форма(360)}:ЗаписатьJSON(ЗаписьJSON, ПараметрыНастроек, НазначениеТипаXML.Явное);

по причине:
Недопустимый тип значения ключа элемента соответствия
15. VictorRGB2 14 09.11.22 13:50 Сейчас в теме
(12) (14) вот тут согласен
было дело, тоже с такой фигней мучался
правда там не я сам писал json, а получал его из сервиса, но разбирать надо было и там да, куча соответствий, которые надо было правильно интерпретировать и разложить

могу в личку отправить обработки на посмотреть
17. ybatiaev 58 09.11.22 14:16 Сейчас в теме
(15)да, если можно. Спасибо!
16. spacecraft 09.11.22 14:15 Сейчас в теме
(11)
Вот вполне рабочий код:
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Данные = Новый Соответствие;
Данные.Вставить(Контр1,Массив);
Данные.Вставить(Контр2,Массив);
СериализаторXDTO.ЗаписатьJSON(Запись,Данные, НазначениеТипаXML.Явное);
Стр = Запись.Закрыть();

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Стр);
Нов = СериализаторXDTO.ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Показать


Контрагент1 и Контрагент2 это что и какого типа?
Похоже с ними проблема.
18. ybatiaev 58 09.11.22 14:22 Сейчас в теме
(16)
(16) это чистая ссылка на контрагент. В файле это UUID. Как раз с ними проблем нет. Проблема в том, что соответствие Контрагент-массив, а как прочитается, то в соответствии СООТВЕТСТВИЕ-СООТВЕТСТВИЕ... т.е. массив уходит в соответствие ...
19. spacecraft 09.11.22 14:23 Сейчас в теме
(18) вот с ссылкой код работает нормально. Но судя по скринам, там не ссылки, а структура.
25. spacecraft 09.11.22 14:36 Сейчас в теме
(18) вот пример сохранения с приведенным кодом:
{
"#type": "jv8:Map",
"#value": [
{
"Key": {
"#type": "jcfg:CatalogRef.Контрагенты",
"#value": "0e617604-55bd-11d9-848a-00112f43529a"
},
"Value": {
"#type": "jv8:Array",
"#value": [
{
"#type": "jxs:decimal",
"#value": 1
},
{
"#type": "jxs:decimal",
"#value": 2
}
]
}
},
{
"Key": {
"#type": "jcfg:CatalogRef.Контрагенты",
"#value": "3931f6d0-785b-11df-b33a-0011955cba6b"
},
"Value": {
"#type": "jv8:Array",
"#value": [
{
"#type": "jxs:decimal",
"#value": 1
},
{
"#type": "jxs:decimal",
"#value": 2
}
]
}
}
]
}
Показать

Сравните со своим.
27. ybatiaev 58 09.11.22 14:40 Сейчас в теме
(25)
(25) так и есть! Сохраняет всё так. Но мне надо теперь прочитать и сохранить в то, что было, т.е. в соответствия, где в каждом соответствии массив. Сейчас он этот массив суёт в соответствия тоже с огромным количеством вложений. Картинку прикреплял
28. spacecraft 09.11.22 14:44 Сейчас в теме
(27) ну, тогда держите скрин
Прикрепленные файлы:
29. ybatiaev 58 09.11.22 16:09 Сейчас в теме
(26)
(26) так вот и не нашёл решения.
(28) спасибо... сейчас буду разбираться
40. spacecraft 09.11.22 17:14 Сейчас в теме
(29) проблема скорее всего в сохраняемых данных. Сериализоваться будут только данные, которые поддерживают сериализацию.
20. ybatiaev 58 09.11.22 14:27 Сейчас в теме
(19)
(16)
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Стр);
Нов = СериализаторXDTO.ПрочитатьJSON(Чтение);
Чтение.Закрыть();


у меня чтение это другая процедура. Откуда мне взять переменную "Стр" в Чтение.УстановитьСтроку(Стр);? У меня
ЗаписьJSON.ОткрытьФайл(ПолноеИмяФайлаНастроек);
21. spacecraft 09.11.22 14:28 Сейчас в теме
(20) я же полный текст кода привел.
Стр = Запись.Закрыть();

Для тестирования не обязательно в файл записывать.
22. ybatiaev 58 09.11.22 14:30 Сейчас в теме
(19)
(21)
Стр = Запись.Закрыть(); - это у меня в другой процедуре. Я сохраняю раз в неделю в файл. Стр не запомнится никаким образом при следующем открытии, а если сбойнёт, то мне надо не "стр", а прочитать настройки с файла уже

Есть сохранение настроек, а есть чтение настроек - это совсем другая процедура и я её буду пользоваться при сбоях

Так-то я храню все настройки в хранилищеЗначений, но в файл надо на всякий случай
23. spacecraft 09.11.22 14:33 Сейчас в теме
(22) Вам шашечки или ехать?
Для тестирования не важно что там и как. В момент записи используете приведенный код и сразу смотрите результат. Это не продакшен решение.
24. ybatiaev 58 09.11.22 14:35 Сейчас в теме
(23) ладно. Я сохранил вчера.
Сегодня открыл обработку и читаю с файла. И это потому, что пользователь сам сбил настройки и мен надо вернуть. Откуда мне взять "стр"? с настроек мне нельзя, потому что они испорчены... только с файла
26. spacecraft 09.11.22 14:39 Сейчас в теме
(24) Вы понимаете разницу в тестировании и код в продакшене?
У Вас проблема формата сохранения. Делаете тестирование, что и как сохраняется и сразу пробуете это загрузить.
Вот, когда это отладите, тогда и прописываете с сохранением в файл и т.д. как надо.
12. ybatiaev 58 09.11.22 13:43 Сейчас в теме
Наверно проще не массив а строку сделать, а потом разобрать в массив, так что ли ((((
Т.е. соответствия Контрагент - строка. Хотя разбор строк та ещё проблема, понапишут всякие символы, потом разбор порушится (
А так вот только часть просмотра того, что дает простое чтение JSON именно соответствий
Прикрепленные файлы:
30. user1831019 09.11.22 16:15 Сейчас в теме
Только парсинг.
Или не надо лохматить бабушку.
Все равно ссылочные значения не передаются.
Или передаются в виде отдельной структуры с описанием метаданных.
Которые потом все равно надо дополнительно читать из базы.

Или не использовать джинсу.
31. ybatiaev 58 09.11.22 16:18 Сейчас в теме
(30)
(30) ну, изначально я и хотел использовать давно проверенный JSON и структуру. Но как фиксировать какой контрагент в структуре?
Не нашёл простого решения. Код не прокатывает из-за символов. Вводить доп реквизит -"не фонтан"... надо ещё покумекать (
32. user1831019 09.11.22 16:20 Сейчас в теме
(31)
Но как фиксировать какой контрагент в структуре?
Каким-то идентификатором этого контрагента.
Может ИНН.
Может ИНН/КПП.
Может GUID (если есть синхронизация ИБ по ссылкам)

В любом случае - тебе придется организовывать поиск по этому идентификатору. Ни с того ни с сего ты не получишь ссылку, даже когда разгребешь джинсу.
48. ybatiaev 58 09.11.22 17:28 Сейчас в теме
(39)
(32)тогда структура будет выглядеть так -
"Контраент1" а в нем своя структура,
"Контраент2" а в нем своя структура
Ключ будет только таким, каким его поддерживает структура, к примеру он не может быть "00-00021" и не "К00-00021" или пр.
В соответствии это UUID контаргента - массив

Сейчас проверяю ещё. Играюсь параметрами ЧтениеJSON
49. spacecraft 09.11.22 17:30 Сейчас в теме
(48)
Сейчас проверяю ещё. Играюсь параметрами ЧтениеJSON

Тут надо играться с самими данными. Приводите сами данные до записи.
33. user1203706 13 09.11.22 16:22 Сейчас в теме
(31) просто XMLСтрока(Клиентос) хотя это и не обязательно, он и так в json будет в виде уида, если не сериализатором городить json
34. user1831019 09.11.22 16:23 Сейчас в теме
(33) Ну получишь ты строковый GUID (например). И что ты с ним будешь делать дальше?
36. ybatiaev 58 09.11.22 16:25 Сейчас в теме
(34)
(34) вот в структуре ничего, а в соответствии он есть контрагент. Ссылка четко формируется. Я же так работаю и это соответствие у меня сохраняется в Хранилище Значений. А вот на всякий случай попросили сохранить в файл
35. user1203706 13 09.11.22 16:24 Сейчас в теме
(34) обратно получишь ссылку на него из строки
37. user1831019 09.11.22 16:26 Сейчас в теме
(35) Ну да.
1. Если он в этой базе существует под этим же GUID.
2. Это все равно постобработка структуры/соответствия. Сама платформа за вас ничего получать не собирается.
39. spacecraft 09.11.22 17:10 Сейчас в теме
(37)
Это все равно постобработка структуры/соответствия. Сама платформа за вас ничего получать не собирается.

Почему же? Как раз в платформу добавили такую возможность через СериализаторXDTO.

https://wonderland.v8.1c.ru/blog/serializatsiya-prikladnykh-tipov-1s-predpriyatiya-v-json/
42. user1831019 09.11.22 17:17 Сейчас в теме
(39) Прекрасно. И в каких типовых конфигурациях это работает? (Намекаю на поддержку совместимости)
// на вондерленде nginx упал. Лучшая IT-компания России.
// Поднялся.

Ага, прочитал. Главное - в картинке:
Прикрепленные файлы:
44. spacecraft 09.11.22 17:22 Сейчас в теме
(42) это добавили еще в 8.3.7. Так что в любых современных типовых на УФ.
45. user1831019 09.11.22 17:23 Сейчас в теме
(44) Я там картинку добавил. Не все так радужно, как кажется.
46. spacecraft 09.11.22 17:26 Сейчас в теме
(45 мы же про Ссылки говорили. Они без вопросов. Вот если будет Объект, то могут быть варианты.
50. user1831019 09.11.22 17:31 Сейчас в теме
(46) Я все понимаю. Но я формат JSON воспринимаю как формат для обмена между различными системами.
А пытаться обмениваться джейсоном между одинаковыми системами 1С - глупость. Тут проще нормальный XML.
38. coollerinc 190 09.11.22 16:32 Сейчас в теме
Вы бы прислали нужный формат, текста JSON и тогда бы проще было. А сейчас вообще не понятно что вам надо и в чем сложности.
Просто структура в JSON хорошо ложится без всяких костылей.
41. ybatiaev 58 09.11.22 17:15 Сейчас в теме
(39)
(38) а я приложил файл с JSON. Но хорошо, скину ещё раз
Прикрепленные файлы:
Настройки.json
43. spacecraft 09.11.22 17:21 Сейчас в теме
(41) и теперь сравните:
Ваши данные:

{
"#type": "jv8:Map",
"#value": [
{
"Key": {
"#type": "jxs:string",
"#value": "БП-002049"
},
"Value": {
"#type": "jv8:Structure",
"#value": [
{
"name": {
"#type": "jxs:string",
"#value": "Организация"
},
"Value": "8883d85e-8d09-11e5-bebf-08606e69573f"
},
{
"name": {
"#type": "jxs:string",
"#value": "НаименованиеТовара"
},
"Value": {
"#type": "jxs:decimal",
"#value": 5
}
},
Показать

и из (25) :

{
"#type": "jv8:Map",
"#value": [
{
"Key": {
"#type": "jcfg:CatalogRef.Контрагенты",
"#value": "0e617604-55bd-11d9-848a-00112f43529a"
},
"Value": {
"#type": "jv8:Array",
"#value": [
{
"#type": "jxs:decimal",
"#value": 1
},
{
"#type": "jxs:decimal",
"#value": 2
}
]
Показать

Сохраняемые данные не соответствуют заявленным. Т.е. сохраняете не соответствие с ключами Ссылка справочника и значением Массив, а совсем что-то другое.
55. ybatiaev 58 09.11.22 18:55 Сейчас в теме
Решил проблему. Описываю решение.
1. Хотя у меня в ХранилищеЗначения было соответствие и то, что было и всё это работало, мешало мне сохранить и восстановить. Делал через
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ОткрытьФайл(ПолноеИмяФайлаНастроек);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ПараметрыНастроек, НазначениеТипаXML.Явное);
СериализованнаяСтрока = ЗаписьJSON.Закрыть();

И это сохраняло во вполне нормальную читабельную структуру, но десериализовать это не получилось. Скорее у меня нет опыта, а нужно было написать функцию разбора (указание на неё есть в описании, примера нет),
Вычитал также, что лучше в соответствие сохранять не ссылку на контрагента, хотя это не мешало раньше работать, а строку УИД.
2. Сохранил
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ОткрытьФайл(ПолноеИмяФайлаНастроек);
ЗаписатьJSON(ЗаписьJSON, ПараметрыНастроек);
СериализованнаяСтрока = ЗаписьJSON.Закрыть(); 

и прочитал
ЧтениеJSON = новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПолноеИмяФайлаНастроек);  
ПараметрыНастроек = ПрочитатьJSON(ЧтениеJSON,Истина); // истина потому, что есть соответствие
ЧтениеJSON.Закрыть(); 

- увидел, что массив остался, а вот структуру с числами ЧтениеJSON преобразовало в соответствие(наверно потому, что задана ИСТИНА)
Поэтому сделал проще. Сразу задал параметры как соответствия. Они и пишутся как соответствия теперь и читаются.

P.S. Забыл дописать - ЛЮБЛЮ 1С за хорошее описание и незабываемый "сек*с" с ним. Ну... опыт есть опыт
47. user1203706 13 09.11.22 17:26 Сейчас в теме
Вот если бы автор указал, зачем это всё, а так, обсуждение сферического коня в вакууме.

Может там, значениевФайл/ИзФайла и не париться с json-ом
51. ybatiaev 58 09.11.22 17:32 Сейчас в теме
(39)
(47) мне надо сохранить некую структуру, в которой каждому контрагенту соответствует массив чисел. Также я сохраняю в эту структуру массив строк, но он принадлежит другому объекту - ТЗ.
Это у меня рабоатет, т.к. сохраняется в ХранилищеЗначений (см. прикрепление). Но меня попросили сохранить в файл на всякий случай эти настройки
Прикрепленные файлы:
52. user1831019 09.11.22 17:34 Сейчас в теме
(51) Задача меняется "на лету".
Зачем тут JSON? Тебя же попросили сохранить настройки В ФАЙЛ, а не в JSON? Правда?
53. spacecraft 09.11.22 18:09 Сейчас в теме
(52) "Битва экстрасенсов" отдыхает.
54. user1831019 09.11.22 18:10 Сейчас в теме
56. ybatiaev 58 09.11.22 20:12 Сейчас в теме
Решил проблему. Описание выше
Оставьте свое сообщение

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