Имя: Пароль:
1C
 
Условие по временной таблицы
0 Diablo_007
 
11.10.18
12:39
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВтНом
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВтНом)

Есть возможность как-то поставить условие на временную таблицу или необходимо делать так?:

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка)

Если я хочу в нескольких пакетах использовать то, что у меня в условии, как правильно сделать?
1 piter3
 
11.10.18
12:40
масло масляное)))
2 Diablo_007
 
11.10.18
12:40
(1) Это для примера.
3 aleks_default
 
11.10.18
12:41
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВЫБРАТЬ
    ВТ.Ссылка КАК Ссылка
ИЗ
    ВтНом КАК Вт)
4 1Сергей
 
11.10.18
12:45
(2) с соединениями плохо знаком?
5 xXeNoNx
 
11.10.18
12:47
(3) фи...
6 xXeNoNx
 
11.10.18
12:47
(4) я тож за внутреннее соединение
7 piter3
 
11.10.18
12:47
(2) плохой пример
8 Diablo_007
 
11.10.18
12:47
(3) Оо, Логично, спасибо большое)
9 xXeNoNx
 
11.10.18
12:49
(8) не делай так!!!
10 Diablo_007
 
11.10.18
12:53
(9) Почему?))
11 xXeNoNx
 
11.10.18
12:55
(10) выборка в секции ГДЕ - это УГ
12 Diablo_007
 
11.10.18
12:57
А как еще ограничить? Ну не хочется делать 1ый запрос, выгружать данные, а потом делать 2ой запрос, чтобы вставить туда данные из 1ого запроса. не думаю, что этот вариант будет лучше
13 azernot
 
11.10.18
13:04
(11) А что лучше

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (ВЫБРАТЬ
    ВТ.Ссылка КАК Ссылка
ИЗ
    ВтНом КАК Вт)



ИЛИ

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
     ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтНом КАК Вт
     ПО ВтНом.Ссылка = Номенклатура.Ссылка

?
14 Diablo_007
 
11.10.18
13:11
(13) А Это риторический вопрос? А то я не знаю) Но мне кажется, что во втором случае, он сначала выберет всю номенклатуру, а только после этого всю эту номенклатуру, которая есть в базе, а потом будет ее соединять, а в первом случае, на момент выборки он сразу будет проверять на условие вхождения. Плюс у меня оборотные регистры, и я накладываю отбор в регистре, а если я буду делать к этому регистру внутренее соединение, мне кажется, работать будет дольше.. Исправьте, если ошибаюсь. Если есть ГУРУ Скуля, с радостью выслушаю подробности работы. в том числе Как накладываются условия в виртуальных таблицах
15 xXeNoNx
 
11.10.18
13:11
(13) нуда
16 VladZ
 
11.10.18
13:20
(0) Что-то не я понял, к  чему эти нелепые телодвижения...
17 Vakhrin
 
11.10.18
13:21
Если оборотные регистры, то почему условие в виртуальной таблице не хочешь?

.Обороты(,, Реквизит В (Выбрать Элемент ИЗ ВТ))
18 azernot
 
11.10.18
13:21
(14) (15) Это вопрос. Реальный. Что лучше?  
Условие ГДЕ В (ЗапросКВТ) или внутреннее соединение с этим ЗапросКВТ?

Я как-то думал, что Условие ГДЕ В (ЗапросКВТ) оптимальнее внутреннего соединения.
19 1Сергей
 
11.10.18
13:22
(18) в общем случае нет
20 Diablo_007
 
11.10.18
13:25
(17) Так и сделал. Код с номенклатурой для примера был. Вот конечный запрос:

ВЫБРАТЬ
    _ДействующиеАкцииОстатки.Акция,
    _ДействующиеАкцииОстатки.ОбщееКоличествоОстаток,
    _ДействующиеАкцииОстатки.КоличествоНаКлиентаОстаток,
    _ДействующиеАкцииОстатки.ДатаНачала,
    _ДействующиеАкцииОстатки.ДатаОкончания
ПОМЕСТИТЬ ВтДостАкции
ИЗ
    РегистрНакопления._ДействующиеАкции.Остатки(
            ,
            ДатаНачала <= &ДатаДокумента
                И ДатаОкончания >= &ДатаДокумента) КАК _ДействующиеАкцииОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    _ДвиженияПоАкциямОбороты.Акция,
    _ДвиженияПоАкциямОбороты.КоличествоОборот
ПОМЕСТИТЬ ВтИспАкции
ИЗ
    РегистрНакопления._ДвиженияПоАкциям.Обороты(
            ,
            ,
            Авто,
            Контрагент = &Контрагент
                И ПунктРазгрузки = &ПунктРазгрузки
                И Акция В
                    (ВЫБРАТЬ
                        ВтДостАкции.Акция КАК Акция
                    ИЗ
                        ВтДостАкции КАК ВтДостАкции)) КАК _ДвиженияПоАкциямОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    _ДвиженияПоАкциямОбороты.Акция,
    _ДвиженияПоАкциямОбороты.КоличествоОборот
ПОМЕСТИТЬ ВтИспАкцииВсего
ИЗ
    РегистрНакопления._ДвиженияПоАкциям.Обороты(
            ,
            ,
            ,
            Акция В
                (ВЫБРАТЬ
                    ВтДостАкции.Акция КАК Акция
                ИЗ
                    ВтДостАкции КАК ВтДостАкции)) КАК _ДвиженияПоАкциямОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтДостАкции.Акция,
    ВтДостАкции.ОбщееКоличествоОстаток КАК ОбщееОграничение,
    ВтДостАкции.КоличествоНаКлиентаОстаток КАК КлиентОграничение,
    ВтДостАкции.ОбщееКоличествоОстаток - ЕСТЬNULL(ВтИспАкцииВсего.КоличествоОборот, 0) КАК ОбщееКоличествоОстаток,
    ВтДостАкции.КоличествоНаКлиентаОстаток - ЕСТЬNULL(ВтИспАкции.КоличествоОборот, 0) КАК ОстатокПоКлиенту
ПОМЕСТИТЬ ВтИтог
ИЗ
    ВтДостАкции КАК ВтДостАкции
        ЛЕВОЕ СОЕДИНЕНИЕ ВтИспАкции КАК ВтИспАкции
        ПО (ВтИспАкции.Акция = ВтДостАкции.Акция)
        ЛЕВОЕ СОЕДИНЕНИЕ ВтИспАкцииВсего КАК ВтИспАкцииВсего
        ПО (ВтИспАкцииВсего.Акция = ВтДостАкции.Акция)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтИтог.Акция,
    ВтИтог.ОбщееОграничение,
    ВтИтог.КлиентОграничение,
    ВтИтог.ОбщееКоличествоОстаток,
    ВтИтог.ОстатокПоКлиенту
ИЗ
    ВтИтог КАК ВтИтог
ГДЕ
    (ВтИтог.ОбщееКоличествоОстаток > 0
            ИЛИ ВтИтог.ОбщееОграничение = 0)
    И (ВтИтог.ОстатокПоКлиенту > 0
            ИЛИ ВтИтог.КлиентОграничение = 0)
21 azernot
 
11.10.18
13:25
(19) Хотелось бы чего-то более аргументированного обоснования. Почему в общем случае нет? А в каком случае "да"?
22 Cool_Profi
 
11.10.18
13:26
(21) Поймай запросы в скуле и посмотри планы.
После определённого размера списка в условии В() у тебя будет фуллскан, если не хуже.
23 Diablo_007
 
11.10.18
13:27
(22) Ну у меня в условии В будет не больше 10 позиций, я думаю, ну от силы 50. Не проблема. Но если в общем случае внутреннее соединение лучше, чем Где, то что тогда с регистрами? Условие в виртуальной таблице будет быстрее, чем внутреннее соединение?
24 Cool_Profi
 
11.10.18
13:28
(23) "словие в виртуальной таблице будет быстрее, чем внутреннее соединение?"

Да. Опять же - лови запрос и сам поймёшь ответ.
25 1Сергей
 
11.10.18
13:29
(23) Конечно, быстрее
26 Diablo_007
 
11.10.18
13:30
(25) Ну вот и я помню, что быстрее, отсюда и тема пошла, просто по глупости своей не сообразил, как поставить условие на временную таблицу))
Закон Брукера: Даже маленькая практика стоит большой теории.