Имя: Пароль:
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) Ну вот и я помню, что быстрее, отсюда и тема пошла, просто по глупости своей не сообразил, как поставить условие на временную таблицу))
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn