Имя: Пароль:
1C
1С v8
ЛЕВОЕ СОЕДИНЕНИЕ с Срез Последних в динамическом списке
0 MistaEr
 
05.07.17
14:48
Как оптимизировать данный запрос для динамического списка:

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Артикул,
    Номенклатура.ЕдиницаИзмерения,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ПО Номенклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
1 Лефмихалыч
 
05.07.17
14:50
отбор по типу цены добавь в параметры виртуальной таблицы
2 runoff_runoff
 
05.07.17
14:55
в условия виртуальной таблицы добавить..
Номенклатура В (Выбрать Товары.Ссылка ИЗ Справочник.Номенклатура как Товары)
3 Лефмихалыч
 
05.07.17
14:56
вот так (2) не надо делать
4 runoff_runoff
 
05.07.17
14:56
по идее по сонвной таблице отбор ограничен видимыми строками..
5 Вафель
 
05.07.17
14:57
в регистре итоги хранятся?
6 runoff_runoff
 
05.07.17
14:57
1с использует внутренние соединения с основной таблицей в настройках "сложных" динамических списков..
7 MistaEr
 
05.07.17
15:07
(1) Будем считать, что у меня нет там измерения ТипЦены (ВидЦены), а в форме есть отбор по типу товара. Вот такой запрос:

ВЫБРАТЬ
    СправочникНоменклатура.Ссылка,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(Номенклатура.ТипНоменклатуры = &ТипНоменклатуры)}) КАК ЦеныНоменклатурыСрезПоследних
        ПО СправочникНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
{ГДЕ
    (СправочникНоменклатура.ТипНоменклатуры = &ТипНоменклатуры)}
8 MistaEr
 
05.07.17
15:08
Нет, даже вот такой:

ВЫБРАТЬ
    СправочникНоменклатура.Ссылка,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(Номенклатура.ТипНоменклатуры = &ТипНоменклатуры)}) КАК ЦеныНоменклатурыСрезПоследних
        ПО СправочникНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
{ГДЕ
    (СправочникНоменклатура.ТипНоменклатуры = &ТипНоменклатуры)}


Как оптимизировать его, чтоб не было соединений
9 Лефмихалыч
 
05.07.17
15:08
(7) это совсем другой запрос.
В этом запросе соединение нафиг не нужно абсолютно
10 Лефмихалыч
 
05.07.17
15:09
(8) а это превратит левое во внутреннее при установке отбора на форме
11 Лефмихалыч
 
05.07.17
15:09
+(10) и соединение опять станет ненужным
12 Вафель
 
05.07.17
15:09
из 2х таблиц нельзщя получить данные без соединения
13 Лефмихалыч
 
05.07.17
15:09
нахер тебе справочник сдался, если тебя интересуют только те записи, для которых есть цена?
14 Лефмихалыч
 
05.07.17
15:09
(12) так ему данные из одной нужны!
15 Вафель
 
05.07.17
15:10
А цена?
16 MistaEr
 
05.07.17
15:10
(14) Да, Номенклатура вся нужна
17 MistaEr
 
05.07.17
15:10
цены может не быть, ну ладно там ЕстьNull приму
18 Вафель
 
05.07.17
15:10
Даже если по регистру выбирать, то все равно неявные соединения будут
19 Лефмихалыч
 
05.07.17
15:11
(16) тогда все свои запросы выкидывай в лес и верни, как было, только в параметр виртульной аблицы добавь {(Номенклатура.ТипНоменклатуры = &ТипНоменклатуры)}
20 Лефмихалыч
 
05.07.17
15:11
(17) убери из ГДЕ этот отбор насовсем
21 MistaEr
 
05.07.17
15:12
(20) Где устанавливает отбор в талицу самого справочника, без него никак
22 Лефмихалыч
 
05.07.17
15:13
(21) а! точно, в справочнике тоже есть это поле. Ты прав. ну, тогда оставь (8). Как-то сильнее ты это уже не оптимизируешь.
23 MistaEr
 
05.07.17
15:14
(19) А параметр виртуальной таблицы чтоб лишние записи не рассматривать
24 Вафель
 
05.07.17
15:14
Галка по итогам регистра включена?
25 MistaEr
 
05.07.17
15:16
есть что нибудь подобное в типовых решениях?
26 MistaEr
 
05.07.17
15:16
(24) Разрешить итоги: срез последних? Нет
27 runoff_runoff
 
05.07.17
15:20
искать слово Соединение во всех элементах форм
28 Вафель
 
05.07.17
15:20
(26) так поставь. ускорение будет громадное
29 MistaEr
 
05.07.17
15:23
Может как то так?

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(Номенклатура.ТипНоменклатуры = &ТипНоменклатуры)}) КАК ЦеныНоменклатурыСрезПоследних
30 MistaEr
 
05.07.17
15:24
(28) А почему ее не поставили разработчики?
31 Timon1405
 
05.07.17
15:24
у вас что в базе всего один вид цен? иначе ДС должен выдавать "Дублирование ключевых полей в поле ссылка"
32 MistaEr
 
05.07.17
15:28
(31) Не суть. Вопрос в другом. Я хотел без соединений. А если СрезПоследних в отдельной вложенной таблице?
33 Вафель
 
05.07.17
15:28
(30) в ерп стоит
34 MistaEr
 
05.07.17
15:29
А может как то в общей функции такие вещи рассчитывать и получать как в СКД Вычисляемые поля
35 MistaEr
 
05.07.17
15:32
(27) Так нашел я. В общем в типовых конфигурациях тоже практикуется левое соединение
36 MistaEr
 
05.07.17
15:34
(28) А можно подробнее про это?
37 Timon1405
 
05.07.17
15:37
38 Buster007
 
05.07.17
15:51
странно, если условия соединения написаны корректно, то это не то место, которое стоит пытаться оптимизировать.
39 MistaEr
 
05.07.17
15:51
(37) Если есть такое условие как у меня (через точку)

СрезПоследних(, {(Номенклатура.ТипНоменклатуры = &ТипНоменклатуры)})

НЕ рекомендуется ставить флажок итогов
40 MistaEr
 
05.07.17
15:52
(38) Для обычного запроса да, но для динамического списка не помешает
41 Buster007
 
05.07.17
15:54
ТипНоменклатуры проиндексировано?
42 MistaEr
 
05.07.17
15:59
(41) Нет
43 EugeniaK
 
05.07.17
16:33
Нормальный запрос. Даже для динамического списка.

Можно добавить отбор по остальным полям регистра.
И проверить, что итоги по регистру включены (срез последних)
44 Timon1405
 
05.07.17
16:52
(43) почитайте (37) на ИТС пишут что если есть обращение к полям через точку, то итоги использовать не рекомендуется
45 Buster007
 
05.07.17
17:50
(39) ты можешь сделать запрос как в (0) с включенным итогом по регистру и в условии где написать СпрНоменклатура.ТипНоменклатуры = тратата

Не забудь проиндексировать по ТипНоменклатуры

Тогда у тебя не будет выполняться лишнее соединение и получение максимума по дате при обращении к срезу последних.
Это самый быстрый вариант.
Наверное, если тебе уж ппц как быстро, можешь сделать фоновое задание, которое будет кешировать последнюю цену в самом элементе номенклатуры. так будет ваще летать.
46 Вафель
 
05.07.17
17:52
(44) не совсем понятно эта рекомендация
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший