|
Иерархия в json | ☑ | ||
---|---|---|---|---|
0
olegon7
20.09.16
✎
16:37
|
Здравствуйте, подскажите как реализовать иерархию в json.
от сервиса буду получать ответ в формате json. данные в нем связаны иерархически. Данные записаны в json массивом. На основе этих данных буду строить отчет с группировкой. |
|||
1
Asmody
20.09.16
✎
16:40
|
И как вы массивом передаете иерархические данные? *мне чисто для образования
|
|||
2
olegon7
20.09.16
✎
16:43
|
(1) вот надо придумать
например через айди родителя |
|||
3
Asmody
20.09.16
✎
16:48
|
(2) Передавай массив пар.
|
|||
4
DrShad
20.09.16
✎
16:53
|
поставим закладочку
тоже сейчас вштырили всякие json? php и иже с ними для создания json данных пользую обработку 1С:JSON. JavaScript Object Notation парсер и сериализатор. Александра Переверзева |
|||
5
olegon7
20.09.16
✎
16:53
|
(3) не понял, можно поподробнее
|
|||
6
DrShad
20.09.16
✎
16:54
|
тут все зависит от того как ты потом отражать будешь иерархию
|
|||
7
olegon7
20.09.16
✎
17:03
|
(6) принимаю json преобразовываю в тз ,
тз использую как внешний источник для построения отчета в скд |
|||
8
olegon7
20.09.16
✎
17:04
|
в отчете обычная группировка.
т.е. Подстанция __________Фидер _______________ТП т.е . элемент коллекции может быть одним из этих значений |
|||
9
DrShad
20.09.16
✎
17:05
|
так тут не 1С-ский сервис, а внешний
и как на внешнем ресурсе отражена иерархия? да и зачем в СКД пихать иерархию если ее можно в самой СКД построить как угодно |
|||
10
DrShad
20.09.16
✎
17:05
|
ну так выгружай кроме самого элемента его родительский вот и заготовка для иерархии
|
|||
11
Ластик
20.09.16
✎
17:08
|
(0) Массив в массиве приходит, если я правильно понял вопрос, таким образом в json иерархия и строится как я понял. Сам не писал приходилось обмен допиливать где именно так дело было, приходил файл с вложенными массивами.
|
|||
12
DrShad
20.09.16
✎
17:09
|
у тебя же есть ChildNode и ParentNode
в СКД создаешь набор данных и соединяешь его сам с собой по ChildNode = ParentNode иерархия готова |
|||
13
DrShad
20.09.16
✎
17:11
|
кстати обработка из (4) умеет также читать json
|
|||
14
olegon7
20.09.16
✎
17:11
|
(13) попробую
|
|||
15
olegon7
20.09.16
✎
17:12
|
(12) Массив в массиве ? В какой объект 1с его можно преобразовать?
|
|||
16
olegon7
20.09.16
✎
17:13
|
(11) Массив в массиве ? В какой объект 1с его можно преобразовать?
|
|||
17
DrShad
20.09.16
✎
17:19
|
да хоть в ТЗ, вот только ее нельзя будет в СКД запихнуть
|
|||
18
AceVi
20.09.16
✎
17:58
|
(0) Че вы огород городите.
Все уже давно придумано за вас - реквизит Родитель в нем указываешь УИД или Код что там у тебя есть и все. (7) Вот вообще не понятно как у тебя из ТЗ иерархия получается. Что то ты недоговариваешь. |
|||
19
Torquader
20.09.16
✎
18:47
|
Нет, а в чём проблема передачи иерархии ?
У каждого элемента есть массив дочерних - назовём его Children и всё. Вот когда нужно будет передать граф или группу, тогда придётся уже искать идентификаторы и чесать репу. Аналогом иерархии можно рассматривать объект ДеревоЗначений из 1С - оно должно успешно сериализоваться в JsOn. |
|||
20
olegon7
21.09.16
✎
08:54
|
(12) т.е . 2 создать набора данных (тз) , запихнуть его
в скд. И соединить эти 2 набора по связи ChildNode = ParentNode левым соединением? я правильно понял? |
|||
21
olegon7
21.09.16
✎
09:00
|
структура json
{"Items":[{"ObjectType":"Фидер","ObjectCode":"1253-ав-2332","ObjectName":"10 кВ Ф-662","TimeStamp":"01.06.2015","PreviousValue":423423,"NextValue":254235,"Difference":null,"ParentCode":4376-ап-232}, ... вот этот json преобразуется в массив. массив в скд не передашь. как поменять структуру json что бы получилась тз? если элемент верхнего уровня ParentCode какое должен иметь значение "" или null? |
|||
22
DrShad
21.09.16
✎
09:23
|
(20) 1 набор данных и соединить его сам с собой
|
|||
23
DrShad
21.09.16
✎
09:25
|
(21) ну во-первых это не массив, а структура
|
|||
24
olegon7
21.09.16
✎
09:31
|
(22) в скд можно соединять наборы только левы соединением насколько я помню....
почему не массив.... Вот так я получаю ответ от сервиса Строка=Ответ.ПолучитьТелоКакСтроку("UTF-8"); ЧтениеJSON= новый ЧтениеJSON(); ЧтениеJSON.УстановитьСтроку(Строка); f=ПрочитатьJSON(ЧтениеJSON); мас=f.Items; Items это массив как раз таки |
|||
25
AceVi
21.09.16
✎
09:37
|
(22) А если там не 1 уровень подчиненности а 3? Иерархия строиться только в рекурсии и не в запросах. В запросах можно использовать только заранее созданную иерархию в справочниках.
(24) Ок Items - массив - а в массиве что храниться? а там Структура - потому что у каждого элемента помимо значения есть наименование\ключ. |
|||
26
DrShad
21.09.16
✎
09:38
|
(24) а вот тут массив
|
|||
27
DrShad
21.09.16
✎
09:39
|
(25) а по фигу сколько уровней вложенности соединением набора данных сам с собой получаем всю описанную структуру иерархии сколько бы там не было уровней
|
|||
28
DrShad
21.09.16
✎
09:42
|
||||
29
olegon7
21.09.16
✎
09:49
|
Хорошо я получу массив из сервиса, мне этот массив надо будет преобразовать в тз? чтобы запихнуть в скд во внешний набор данных так?
потому что кроме этого набора я в отчете буду использовать еще два . Один из Mysql а второй непосредственно из 1с. И мне их тоже надо будет соединить по полю ObjectCode . Причем соединять надо только элементы нижнего уровня из первого набора с элементами из второго и третьего набра по полю ObjectCode. |
|||
30
DrShad
21.09.16
✎
10:00
|
(29) ну да источником набора может быть в твоем случае только ТЗ
|
|||
31
DrShad
21.09.16
✎
10:00
|
как преобразовать массив структур в ТЗ надо объяснять?
|
|||
32
AceVi
21.09.16
✎
10:16
|
(27) Это не левое соединение в запросе - это именно связь наборов данных. И иерархия там строиться не запросом, и в приведенном тобой примере(1 ссылка) не заполнена колонка "параметр" по которому собственно и определяеться иерархия.
Грубо говоря - в таком случае для каждой строки из "источника связи" будет выполняться весь запрос из "приемника связи" в который будет передан параметр(например код). Просто левое соединение не сработает. |
|||
33
DrShad
21.09.16
✎
10:17
|
(32) есть решения и без параметров
ищущий да найдет |
|||
34
DrShad
21.09.16
✎
10:26
|
||||
35
olegon7
21.09.16
✎
10:37
|
(31) Таким образом?
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) Экспорт тзДанные = Новый ТаблицаЗначений; Для Каждого ЭлементМассива Из мсДанные Цикл // Рисуем колонки для таблицы Если тзДанные.Колонки.Количество() = 0 Тогда Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ); КонецЦикла; КонецЕсли; // Добавляем данные в таблицу НоваяСтрока = тзДанные.Добавить(); Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение; КонецЦикла; КонецЦикла; Возврат тзДанные; КонецФункции |
|||
36
DrShad
21.09.16
✎
10:38
|
(35) в принципе да, только учти в json массиве у тебя не обязательно в первом же элементе будут все ключи структуры
|
|||
37
olegon7
21.09.16
✎
10:43
|
(31) у меня в итоге будут 3 набора данных
первый набор- из сервиса (тз1) второй набор - из mysql (тз2) третий набор - из 1 с (тз3) как расставить связи в скд между наборами первая связь понятна тз1 - тз1 левое соединение по полям ObjectCode = ParentCode как организовать связь с двумя другими наборами? |
|||
38
DrShad
21.09.16
✎
10:59
|
а связь ли нужна? может объединения хватит?
|
|||
39
DrShad
21.09.16
✎
10:59
|
потому как связь то левая, но слишком часто она сваливается во внутреннее соединение
|
|||
40
olegon7
21.09.16
✎
11:07
|
(38) попробую объяснить
в тз2 и в тз2 содержаться абоненты которые тоже должны быть подчинены самому нижнему уровню из т31. а связываются они по коду ObjectCode. Т е данные из тз2 и тз3 еще один уровень получается четвертый. В тз1 может хранится только 3 уровня вложенности. |
|||
41
DrShad
21.09.16
✎
11:29
|
(40) не видя ваших данных что либо объяснять бессмысленно, все наводки вам дали - дерзайте
|
|||
42
olegon7
21.09.16
✎
12:10
|
(41) 1)скажите элемент верхнего уровня в поле ParentCode
Заполнять чем? null или пустым значением? 2)если я сначала объединю все 3 набора , а потом сделаю соединение самим с собой по полю code. Все пройдет правильно? Что первично соединение или объединение? |
|||
43
DrShad
21.09.16
✎
12:29
|
а хз, нужно эксперементировать
|
|||
44
olegon7
22.09.16
✎
14:13
|
(43) получил тз от сервиса
соединяю само с собой получаю ошибку не найдено поле замены "КодОбъекта" что делать ? http://s46.radikal.ru/i111/1609/92/06e8d0e92fdf.jpg |
|||
45
DrShad
22.09.16
✎
14:16
|
для начала показать описание набора данных
|
|||
46
olegon7
22.09.16
✎
15:36
|
(45) разобрался с этой ошибкой описание полей в скд должно совпадать с описанием полей в тз
сейчас другая ошибка соединяю набор сам с собой получаю в ответ http://s017.radikal.ru/i412/1609/c0/5a39e2427f9b.jpg |
|||
47
olegon7
22.09.16
✎
15:40
|
||||
48
AceVi
22.09.16
✎
16:10
|
(46) По русски же все пишет.
Зайди на вкладку Связь наборов данных там есть 2 колонки которые так называются вот их и заполни. И читай внимательно те ссылки которые тут в теме. особенно ту что ведет в гугл) |
|||
49
olegon7
22.09.16
✎
16:44
|
(48) Начальное значение связи набора данных
заполнил "" строкой Я так понимаю параметр отвечающий за верхний уровень чтобы система понимала у меня у элемента верхнего уровня поле ParentCode пустая строка ошибка пропала , но в отчет ничего не выводит. Что не так сделал? подскажите |
|||
50
AceVi
22.09.16
✎
17:12
|
(49) Не знаю что не так. я твои ТЗ и отчет не видел.
выгрузи ТЗ в эксел(надеюсь знаешь как быстро сделать? это все стандартными способами делается за 3 секунды) И обработку свою на почту мне вышли. |
|||
51
AceVi
22.09.16
✎
17:13
|
(50) Да даже можно в 1С формате ТЗ сохранить.
|
|||
52
DrShad
22.09.16
✎
18:08
|
(50) а вот я бы так не смог - уже очень давно ничего не делаю за других ))))))
|
|||
53
olegon7
23.09.16
✎
08:49
|
(51) отправил вам на почту , посмотрите пожалуйста...
если не получится буду работать с тз запросами еще до помещения во внешний источник скд... |
|||
54
AceVi
23.09.16
✎
11:28
|
(53) Как будет время гляну. предположительно после 15.
|
|||
55
olegon7
23.09.16
✎
13:33
|
Написал запрос
Запрос.Текст = "ВЫБРАТЬ | Табл1.ObjectName, | Табл1.ObjectCode, | Табл1.ParentCode, | Табл1.RashodGolovnoi, | Табл1.RashodOtchod, | Табл1.PoleznyiOptpuskVsego, | Табл1.PoleznyiOtpuskYur, | Табл1.PoleznyiOtpuskByt |ПОМЕСТИТЬ Табл1 |ИЗ | &Табл1 КАК Табл1 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Табл2.ObjectName, | Табл2.ObjectCode, | Табл2.ParentCode, | Табл2.RashodGolovnoi, | Табл2.RashodOtchod, | Табл2.PoleznyiOptpuskVsego, | Табл2.PoleznyiOtpuskYur, | Табл2.PoleznyiOtpuskByt |ПОМЕСТИТЬ Табл2 |ИЗ | &Табл2 КАК Табл2 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Табл1.ObjectName, | Табл1.ObjectCode, | Табл1.ParentCode, | Табл1.RashodGolovnoi, | Табл1.RashodOtchod, | Табл1.PoleznyiOptpuskVsego, | Табл1.PoleznyiOtpuskYur, | Табл1.PoleznyiOtpuskByt, | Табл2.ObjectName КАК ObjectName1, | Табл2.ObjectCode КАК ObjectCode1, | Табл2.ParentCode КАК ParentCode1, | Табл2.RashodGolovnoi КАК RashodGolovnoi1, | Табл2.RashodOtchod КАК RashodOtchod1, | Табл2.PoleznyiOptpuskVsego КАК PoleznyiOptpuskVsego1, | Табл2.PoleznyiOtpuskYur КАК PoleznyiOtpuskYur1, | Табл2.PoleznyiOtpuskByt КАК PoleznyiOtpuskByt1 |ИЗ | Табл1 КАК Табл1 | ЛЕВОЕ СОЕДИНЕНИЕ Табл2 КАК Табл2 | ПО Табл1.ObjectCode = Табл2.ParentCode"; Запрос.УстановитьПараметр("Табл1", Тз1); Запрос.УстановитьПараметр("Табл2", Тз1); Результат = Запрос.Выполнить().Выгрузить(); Ошибка тип не может быть выбран в запросе на вторую строку запроса тз1 создал программно , указав принудительно типы полей |
|||
56
olegon7
23.09.16
✎
14:52
|
(52) (54)
вроде бы получилось, загвоздка была в типе данных...как я и думал ..http://s019.radikal.ru/i627/1609/8c/5c68f8565ac2.jpg |
|||
57
DrShad
23.09.16
✎
16:05
|
ну вот, можешь, когда захочешь
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |