Имя: Пароль:
1C
1С v8
Помогите написать запрос.
0 ЗлаяЗая
 
21.10.21
09:50
Помогите, пожалуйста, написать запрос.
В результате первого запроса получается выборка - список номенклатуры.
У каждой номенклатуры есть родитель-группа номенклатуры. От 1 до 5 уровней.
Есть РС "Группа номенклатуры- Цена услуги"
Надо понять, к какому именно уровню родителя есть соответствие в РС и найти это значение.
Значение точно одно. Т.е. нет такого, что есть значение для уровня1 и для уровня3
1 Ёпрст
 
21.10.21
09:52
(0) Надо как-то заставить себя открыть пофигуратор и сотворить левое соединение по группе номенклатуры
2 Kassern
 
21.10.21
09:56
я правильно понимаю:
1 таблица
Номенклатура.Родитель.Родитель.Родитель="Супер папка"
2 таблица
"Супер папка" 500рублев
И вам надо Соединить 2 таблички и получить для всех товаров супер папки 500 рублев?
3 серый КТУЛХУ
 
21.10.21
09:57
2 12 85 06
4 ЗлаяЗая
 
21.10.21
09:59
(1) Я это понимаю. Не могу понять, как по уровням писать.
(2) Да. Причем у каждой номенклатуры "Супер папка" может быть к разным уровням
5 ЗлаяЗая
 
21.10.21
10:00
(3) шутку оценила :)
Я не знаю принципа связи
6 Kassern
 
21.10.21
10:00
(4) А если у Номенклатура.Родитель будет у папки цена 400р, а у Номенклатура.Родитель.Родитель 500р, то какую брать?
7 ЗлаяЗая
 
21.10.21
10:02
(6) Не будет. Это условие.
8 Pro-tone
 
21.10.21
10:02
(0) дам только подсказку как уровни считать

ВЫБОР
КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)Тогда
0
ИНАЧЕ
КОГДА Ссылка.Родитель.Родитель  = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) Тогда
1
...
КОНЕЦ КАК Уровень
9 Kassern
 
21.10.21
10:03
(8) это ж такая некрасивая портянка получается)
10 Pro-tone
 
21.10.21
10:04
(9) ну всего-то 5 концов)
11 DrShad
 
21.10.21
10:11
(8) не кошерно, ей нужно транзитивное замыкание курить
12 Kassern
 
21.10.21
10:17
Как то так:
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    Таб1.ГруппаНоменклатуры КАК ГруппаНоменклатуры,
                 |    Таб1.Цена КАК Цена
                 |ПОМЕСТИТЬ Таб1
                 |ИЗ
                 |    &Таб1 КАК Таб1
                 |;
                 |
                 |////////////////////////////////////////////////////////////////////////////////
                 |ВЫБРАТЬ
                 |    Таб2.Номенклатура КАК Номенклатура
                 |ПОМЕСТИТЬ Таб2
                 |ИЗ
                 |    &Таб2 КАК Таб2
                 |;
                 |
                 |////////////////////////////////////////////////////////////////////////////////
                 |ВЫБРАТЬ
                 |    Таб2.Номенклатура КАК Номенклатура,
                 |    Таб1.ГруппаНоменклатуры КАК ГруппаНоменклатуры,
                 |    Таб1.Цена КАК Цена
                 |ИЗ
                 |    Таб2 КАК Таб2
                 |        ЛЕВОЕ СОЕДИНЕНИЕ Таб1 КАК Таб1
                 |        ПО (Таб2.Номенклатура В ИЕРАРХИИ
                 |                (ВЫБРАТЬ
                 |                    Таб1.ГруппаНоменклатуры
                 |                ИЗ
                 |                    Таб1))";
13 Ёпрст
 
21.10.21
10:24
(4) для 5 уровней тупо так, но будет не быстро


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Номенклатура.Родитель КАК Родитель1,
    Номенклатура.Родитель.Родитель КАК Родитель2,
    Номенклатура.Родитель.Родитель.Родитель КАК Родитель3,
    Номенклатура.Родитель.Родитель.Родитель.Родитель КАК Родитель4,
    Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель КАК Родитель5
        Поместить Номенклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
Где Номенклатура.ССылка в (&ТвойСписок);

Выбрать
Номенклатура.ССылка
ЕстьNULL(ТвоиГруппы5.Цена,ЕстьNULL(ТвоиГруппы4.Цена,ЕстьNULL(ТвоиГруппы4.Цена,ЕстьNULL(ТвоиГруппы3.Цена,ЕстьNULL(ТвоиГруппы2.Цена,ЕстьNULL(ТвоиГруппы1.Цена,0) ))))) как Цена
ИЗ Номенклатура как Номенклатура

        Левое соединение РегистрСведений.ТвоиГруппы как ТвоиГруппы1 По ТвоиГруппы1.ГруппаНоменклатуры = Номенклатура.Родитель1
        и Номенклатура.Родитель <> Значение(Справочник.Номенклатура.ПустаяССылка)
        ................
        Левое соединение РегистрСведений.ТвоиГруппы как ТвоиГруппы5 По ТвоиГруппы5.ГруппаНоменклатуры = Номенклатура.Родитель5
        и Номенклатура.Родитель5 <> Значение(Справочник.Номенклатура.ПустаяССылка)
14 Ёпрст
 
21.10.21
10:30
Да в EСтьNull там поправишь как нннадо, смысл, надеюсь, понятен
15 Kassern
 
21.10.21
10:35
(13) а чем способ в (12)  не устроил? Зачем перебирать эти уровни, когда есть волшебное "В иерархии"?
16 H A D G E H O G s
 
21.10.21
10:51
Такие вещи нужно делать кодом.
Для списка номенклатур получаем 1 запросом Родителей на 1 шаге, для списка родителей получаем список родителей на 2 шаге., и.т.д.

Всего будет 5 запросов.

В результате будет тз
Номенклатура   Родитель   ИнверсныйУровень


Суем в запрос, соединяем с регистром, сортируем по Минимуму ИнверсныйУровень (мы идем с низу дерева).
17 Kassern
 
21.10.21
10:56
(16) Я все же не понимаю, почему все игнорят вот такую конструкцию?
|    Таб2 КАК Таб2
                 |        ЛЕВОЕ СОЕДИНЕНИЕ Таб1 КАК Таб1
                 |        ПО (Таб2.Номенклатура В ИЕРАРХИИ
                 |                (ВЫБРАТЬ
                 |                    Таб1.ГруппаНоменклатуры
                 |                ИЗ
                 |                    Таб1))";
В итоге мы получим для таб2(Таблица с номенклатурой) цены из таб1 если номенклатура в иерархии группы, а судя по (7) то и дублей у нас не будет
18 Homer
 
21.10.21
10:57
(17) "В иерархии" данная конструкция красивая но вот быстродействие на большой выборки вызывает большие вопросы.
19 Kassern
 
21.10.21
10:59
(18) тут ни слова про количество записей, имхо для ТС прокатит
20 Kassern
 
21.10.21
11:01
(19) судя по тому, какие вопросы задает ТС, то вряд ли идет речь про высоконагруженные системы и овердофига записей)