|   |   | 
| 
 | Иерархия в 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 | 
        ну вот, можешь, когда захочешь     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |