Имя: Пароль:
1C
1С v8
Оптимизация запроса на СКД (ускорить выборку данных)
0 ac13
 
21.02.19
10:58
В первом наборе данных:
ВЫБРАТЬ
    ПродажиОбороты.Регистратор,
    ПродажиОбороты.Период,
    ПродажиОбороты.Номенклатура,
    СУММА(ПродажиОбороты.СтоимостьОборот),
    СУММА(ПродажиОбороты.КоличествоОборот)
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Период,
    ПродажиОбороты.Регистратор,
    ПродажиОбороты.Номенклатура


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

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура


Связь полей наборов по параметрам &Дата и &номенклатура.
Формируется долго. Можно как-то ускорить выборку, чтобы в результате получить цены на каждую дату продажи?
1 palsergeich
 
21.02.19
11:01
В таком виде нет.
Только переписывать.
Связь наборов через параметр = запрос в цикле
2 ac13
 
21.02.19
11:07
(1) Понял. А как можно переписать?
3 palsergeich
 
21.02.19
11:11
Есть такая задача - получить значение среза последних на дату не исползуя виртуальную таблицу.
1) отказаться от связи через параметр.
2) подумать как прикрутить подсказку
4 ам794123
 
21.02.19
11:15
(0) объедини оба набора в одном запросе, непонятно зачем два набора
5 palsergeich
 
21.02.19
11:16
(4) не выйдет. Точнее данные будут не соответствовать ожидаемым. Там срез последних на дату каждого документа.
То есть для каждой строки надо новое значение.
6 ам794123
 
21.02.19
11:18
(5) понятно
7 ac13
 
26.02.19
09:37
Нашел в интернете оптимизированный способ выборки цен.
В одном наборе данный выбираем и Продажи и Цены, связь с условием:
ЦеныНоменклатурыКонтрагентов.Период В
    (ВЫБРАТЬ
        МАКСИМУМ(Цены.Период)
    ИЗ
        РегистрСведений.ЦеныНоменклатурыКонтрагентов КАК Цены
    ГДЕ
        Цены.Период <= Продажи.Период
        И Цены.Номенклатура = Продажи.Номенклатура
        И Цены.ТипЦен.ТипЦеныНоменклатуры = &ТипЦен)

И вот какая тут получается проблема: для некоторых позиций у меня есть записи
Период 31.12.2018 23:59:59   Цена 1 230,00
Период 31.12.2018 23:59:59   Цена 2 500,00
Период 31.12.2018 23:59:59   Цена 1 100,00
потому что выборка из регистра "Цены номенклатуры контрагентов", максимальный период одинаковый и у меня утраивает выборку, как избежать подобной ситуации?
8 ac13
 
26.02.19
09:42
Добавил еще одну связь с условием и получилось:
ЦеныНоменклатурыКонтрагентов.Период В
    (ВЫБРАТЬ
        МАКСИМУМ(Цены.Максимум)
    ИЗ
        РегистрСведений.ЦеныНоменклатурыКонтрагентов КАК Цены
    ГДЕ
        Цены.Период <= Продажи.Период
        И Цены.Номенклатура = Продажи.Номенклатура
        И Цены.ТипЦен.ТипЦеныНоменклатуры = &ТипЦен)
9 catena
 
26.02.19
09:42
(7)Зависит от того, какой из этих трех цен вы хотите видеть.
10 ac13
 
26.02.19
10:38
(8) как оказалось, с таким условием вообще ничего не отбирает
11 ac13
 
26.02.19
10:59
В общем отобрать одну запись в ситуации когда в регистре три таких записи не удается:
Период 31.12.2018 23:59:59   Цена 1 230,00
Период 31.12.2018 23:59:59   Цена 2 500,00
Период 31.12.2018 23:59:59   Цена 1 100,00

(9) любую, максимальную или среднюю
12 _Дайвер_
 
26.02.19
11:19
Тебе надо в документе продажи брать цену номенклатуры(цена = сумма / количество), и сравнить с прайсом на дату документа. так же предусмотреть вид цены, и ситуацию когда в одном документе будет одна и та же номенклатура разбита на несколько строк
13 catena
 
26.02.19
11:23
(11)Ну и группируй по МАКСИМУМ или СРЕДНЕЕ
14 toypaul
 
гуру
26.02.19
11:27
Я бы сделал так.

Выбрал все цены через объединение остатков на начальную дата и за период. Затем сгруппировал бы по Номенклатура, Период с нужной функцией. И только потом эти обработанные цены цеплял бы к регистру продаж.

Если все это делается на СКД, то отбор по номенклатуре к такому запросу должен примениться автоматически.
15 toypaul
 
гуру
26.02.19
11:27
"через объединение остатков на начальную дата" - через объединение цен на начальную дату периода
16 Конструктор1С
 
26.02.19
11:37
По-моему СКД это дело умеет оптимизировать, но только если ты ей немного развяжешь руки - пропишешь условия в {}
17 ac13
 
26.02.19
12:08
(13) так с этим и нет проблем)
18 catena
 
26.02.19
12:11
(17)"В общем отобрать одну запись в ситуации когда в регистре три таких записи не удается"
" так с этим и нет проблем)"

Определитесь...
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс