Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите написать запрос.

Помогите написать запрос.
Я
   ЗлаяЗая
 
21.10.21 - 09:50
Помогите, пожалуйста, написать запрос.
В результате первого запроса получается выборка - список номенклатуры.
У каждой номенклатуры есть родитель-группа номенклатуры. От 1 до 5 уровней.
Есть РС "Группа номенклатуры- Цена услуги"
Надо понять, к какому именно уровню родителя есть соответствие в РС и найти это значение.
Значение точно одно. Т.е. нет такого, что есть значение для уровня1 и для уровня3
   Ёпрст
 
1 - 21.10.21 - 09:52
(0) Надо как-то заставить себя открыть пофигуратор и сотворить левое соединение по группе номенклатуры
   Kassern
 
2 - 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) шутку оценила :)
Я не знаю принципа связи
   Kassern
 
6 - 21.10.21 - 10:00
(4) А если у Номенклатура.Родитель будет у папки цена 400р, а у Номенклатура.Родитель.Родитель 500р, то какую брать?
   ЗлаяЗая
 
7 - 21.10.21 - 10:02
(6) Не будет. Это условие.
   Pro-tone
 
8 - 21.10.21 - 10:02
(0) дам только подсказку как уровни считать

ВЫБОР
КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)Тогда
0
ИНАЧЕ
КОГДА Ссылка.Родитель.Родитель  = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) Тогда
1
...
КОНЕЦ КАК Уровень
   Kassern
 
9 - 21.10.21 - 10:03
(8) это ж такая некрасивая портянка получается)
   Pro-tone
 
10 - 21.10.21 - 10:04
(9) ну всего-то 5 концов)
   DrShad
 
11 - 21.10.21 - 10:11
(8) не кошерно, ей нужно транзитивное замыкание курить
   Kassern
 
12 - 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 там поправишь как нннадо, смысл, надеюсь, понятен
   Kassern
 
15 - 21.10.21 - 10:35
(13) а чем способ в (12)  не устроил? Зачем перебирать эти уровни, когда есть волшебное "В иерархии"?
   H A D G E H O G s
 
16 - 21.10.21 - 10:51
Такие вещи нужно делать кодом.
Для списка номенклатур получаем 1 запросом Родителей на 1 шаге, для списка родителей получаем список родителей на 2 шаге., и.т.д.

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

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


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

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.