Имя: Пароль:
1C
1С v8
Помогите с запросом
,
0 WED
 
08.09.11
12:14
Справочник "номенклатура"
У элементов и групп есть реквизит "ОтображатьВПрайсе", булево

Задача: Из запроса получить дерево, в котором будут только те элементы справочника, у которых ОтображатьВПрайсе = Истина, но при этом значение этого реквизита у родителя этого элемента является приоритетным.
Т.е. если имеем вложенность:

Группа1 Отображать=истина
-Подгруппа1 Отображать=ложь
--Подгруппа1 Отображать=истина
---Элемент1 Отображать=истина
-Подгруппа2 Отображать=истина
--Подгруппа2  Отображать=истина
---Элемент2 Отображать=истина

в результате запроса должно быть только эти элементы и группы:
Группа1
-Подгруппа2
--Подгруппа2
---Элемент2

Не понимаю как в запросе обыграть приоритет флага у родителя
1 Defender aka LINN
 
08.09.11
12:17
(0) Какбе, если у родителя приоритет, тот в этом примере должны все вывестись.
2 Jstunner
 
08.09.11
12:17
уровень вложенности ограничен?
3 wise
 
08.09.11
12:19
где Родитель.Отабражать И отображать
4 WED
 
08.09.11
12:22
(1) нет, не должны. Потому что у Подгруппа1 Отображать=ложь, т.е. все элементы и группы вложенные в Подгруппа1 (включая её саму) не должны попасть в результат
5 WED
 
08.09.11
12:23
(2) нет
6 GANR
 
08.09.11
12:25
Выгрузить результат запроса в дерево, которое затем обработать с помощью стека или рекурсии

СтекВызовов = Новый Массив;    
СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ТвоеДерево.ПолучитьЭлементы(), 0));
   
Пока СтекВызовов.Количество() <> 0 Цикл
   ТекущиеПараметры = СтекВызовов[СтекВызовов.Количество()-1];
   Если ТекущиеПараметры.Курсор <= ТекущиеПараметры.НаборСтрок.Количество() - 1 Тогда
       ТекущиеПараметры.НаборСтрок[ТекущиеПараметры.Курсор].Используется = Ложь;
       ДочернийНабор = ТекущиеПараметры.НаборСтрок[ТекущиеПараметры.Курсор].ПолучитьЭлементы();
       ТекущиеПараметры.Курсор = ТекущиеПараметры.Курсор + 1;
       Если ДочернийНабор.Количество() <> 0 Тогда                    
           СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ДочернийНабор, 0));
       КонецЕсли;
   Иначе                
       СтекВызовов.Удалить(СтекВызовов.Количество()-1);
   КонецЕсли;
КонецЦикла;
7 Jstunner
 
08.09.11
12:26
(4) почему Отображать=истина группы Группа1 не имеет высшего приоритета?

(5) тогда - никак
8 WED
 
08.09.11
12:28
(3) щас запрос такой:
--------------------------------------
ВЫБРАТЬ
   Номенклатура.Ссылка КАК Ссылка
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.ОтображатьВПрайсе = ИСТИНА
   И Номенклатура.ПометкаУдаления = ЛОЖЬ
   И Номенклатура.Родитель В ИЕРАРХИИ(&ВыбраннаяРодительскаяГруппа)

УПОРЯДОЧИТЬ ПО
   Ссылка ИЕРАРХИЯ

АВТОУПОРЯДОЧИВАНИЕ

--------------------------------------------

В результате получаю дерево такого вида:
Группа1
--Подгруппа1
---Элемент1
-Подгруппа2
--Подгруппа2
---Элемент2

т.е. запрос просто исключил Подгруппа1 первого уровня вложенности, а надо чтобы были исключены и все её дочерние
9 Defender aka LINN
 
08.09.11
12:30
Если приоритет только у "не отображать", то все просто:

Выбрать
   Ссылка
Поместить Группы
Из
   Справочник.Номенклатура
ГДЕ
   ЭтоГруппа
   И НЕ ОтображатьВПрайсе
;
Выбрать
   Ссылка
Поместить НеВыводимые
Из
   Справочник.Номенклатура
ГДЕ
   Ссылка В ИЕРАРХИИ (Выбрать Группы.Ссылка ИЗ Группы)
;
Выбрать
   Ссылка
Из
   Справочник.Номенклатура КАК Номенклатура
   левое соединение НеВыводимые КАК НеВыводимые
   По Номенклатура.Ссылка = НеВыводимые.Ссылка
где
   ОтображатьВПрайсе
   И НеВыводимые.Ссылка есть null
10 WED
 
08.09.11
12:30
так. из-за того, что я в примере в (0) неверно написал номера групп и подгрупп, я сам и запутался.
Давайте вот на этом примере будем копать:

Группа1 Отображать=истина
-Подгруппа2 Отображать=ложь
--Подгруппа3 Отображать=истина
---Элемент4 Отображать=истина
-Подгруппа5 Отображать=истина
--Подгруппа6  Отображать=истина
---Элемент7 Отображать=истина

Уровень каждого по дефису понятен
11 WED
 
08.09.11
12:31
Вот по примеру в (10) все что в Подгруппа2 (и она сама) должны быть исключены из результата несмотря на их флаг
12 WED
 
08.09.11
12:35
(9) ммм.. Смысл смутно уловил, можно в виде конечного запроса?
в консоли запросов хочу протестировать
13 Defender aka LINN
 
08.09.11
12:36
(12) А это что, по-твоему?
14 szhukov
 
08.09.11
12:37
(12) Проще и надежней будет вначале пройтись обработкой и проставить всем элементам и подгруппам группы "-Подгруппа2" значение "ложь", а затем выбрать то что нужно простым запросом
15 szhukov
 
08.09.11
12:38
+(14) соответсвенно при изменении значения какой-то группы/подгруппы, автоматом присваивать всем вложенным элементам новое значение. И вопрос о запросе отпадет.
16 WED
 
08.09.11
12:39
(13) Не знаю :) Консоль запросов ругается на это
(14) Рассматривал. Не пойдет. Есть группы, которые исключили из прайса 1 раз, а есть постоянно исключенные. Твой подход собьёт такую настройку.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.