Имя: Пароль:
1C
1С v8
Иерархия в 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
ну вот, можешь, когда захочешь