Имя: Пароль:
1C
 
Как ПрочитатьJSON если порядок измерений, реквизитов отличается ?
,
0 ИС-2
 
naïve
05.09.22
08:26
Есть 2 базы, в которых регистры совпадали 1 в 1. Был реализован обмен через JSON.

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

В один момент порядок измерений изменился и загрузка перестала работать с ошибкой: Ошибка преобразования данных XDTO:

Попытка поправить через функцию восстановления - не помогла. В нее даже не заходит. Сразу уходит в ошибку

Переделывать на ТЗ обмен - долго. Обрабатывать текст JSON для синхронизации порядка - будет тормозить.

Есть ли возможность сделать так, чтобы при загрузке шло простое сопоставление по свойствам ?
1 alarm2020
 
05.09.22
08:49
(0) Переделывать обмен может в результате оказаться самым быстрым способом
2 mikecool
 
05.09.22
08:55
(0) запрос и выборка в нужном порядке
3 ptiz
 
05.09.22
12:57
(0) В одной из баз всё-таки сдвинуть измерения в нужном порядке.
4 Kassern
 
05.09.22
13:03
(0) все же посмотрите в сторону ПрочитатьJSON()
5 Kassern
 
05.09.22
13:08
(4) я имею в виду про глобальный метод
6 СеменовСемен
 
05.09.22
13:37
но зачем 1с требует порядка реквизитов? Зачем тогда имена выгружает?
Архитектора данной фичи - на кол
7 Hmster
 
05.09.22
14:57
(5) так у него в JSON явно тип указан, и при чтении пытается объект создать, а он другой
8 Kassern
 
05.09.22
15:00
(7) ручками сам создаст, если нет возможности структуру идентичной сделать
9 Fragster
 
гуру
05.09.22
15:19
(6) наследие пакетов xdto.

В случае с xml пропускал через xslt, добавляя, переставляя и удаляя реквизиты и атрибуты (например добавляя тип, если вдруг стал составной). в случае с json, наверное, быстрее пропустить через regexp, убирающий тип, чтобы получить структуру или объект XDTO вместо объекта базы, и потом заполнитьЗначениеСвойств. Только надо с ТЧ что-то решить. Ну или так же регэкспом переставить реквизиты.
10 Hmster
 
05.09.22
16:42
Или можно попробовать изменить чтение на последовательное: ЧтениеJSON.Прочитать()
Но для меня это сомнительное удовольствие.
Если есть возможность при записи файла записывать в структуру с массивом - то быстрее будет так.
11 СеменовСемен
 
05.09.22
17:04
(9) как будто в хдто не было имен реквизитов. какой то студент делай, а второй студент пропустил эту поделку на продакшн
12 Chai Nic
 
05.09.22
17:28
Надо было не выеживаться и сериализовать через ЗначениеВСтрокуВнутр()
13 СеменовСемен
 
05.09.22
17:44
(12) а что оно умеет читать, если реквизиты поменялись?
14 Fragster
 
гуру
05.09.22
17:59
(11) поделка это то, что ты делаешь
15 kittystark
 
05.09.22
17:59
(0) я сам недавно в такой ситуации выкрутился через регулярные выражения, примерно так:
- смотришь на структуру JSON старую
- смотришь на структур JSON новую
- глазками находишь 20 различий
- программно через regExp.Replace() ОДНОЙ СТРОЧКОЙ на лету меняешь старую под новую
(типа как СтрЗаменить, но только с более крутыми шаблонами поиска и замены)
16 Chai Nic
 
05.09.22
21:18
(13) Выгружаешь набор записей в ТЗ, её сериализуешь в строку или в файл "Внутр", передаешь в другую базу, десериализуешь, загружаешь ТЗ в НЗ регистра.
Основная теорема систематики: Новые системы плодят новые проблемы.