Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Иерархия в json

Иерархия в json
Я
   olegon7
 
20.09.16 - 16:37
Здравствуйте, подскажите как реализовать иерархию в json.

от сервиса буду получать ответ в формате json. данные в нем связаны иерархически. Данные записаны в json массивом.

На основе этих данных буду строить отчет с группировкой.
 
 
   Asmody
 
1 - 20.09.16 - 16:40
И как вы массивом передаете иерархические данные? *мне чисто для образования
   olegon7
 
2 - 20.09.16 - 16:43
(1) вот надо придумать

например через айди родителя
   Asmody
 
3 - 20.09.16 - 16:48
(2) Передавай массив пар.
   DrShad
 
4 - 20.09.16 - 16:53
поставим закладочку

тоже сейчас вштырили всякие json? php  и иже с ними
для создания json данных пользую обработку 1С:JSON. JavaScript Object Notation парсер и сериализатор.

Александра Переверзева
   olegon7
 
5 - 20.09.16 - 16:53
(3) не понял, можно поподробнее
   DrShad
 
6 - 20.09.16 - 16:54
тут все зависит от того как ты потом отражать будешь иерархию
   olegon7
 
7 - 20.09.16 - 17:03
(6) принимаю json преобразовываю в тз ,
тз использую как внешний источник для построения отчета в скд
   olegon7
 
8 - 20.09.16 - 17:04
в отчете обычная группировка.
т.е.
Подстанция
__________Фидер
_______________ТП

т.е . элемент коллекции может быть одним из этих значений
   DrShad
 
9 - 20.09.16 - 17:05
так тут не 1С-ский сервис, а внешний

и как на внешнем ресурсе отражена иерархия? да и зачем в СКД пихать иерархию если ее можно в самой СКД построить как угодно
   DrShad
 
10 - 20.09.16 - 17:05
ну так выгружай кроме самого элемента его родительский вот и заготовка для иерархии
 
 Рекламное место пустует
   Ластик
 
11 - 20.09.16 - 17:08
(0) Массив в массиве приходит, если я правильно понял вопрос, таким образом в json иерархия и строится как я понял. Сам не писал приходилось обмен допиливать где именно так дело было, приходил файл с вложенными массивами.
   DrShad
 
12 - 20.09.16 - 17:09
у тебя же есть ChildNode и ParentNode
в СКД создаешь набор данных и соединяешь его сам с собой по ChildNode = ParentNode

иерархия готова
   DrShad
 
13 - 20.09.16 - 17:11
кстати обработка из (4) умеет также читать json
   olegon7
 
14 - 20.09.16 - 17:11
(13) попробую
   olegon7
 
15 - 20.09.16 - 17:12
(12) Массив в массиве ? В какой объект 1с его можно преобразовать?
   olegon7
 
16 - 20.09.16 - 17:13
(11) Массив в массиве ? В какой объект 1с его можно преобразовать?
   DrShad
 
17 - 20.09.16 - 17:19
да хоть в ТЗ, вот только ее нельзя будет в СКД запихнуть
   AceVi
 
18 - 20.09.16 - 17:58
(0) Че вы огород городите.
Все уже давно придумано за вас - реквизит Родитель в нем указываешь УИД или Код что там у тебя есть и все.
(7) Вот вообще не понятно как у тебя из ТЗ иерархия получается. Что то ты недоговариваешь.
   Torquader
 
19 - 20.09.16 - 18:47
Нет, а в чём проблема передачи иерархии ?
У каждого элемента есть массив дочерних - назовём его Children и всё.
Вот когда нужно будет передать граф или группу, тогда придётся уже искать идентификаторы и чесать репу.
Аналогом иерархии можно рассматривать объект ДеревоЗначений из 1С - оно должно успешно сериализоваться в JsOn.
   olegon7
 
20 - 21.09.16 - 08:54
(12) т.е . 2 создать набора данных (тз) , запихнуть его
в скд. И соединить эти 2 набора по связи ChildNode = ParentNode левым соединением?
я правильно понял?
   olegon7
 
21 - 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?
   DrShad
 
22 - 21.09.16 - 09:23
(20) 1 набор данных и соединить его сам с собой
   DrShad
 
23 - 21.09.16 - 09:25
(21) ну во-первых это не массив, а структура
   olegon7
 
24 - 21.09.16 - 09:31
(22) в скд можно соединять наборы только левы соединением насколько я помню....
почему не массив....
Вот так я получаю ответ от сервиса
Строка=Ответ.ПолучитьТелоКакСтроку("UTF-8");
    ЧтениеJSON= новый ЧтениеJSON();
    ЧтениеJSON.УстановитьСтроку(Строка);
    f=ПрочитатьJSON(ЧтениеJSON);
    мас=f.Items;

Items это массив как раз таки
   AceVi
 
25 - 21.09.16 - 09:37
(22) А если там не 1 уровень подчиненности а 3? Иерархия строиться только в рекурсии и не в запросах. В запросах можно использовать только заранее созданную иерархию в справочниках.
(24) Ок Items - массив - а в массиве что храниться? а там Структура - потому что у каждого элемента помимо значения есть наименование\ключ.
   DrShad
 
26 - 21.09.16 - 09:38
(24) а вот тут массив
   DrShad
 
27 - 21.09.16 - 09:39
(25) а по фигу сколько уровней вложенности соединением набора данных сам с собой получаем всю описанную структуру иерархии сколько бы там не было уровней
   DrShad
 
28 - 21.09.16 - 09:42
   olegon7
 
29 - 21.09.16 - 09:49
Хорошо я получу массив из сервиса, мне этот массив надо будет преобразовать в тз? чтобы запихнуть в скд во внешний набор данных так?

потому что кроме этого набора я в отчете буду использовать еще два . Один из Mysql а второй непосредственно из 1с.
И мне их тоже надо будет соединить по полю ObjectCode .
Причем соединять надо только элементы нижнего уровня из первого набора с элементами из второго и третьего набра
по полю ObjectCode.
   DrShad
 
30 - 21.09.16 - 10:00
(29) ну да источником набора может быть в твоем случае только ТЗ
   DrShad
 
31 - 21.09.16 - 10:00
как преобразовать массив структур в ТЗ надо объяснять?
   AceVi
 
32 - 21.09.16 - 10:16
(27) Это не левое соединение в запросе - это именно связь наборов данных. И иерархия там строиться не запросом, и в приведенном тобой примере(1 ссылка) не заполнена колонка "параметр" по которому собственно и определяеться иерархия.

Грубо говоря - в таком случае для каждой строки из "источника связи" будет выполняться весь запрос из "приемника связи" в который будет передан параметр(например код).
Просто левое соединение не сработает.
   DrShad
 
33 - 21.09.16 - 10:17
(32) есть решения и без параметров
ищущий да найдет
 
 
   DrShad
 
34 - 21.09.16 - 10:26
   olegon7
 
35 - 21.09.16 - 10:37
(31) Таким образом?
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) Экспорт
    
    тзДанные = Новый ТаблицаЗначений;
    
    Для Каждого ЭлементМассива Из мсДанные Цикл
        // Рисуем колонки для таблицы

        Если тзДанные.Колонки.Количество() = 0 Тогда
            Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
                тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
            КонецЦикла;
        КонецЕсли;
        
        // Добавляем данные в таблицу

        НоваяСтрока = тзДанные.Добавить();
        Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
            НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
        КонецЦикла;
    КонецЦикла;
    
    Возврат тзДанные;
    
КонецФункции
   DrShad
 
36 - 21.09.16 - 10:38
(35) в принципе да, только учти в json массиве у тебя не обязательно в первом же элементе будут все ключи структуры
   olegon7
 
37 - 21.09.16 - 10:43
(31) у меня в итоге будут 3 набора данных
первый набор- из сервиса (тз1)

второй набор - из mysql (тз2)

третий набор - из 1 с (тз3)

как расставить связи в скд между наборами
первая связь понятна тз1 - тз1 левое соединение по полям ObjectCode = ParentCode

как организовать связь с двумя другими наборами?
   DrShad
 
38 - 21.09.16 - 10:59
а связь ли нужна? может объединения хватит?
   DrShad
 
39 - 21.09.16 - 10:59
потому как связь то левая, но слишком часто она сваливается во внутреннее соединение
   olegon7
 
40 - 21.09.16 - 11:07
(38) попробую объяснить
в тз2 и в тз2 содержаться абоненты которые тоже должны быть подчинены самому нижнему уровню из т31. а связываются они по коду ObjectCode.
Т е данные из тз2 и тз3 еще один уровень получается четвертый.
В тз1 может хранится только 3 уровня вложенности.
   DrShad
 
41 - 21.09.16 - 11:29
(40) не видя ваших данных что либо объяснять бессмысленно, все наводки вам дали - дерзайте
   olegon7
 
42 - 21.09.16 - 12:10
(41) 1)скажите элемент верхнего уровня в поле ParentCode
Заполнять чем?
null или пустым значением?
2)если я сначала объединю все 3 набора , а потом сделаю соединение самим с собой по полю code. Все пройдет правильно? Что первично соединение или объединение?
   DrShad
 
43 - 21.09.16 - 12:29
а хз, нужно эксперементировать
   olegon7
 
44 - 22.09.16 - 14:13
(43) получил тз от сервиса
соединяю само с собой получаю ошибку
не найдено поле замены "КодОбъекта"

что делать ?

http://s46.radikal.ru/i111/1609/92/06e8d0e92fdf.jpg
   DrShad
 
45 - 22.09.16 - 14:16
для начала показать описание набора данных
   olegon7
 
46 - 22.09.16 - 15:36
(45) разобрался с этой ошибкой описание полей в скд должно совпадать с описанием полей в тз

сейчас другая ошибка соединяю набор сам с собой получаю в ответ
http://s017.radikal.ru/i412/1609/c0/5a39e2427f9b.jpg
   olegon7
 
47 - 22.09.16 - 15:40
   AceVi
 
48 - 22.09.16 - 16:10
(46) По русски же все пишет.
Зайди на вкладку Связь наборов данных там есть 2 колонки которые так называются вот их и заполни.
И читай внимательно те ссылки которые тут в теме. особенно ту что ведет в гугл)
   olegon7
 
49 - 22.09.16 - 16:44
(48) Начальное значение связи набора данных 
заполнил "" строкой
Я так понимаю параметр отвечающий за верхний уровень
чтобы система понимала
у меня у элемента верхнего уровня поле ParentCode пустая строка

ошибка пропала , но в отчет ничего не выводит.

Что не так сделал? подскажите
 
 Рекламное место пустует
   AceVi
 
50 - 22.09.16 - 17:12
(49) Не знаю что не так. я твои ТЗ и отчет не видел.
выгрузи ТЗ в эксел(надеюсь знаешь как быстро сделать? это все стандартными способами делается за 3 секунды)
И обработку свою на почту мне вышли.
   AceVi
 
51 - 22.09.16 - 17:13
(50) Да даже можно в 1С формате ТЗ сохранить.
   DrShad
 
52 - 22.09.16 - 18:08
(50) а вот я бы так не смог - уже очень давно ничего не делаю за других ))))))
   olegon7
 
53 - 23.09.16 - 08:49
(51) отправил вам на почту , посмотрите пожалуйста...

если не получится буду работать с тз запросами еще до помещения во внешний источник скд...
   AceVi
 
54 - 23.09.16 - 11:28
(53) Как будет время гляну. предположительно после 15.
   olegon7
 
55 - 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 создал программно , указав принудительно типы полей
   olegon7
 
56 - 23.09.16 - 14:52
(52) (54)

вроде бы получилось, загвоздка была в типе данных...как я и думал ..http://s019.radikal.ru/i627/1609/8c/5c68f8565ac2.jpg
   DrShad
 
57 - 23.09.16 - 16:05
ну вот, можешь, когда захочешь


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует