Имя: Пароль:
1C
1С v8
Заполнить ДеревоЗначений из иерархического справочника
0 skelaKuban
 
20.09.11
16:59
Есть иерархический справочник, нужно заполнить его значениями ДеревоЗначений. Как это можно сделать?
1 Grusswelle
 
20.09.11
16:59
Запросом!
2 Grusswelle
 
20.09.11
17:00
+ выброкой из результата запроса.
3 Шапокляк
 
20.09.11
17:03
Скорее, выгрузкой результата запроса.
4 Челмедведосвин
 
20.09.11
17:04
РезультатЗапроса (QueryResult)
Выгрузить (Unload)
Синтаксис:

Выгрузить(<ТипОбхода>)
Параметры:

<ТипОбхода> (необязательный)

Тип: ОбходРезультатаЗапроса. Задает тип обхода записей в получаемой выборке.
Значение по умолчанию: Прямой
Возвращаемое значение:

Тип: ТаблицаЗначений; ДеревоЗначений. Если тип обхода задан Прямой, результат выгружается в таблицу значений, в противном случае в дерево значений.
Описание:

Создает таблицу значений (или дерево значений) и копирует в нее все записи набора.
5 Eugeneer
 
20.09.11
17:08
Есть одна неприятность! при выгрузке в дерево 1С конечные элементы дублирует. Типа идет элемент, а под ним еще элемент.
Это в случае если еще какие то доп реквизиты идут.
6 Eugeneer
 
20.09.11
17:09
Причем этот баг не относится к случаю если запрос был сделан через СКД
7 Челмедведосвин
 
20.09.11
17:10
(5) Т.е. в СКД все нормально, а в простом запросе только обход выборки спасет отца русской демократии?
8 ptiz
 
20.09.11
17:11
(5) Это не дубли, это - детальные записи.
9 Eugeneer
 
20.09.11
17:11
(7) аха. еще и с проверкой чтобы дубляжа не получилось.
10 Eugeneer
 
20.09.11
17:12
(8) я понимаю это. но получается что это косяк. детальная запись должна быть на уровне конечного элемента. а получается что идет еще в низ и выход только выборка.
11 skelaKuban
 
20.09.11
17:12
Запросом, ок. Только мне надо будет сделать итоги, а по какому полю?
12 Eugeneer
 
20.09.11
17:16
(11) итоги общие? дерево на форме?
13 Eugeneer
 
20.09.11
17:17
в дереве могут быть итоги - по каждому уровню. общие.
Причем общие тоже глючат т.к. выдают итоги по всей колонке, а не только по итогам попавших элементов.
При этом если несколько групп плюс иерархия то в итоге всего дерева будет полный бред.
14 Челмедведосвин
 
20.09.11
17:19
(13) А если получить результат через СКД и вывести в таб. поле?
15 Eugeneer
 
20.09.11
17:19
т.е. итог по полонкам дерева нормальный не получить никак. либо придется считать его специальными процедурами и выводить отдельно. Т.е. писать все кодом.
Иначе в итоге слепится многоразовое (в зависимости от уровней) увеличение, которое никак простым методом не исправить.
Опять жэе придется рекурсией каждое поле подсчитывать.
16 Eugeneer
 
20.09.11
17:24
(14) так автору дерево нужно а не таб поле.
17 Шапокляк
 
20.09.11
17:24
Какой итог, если выгружается иерархический справочник?
(5) Всякие косяки с дублями возможны только если в справочнике иерархия элементов.
21 Eugeneer
 
20.09.11
17:30
(17) что значит какой итог. По каждой папке итог будет. Но общий итог по дереву выдаст хреню.
22 GANR
 
20.09.11
17:31
1. Сделать запрос с итогом по иерархии этого справочника.
2. Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией)
3. Обойти выборку (2) с помощью стека или рекурсии. Примерно так:
   СтекВызовов = Новый Массив;    
   СтекВызовов.Добавить(Новый Структура("Выборка, Вершины", Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, "Ссылка"), ТвоеДерево.ПолучитьЭлементы()));
   
   Пока СтекВызовов.Количество() <> 0 Цикл
       ТекущиеПараметры = СтекВызовов[СтекВызовов.Количество()-1];
       Если ТекущиеПараметры.Выборка.Следующий() Тогда
           НоваяВершина = ТекущиеПараметры.Вершины.Добавить();
           ЗаполнитьЗначенияСвойств(НоваяВершина, ТекущиеПараметры.Выборка);
           ДочерняяВыборка = ТекущиеПараметры.Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, "Ссылка");
           Если ДочерняяВыборка.Количество() <> 0 Тогда                    
               СтекВызовов.Добавить(Новый Структура("Выборка, Вершины", ДочерняяВыборка, НоваяВершина.ПолучитьЭлементы()));
           КонецЕсли;
       Иначе                
           СтекВызовов.Удалить(СтекВызовов.Количество()-1);
       КонецЕсли;
   КонецЦикла;
23 Eugeneer
 
20.09.11
17:31
(17) дудляж будет по любому запросу выгруженному в дерево. т.к. дубль как тут уже коллега подсказал - детальная запись конечного уровня дерева.
24 Vladal
 
20.09.11
17:31
Может, поможет: Статья "Рекурсивный обход дерева значений с пересчетом иерархических итогов группировок"

Описано формирование дерева на простом примере.
http://infostart.ru/public/72380/
25 Шапокляк
 
20.09.11
17:32
(21) Хочу выгрузить в дерево иерархический справочник "Номенклатура" с иерархией групп и элементов. Какой итог? Что суммировать-то?
26 Eugeneer
 
20.09.11
17:32
(22) прикольная процедура!
27 Eugeneer
 
20.09.11
17:33
(25) а кто тебе сказал что у него там ничего нет? никаких соединения с остаткми и прочими регистрами?
28 Eugeneer
 
20.09.11
17:34
Если чел написал про итоги значит у него там не чисто справочник.
29 Шапокляк
 
20.09.11
17:34
(27) Прочитай (0).
30 GANR
 
20.09.11
17:34
(26) ага... классический способ избежать рекурсии - использование стека
31 skelaKuban
 
20.09.11
17:35
я постарался сделать как в статье на инфостарт


МойЗапрос.Текст="ВЫБРАТЬ
                   |    СписокПрограммногоОбеспечения.Ссылка,
                   |    СписокПрограммногоОбеспечения.ВерсияДанных,
                   |    СписокПрограммногоОбеспечения.ПометкаУдаления,
                   |    СписокПрограммногоОбеспечения.Предопределенный,
                   |    СписокПрограммногоОбеспечения.Родитель КАК Родитель,
                   |    СписокПрограммногоОбеспечения.ЭтоГруппа,
                   |    СписокПрограммногоОбеспечения.Код,
                   |    СписокПрограммногоОбеспечения.Наименование КАК Наименование
                   |ИЗ
                   |    Справочник.СписокПрограммногоОбеспечения КАК СписокПрограммногоОбеспечения
                   |ИТОГИ
                   |    КОЛИЧЕСТВО(Наименование)
                   |ПО
                   |    Родитель ИЕРАРХИЯ";
   Результат=МойЗапрос.Выполнить().Выбрать();
       

   ЭлементыФормы.Дерево.Значение = МойЗапрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

   
   // Для того, чтобы были видны колонки, их надо создать
   ЭлементыФормы.Дерево.СоздатьКолонки();
32 Eugeneer
 
20.09.11
17:35
(29) а может ты прочитаешь внимательно ветку?
33 Шапокляк
 
20.09.11
17:35
(28) Ага.. в (11) "Только мне надо будет сделать итоги, а по какому полю?" - вообще ппц постановка задачи.
34 ptiz
 
20.09.11
17:36
(10) Используй агрегатные функции и группировку. Тогда не будет лишних записей.
35 skelaKuban
 
20.09.11
17:36
в результате: получается самая верхняя группировка по группам, она мне не нужна, далее то, что надо
36 Шапокляк
 
20.09.11
17:37
(32) Я внимательно прочитала твои дикие измышления и рекламные ссылки. И что?
37 Eugeneer
 
20.09.11
17:38
(33) достаточно для того чтобы все таки принять во внимание что в ТС все таки дерево с каикми то полями для итогов
38 Eugeneer
 
20.09.11
17:39
(36) короч хватит флудить. Я почему то автора  сразу понял а ты только флуд разводишь и продолжаешь головой об стену биться. сказали есть итоги. занчит ЕСТЬ. что еще нужно?
39 Eugeneer
 
20.09.11
17:39
(31) что то дофига в запросе лишнего!
Плюс выгрузка неправильная.