Имя: Пароль:
1C
1С v8
Как выгрузить результат запроса в дерево значений?
0 Nikotrisa
 
15.07.09
10:52
на форме есть табл. поле с типом дерево значений, при открытии хотелось бы заполнять это поле из запроса. Запрос к справочнику организаци возвращает результат с группировкой по родителям, вот и хотелось бы отразить это в виде дерева на форме.
КАК?
1 Vitello
 
15.07.09
10:54
см параметры выгрузить()
2 Mitriy
 
15.07.09
10:54
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией
3 Nikotrisa
 
15.07.09
11:20
спасибо, я и говорю в результате запроса есть дерево, и на форме есть табличное поле с типом дерево, как в него загрузить результат запроса?
4 Mitriy
 
15.07.09
11:22
блондинко?
5 Mitriy
 
15.07.09
11:23
Дерево = Запрос.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
6 Mitriy
 
15.07.09
11:23
Дерево - данные табполя...
7 Nikotrisa
 
15.07.09
12:00
(4) шатенка!!! фотко нет! :)
Дерево.Значение = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).Скопировать();

вот так взлетело...
8 mikecool
 
15.07.09
12:02
"шатенка!!! фотко нет! :)" - бугога
9 Nikotrisa
 
15.07.09
12:22
Подскажите пожалуйста как получить одним запросом дерево состоящее в корневых ветвях из подразделений и разворачивающиеся на вложенное дерево оформленных на эту организацию ОС. типа так:

- Подразделение1
   - Офис -(группа справочника ОС)
     ОС стол
     ОС стул
     ОС комп
   - Склад
     ОС Станок
- Подразделение2
   - Магазин
     ОС прилавок.....


у меня после выгрузки запроса "ПоГруппировкамСИерархией" выходит только в 2 колонки Подразделение и ОС.
Выбираю из регистра сведений МестонахождениеОС.Срезпоследних как правильно запрос построить?
10 Nikotrisa
 
15.07.09
12:28
апну
11 Nikotrisa
 
15.07.09
12:28
подскажите пожалуйста срочно нужно :(
12 Mitriy
 
15.07.09
12:30
запрос в студию...
13 Mitriy
 
15.07.09
12:36
(7) извиняюсь за ошибку :)
а Скопировать() - лишнее...
14 Nikotrisa
 
15.07.09
15:04
//Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    МестонахождениеОССрезПоследних.ОсновноеСредство,
   |    МестонахождениеОССрезПоследних.Местонахождение
   |ИЗ
   |    РегистрСведений.МестонахождениеОС.СрезПоследних КАК МестонахождениеОССрезПоследних
   |
   |СГРУППИРОВАТЬ ПО
   |    МестонахождениеОССрезПоследних.Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство";
   Результат = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

   Возврат Результат;



Возвращает 2 колонки...
15 Nikotrisa
 
15.07.09
15:09
(13) Без Скопировать(), просто срабатывала проверка на равенство, возвращающая ложь, а присвоения значения не происходило...
16 Nikotrisa
 
15.07.09
15:12
Всеже интересно можно такое дерево одним запросом получить или нет?
помогите написать :)
17 Nikotrisa
 
15.07.09
15:15
надежда умирает последней... я еще здесь и жду вашей помощи :)
18 ptiz
 
15.07.09
15:17
(15) ну-ну...
19 Serg_1960
 
15.07.09
15:19
А итоги где? Хочу итоги :)
20 ptiz
 
15.07.09
15:20
(14) Добавь в запрос
ИТОГИ ПО Местонахождение ИЕРАРХИЯ
21 Nikotrisa
 
15.07.09
15:28
Спасбо  ptiz, появилось дерево, но ОС по-прежнему выходят второй колонкой, как бы сделать чтобы все попало в одну колонку дерева, и ОС размещались под подразделением владельцем?

   //Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    МестонахождениеОССрезПоследних.Местонахождение КАК Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство КАК ОсновноеСредство
   |ИЗ
   |    РегистрСведений.МестонахождениеОС.СрезПоследних КАК МестонахождениеОССрезПоследних
   |
   |СГРУППИРОВАТЬ ПО
   |    МестонахождениеОССрезПоследних.Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство
   |ИТОГИ ПО
   |    Местонахождение ИЕРАРХИЯ";
22 Serg_1960
 
15.07.09
15:37
А мне где спасибо? Обидился. И не буду посказывать, что надо правильно группировку произвести. Но важнее - сделать итоги по нескольким реквизитам.
23 Nikotrisa
 
15.07.09
15:43
(22) Сергей тебе тоже Боольшое спасибо!!! :)
24 Mitriy
 
15.07.09
15:53
ну вот, понаехали тут, все спасибо расхватали... ушел плакать...
25 Nikotrisa
 
15.07.09
15:55
ребята я пыталась юзать итоги по обоим измерениям, вроде все это фигня, наверно придется сначала получить дерево подразделений, а потом обойти, добавить дочерние строки с ветвями ОС... пипец
26 Serg_1960
 
15.07.09
15:58
(23) Я рад :) Не уж то получилось? :( не удержался :)

Группировка и Итоги - различные "понятия". Группировка позволяет сгруппировать "однородные" записи, но не меняет их табличную "сущность". Итоги - вот что "создает" дерево.

(24) Зачем ушел плакать? Скажи что нибудь, доброе слово и кошке приятно... упс, сорри... я хотел сказать "и тебе спасибо скажут" :))
27 NULLL
 
15.07.09
15:59
Я делал похожее:
Запрос = Новый Запрос("ВЫБРАТЬ
                         |    ДокументыПереоценокПринятых.Документ КАК Документ,
                         |    ДокументыПереоценокПринятых.Организация КАК Организация,
                         |    ДокументыПереоценокПринятых.Склад КАК Склад
                         |ПОМЕСТИТЬ Документы
                         |ИЗ
                         |    &ДокументыПереоценокПринятых КАК ДокументыПереоценокПринятых
                         |;
                         |
                         |////////////////////////////////////////////////////////////////////////////////
                         |ВЫБРАТЬ
                         |    ТранзитныеКонтрагенты.ПодчиненныйКонтрагент КАК Контрагент,
                         |    Документы.Документ КАК Группировка,
                         |    Документы.Склад КАК Склад,
                         |    ИСТИНА КАК Пометка
                         |ИЗ
                         |    Документы КАК Документы
                         |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТранзитныеКонтрагенты КАК ТранзитныеКонтрагенты
                         |        ПО Документы.Организация = ТранзитныеКонтрагенты.Организация
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Контрагент
                         |ИТОГИ ПО
                         |    Контрагент");
   Запрос.УстановитьПараметр("ДокументыПереоценокПринятых",ТЗ);
   Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока Выборка.Следующий() Цикл
       СтрокаКонтрагентов = ПереоценкиТоваровОтданных.Строки.Добавить();
       СтрокаКонтрагентов.Группировка = Выборка.Контрагент;
       СтрокаКонтрагентов.Пометка = ИСТИНА;
       ВыборкаДокументов = Выборка.Выбрать();
       Пока ВыборкаДокументов.Следующий() Цикл
           ЗаполнитьЗначенияСвойств(СтрокаКонтрагентов.Строки.Добавить(),ВыборкаДокументов);
       КонецЦикла;
   КонецЦикла;

Может поможет.
28 Nikotrisa
 
15.07.09
16:15
(27) благодарю  NULLL я только не знакома с таким механизмом когда результат одного запроса используется как параметр другого, наверно это можно использовать в моем случае, например получить одним запросом дерево подразделений, и затем если у подразделения висят ОС вставить ему дерево его ОС???
29 Nikotrisa
 
15.07.09
16:21
решение так и не найдено, я пока в тупике :((
30 Mitriy
 
15.07.09
16:34
(29) а что не получается?

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


что не устраивает?
31 NULLL
 
15.07.09
16:37
(28)Смысл не в этом:

Такой должен быть запрос:
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    МестонахождениеОССрезПоследних.Местонахождение КАК Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство КАК ОсновноеСредство
   |ИЗ
   |    РегистрСведений.МестонахождениеОС.СрезПоследних КАК МестонахождениеОССрезПоследних
   |
   |СГРУППИРОВАТЬ ПО
   |    МестонахождениеОССрезПоследних.Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство
   |ИТОГИ ПО
   |    Местонахождение, ОсновноеСредство ИЕРАРХИЯ";
32 Serg_1960
 
15.07.09
16:40
Автор хочет в одной колонке и Местонахождение, и ОсновноеСредство. Столбиком, друг под другом... Что тут не понятно? :)
33 Serg_1960
 
15.07.09
16:44
Mitriy, это твой шанс получить спасибо :) Подскажи автору как обойти строки дерева и из одной колонки перенести значение в другую и скрыть эту колонку с показа :))
34 Nikotrisa
 
15.07.09
16:45
(30) нужен результат как в (9) а выходит с 2 колонками и без иерархии ОС.
- Подразделение1                         NULL    
      NULL                               ОС стол
      NULL                               ОС стул
      NULL                               ОС комп
      NULL                               ОС Станок
- Подразделение2                         NULL
      NULL                               ОС прилавок.....

а хотелось бы 1 колонкой, с иерархией сначала подразделений и потом их ОС
35 Nikotrisa
 
15.07.09
16:49
что то мне интуиция подсказывает что запрос здесь просто не справится...
эта технология заточена деревья выводить только по иерархически связанным источникам данных.
надеюсь я тут ошибаюсь :) а то как то медленно получится стыковать эти выборки меж собой...
36 NULLL
 
15.07.09
16:51
Обход результата:
   Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока Выборка.Следующий() Цикл
       Строка = Дерево.Строки.Добавить();
       Строка.ОсновноеСредство = Выборка.Местонахождение;
       РекурсивнаяПроцедура(Строка,Выборка);
   КонецЦикла;


Процедура РекурсивнаяПроцедура(Строка,Выборка)

  ВыборкаОС = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

  Пока ВыборкаОС.Следующий() Цикл
      НоваяСтрока = Строка.Строки.Добавить();
      НоваяСтрока.ОсновноеСредство = ВыборкаОС.ОсновноеСредство;
      РекурсивнаяПроцедура(НоваяСтрока,ВыборкаОС);
  КонецЦикла;
КонецПроцедуры  

Только тут без учета иерархии подразделений.
37 NULLL
 
15.07.09
16:53
(33) Я уже показал, только автор не заметил.
38 НЕА123
 
15.07.09
16:55
(36)
тогда запрос типа так

   Запрос.Текст = "ВЫБРАТЬ
   |    ВЫБОР КОГДА ИСТИНА МестонахождениеОССрезПоследних.Местонахождение ИНАЧЕ МестонахождениеОССрезПоследних.ОсновноеСредство КОНЕЦ КАК Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство КАК ОсновноеСредство
   |ИЗ
   |    РегистрСведений.МестонахождениеОС.СрезПоследних КАК МестонахождениеОССрезПоследних
   |
   |СГРУППИРОВАТЬ ПО
   |    МестонахождениеОССрезПоследних.Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство
   |ИТОГИ ПО
   |    Местонахождение, ОсновноеСредство ИЕРАРХИЯ";

Дабы тип ОС у колонки был.
39 NULLL
 
15.07.09
16:58
(38) Ну вообще у колонки должен быть составной тип данных, и

   |    ВЫБОР КОГДА ИСТИНА !!!!! Тогда !!!!! МестонахождениеОССрезПоследних.Местонахождение ИНАЧЕ МестонахождениеОССрезПоследних.ОсновноеСредство КОНЕЦ КАК Местонахождение,

Только я не пойму что это даст.
40 Nikotrisa
 
15.07.09
17:05
(39) ничего я так уже пробовала, вложенными, объединенными, либо выводит мусор либо вообще теряет подразделения и выводит только ОС, построитель как бы не считает связь по владельцу основанием строить по этой связи дерево...
41 Лефмихалыч
 
15.07.09
17:06
чо тут можно 40 постов обсуждать?
42 Nikotrisa
 
15.07.09
17:07
(36) спасибки NULLL, для меня не составит труда состыковать эти данные после запросов, хотела одним запросом все получить...

(41) Левыч закрой тему элегантным и оригинальным решением :)
43 Nikotrisa
 
15.07.09
17:09
+(42)... все получить, и ничего потом не обходить :)
44 Mitriy
 
15.07.09
17:11
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Запрос = Новый Запрос;
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА ИСТИНА
   |            ТОГДА МестонахождениеОССрезПоследних.Местонахождение
   |        ИНАЧЕ МестонахождениеОССрезПоследних.ОсновноеСредство
   |    КОНЕЦ КАК Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство
   |ИЗ
   |    РегистрСведений.МестонахождениеОС.СрезПоследних КАК МестонахождениеОССрезПоследних
   |
   |СГРУППИРОВАТЬ ПО
   |    МестонахождениеОССрезПоследних.Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство
   |ИТОГИ ПО
   |    Местонахождение,
   |    МестонахождениеОССрезПоследних.ОсновноеСредство ИЕРАРХИЯ";
   Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   ОбойтиСтроки(Дерево.Строки);
   
   //ЭлементыФормы.Дерево.СоздатьКолонки();
КонецПроцедуры

Процедура ОбойтиСтроки(Строки)
   Для Каждого СтрокаДерева Из Строки Цикл
       Если ЗначениеЗаполнено(СтрокаДерева.ОсновноеСредство) Тогда
           СтрокаДерева.Местонахождение = СтрокаДерева.ОсновноеСредство;    
       КонецЕсли;
       ОбойтиСтроки(СтрокаДерева.Строки);
   КонецЦикла;
КонецПроцедуры
45 NULLL
 
15.07.09
17:13
(43) Как?
46 Mitriy
 
15.07.09
17:16
(44)* маленькое уточнение:

...
   |ИТОГИ ПО
   |    Местонахождение,
   |    ОсновноеСредство ТОЛЬКО ИЕРАРХИЯ";
...

ну и с упорядочиванием поиграться для красоты...
47 Mitriy
 
15.07.09
17:24
с местонахождением засада, однако...
48 Serg_1960
 
15.07.09
17:27
Эээ... иерархия по Местонахождению. По ОсновноеСредство - лишнее. Эээ... и колонка дерева - составного типа.
49 Mitriy
 
15.07.09
17:30
(48) автор хочет везде иерархию вроде...
там двоение начинается при некоторых условиях...
50 Serg_1960
 
15.07.09
17:33
(49) Да, действительно в (9) есть. Сорри, запамятовал.

Автор, не теряй надежду - элегантное решение есть :)
51 NULLL
 
15.07.09
17:37
(50) Ага, выгружать в табличный документ. Автор уже нашла решение без обхода результат, только делится не хочет.
52 Serg_1960
 
15.07.09
17:39
(как вариант) У автора рабочее время с 08 до 17:09 :))

ИТОГИ ПО
   Местонахождение ТОЛЬКО ИЕРАРХИЯ,
   ОсновноеСредство ИЕРАРХИЯ
53 Mitriy
 
15.07.09
17:46
(52) не-а... млин, так и придется обычным обходом...
54 НЕА123
 
15.07.09
17:48
(39) это и даст составной тип данных.
(52) в карточке Владивосток.
55 NULLL
 
15.07.09
17:56
(54) Это если выгружать, то может даст, а в моем случае мне кажется ничего оно не даст.
56 Mitriy
 
15.07.09
17:57
получилось без двоений, но как-то не шибко красиво... обход по выборке все же лучше будет, наверное ))

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

Процедура ОбойтиСтроки(Строки, СтрокиКУдалению)
   Если Строки.Количество() = 0 Тогда
       СтрокиКУдалению.Добавить(Строки.Родитель);
       Возврат;
   КонецЕсли;
   Для Каждого СтрокаДерева Из Строки Цикл
       Если ЗначениеЗаполнено(СтрокаДерева.ОсновноеСредство) Тогда
           СтрокаДерева.Местонахождение = СтрокаДерева.ОсновноеСредство;    
       КонецЕсли;
       ОбойтиСтроки(СтрокаДерева.Строки, СтрокиКУдалению);
   КонецЦикла;
КонецПроцедуры
57 Mitriy
 
15.07.09
17:59
(55) ну дык как раз и интересно бы выгрузить... и чтобы без телодвижений лишних...
58 НЕА123
 
15.07.09
18:04
(55) согласен. в Вашем случае смысла нет. глаз замылился.
59 NULLL
 
15.07.09
18:04
Во идиоты. Это можно зделать без рекурсии, через поиск строк, эта функция умеет искать во всем дереве.
60 Mitriy
 
15.07.09
18:07
(59) убейся об стенку, сделай доброе дело...
61 Serg_1960
 
15.07.09
18:15
(59) спб, расмешил :)
62 NULLL
 
15.07.09
18:18
(60) и (61) Не ужели не получится, почему?
63 Serg_1960
 
15.07.09
18:54
Процедура ОбойтиСтроки(Строки)
   Для Каждого СтрокаДерева Из Строки Цикл
      СтрокаДерева.ОбщаяКолонка = ?(ЗначениеЗаполнено(СтрокаДерева.Продукция), СтрокаДерева.Продукция.Наименование, СтрокаДерева.Подразделение.Наименование);
      ОбойтиСтроки(СтрокаДерева.Строки);
   КонецЦикла;
КонецПроцедуры

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

КонецПроцедуры
64 Serg_1960
 
15.07.09
19:08
(62) Меня расмешило "Во идиоты" и его многозначное толкование :)
65 НЕА123
 
16.07.09
09:35
(64)
1. а так, интересно, правильно?

Процедура ОбойтиСтроки(Строки)
   НужныеСтроки = Строки.НайтиСтроки(Новый Структура("Продукция", NULL));
   Для Каждого СтрокаДерева Из НужныеСтроки Цикл
      СтрокаДерева.ОбщаяКолонка = СтрокаДерева.Подразделение.Наименование;
   КонецЦикла;
КонецПроцедуры

2. не проще ли  использовать конструкцию

   |    ВЫБОР
   |        КОГДА ИСТИНА
   |            ТОГДА МестонахождениеОССрезПоследних.Местонахождение
   |        ИНАЧЕ МестонахождениеОССрезПоследних.ОсновноеСредство
   |    КОНЕЦ КАК Местонахождение

чем потом удалять колонку?
66 НЕА123
 
16.07.09
09:38
+(65)
пардон
НужныеСтроки = Строки.НайтиСтроки(Новый Структура("Продукция", NULL), ИСТИНА);

второй параметр в (65) забыл указать.
67 NULLL
 
16.07.09
10:01
(66) Самым лучшим был-бы вариант еслибы вообще ничего удалять не пришлось.

А где же автор, разве я не заслужил спасибо.
68 Serg_1960
 
16.07.09
19:16
(65) Первый вариант: Пардон. Тогда вызов и процедура ОбойтиСтроки вообще не нужны.
Второй вариант: Не прокатит, ВЫБОР - пролетает. Итоги с использованием ИЕРАРХИЯ - значения регистра не будут присутствовать/вычисляться в иерархических записях.
69 Mitriy
 
17.07.09
09:34
(68) а чем (56) не понравилось? вполне себе работает, если через СоздатьКолонки(), то можно колонку удалить, а если сделать колонку в табполе, то можно и не удалять, зато значения ссылочные, а не строковые...