Имя: Пароль:
1C
1С v8
регистр сведений максимальное значение за период
,
0 prtx
 
02.04.17
19:08
Добрый вечер знатоки!

После экспериментов, проб и ошибок накатал запросик, который быстрее всего работает и хочу получить ваш совет насколько правильно сие и оптимально, подскажите более быстрые варианты.

Задание: мне нужно получить максимальную цену номенклатуры за период.

мой запрос:
"ВЫБРАТЬ
                   |    НоменклатураКонтрагентов.Ссылка КАК Ссылка
                   |ПОМЕСТИТЬ НоменклатураКонтрагентов
                   |ИЗ
                   |    Справочник.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                   |ГДЕ
                   |    НоменклатураКонтрагентов.Номенклатура = &Номенклатура
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Ссылка
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ЦеныНоменклатурыКонтрагента.Цена
                   |ПОМЕСТИТЬ Цены
                   |ИЗ
                   |    НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыКонтрагента КАК ЦеныНоменклатурыКонтрагента
                   |        ПО НоменклатураКонтрагентов.Ссылка = ЦеныНоменклатурыКонтрагента.НоменклатураКонтрагента
                   |            И (ЦеныНоменклатурыКонтрагента.Период МЕЖДУ &НачалоПериода И &КонецПериода)
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    МИНИМУМ(Цены.Цена) КАК МинимальнаяЦена,
                   |    СРЕДНЕЕ(Цены.Цена) КАК СредняяЦена,
                   |    МАКСИМУМ(Цены.Цена) КАК МаксимальнаяЦена
                   |ИЗ
                   |    Цены КАК Цены"

по сомнения вызваны строкой:
И (ЦеныНоменклатурыКонтрагента.Период МЕЖДУ &НачалоПериода И &КонецПериода)

можно ли так соединять таблицы? данные меры оказались ГОРАЗДО ЭФФЕКТИВНЕЙ конструкции:
ГДЕ ЦеныНоменклатурыКонтрагента.Период МЕЖДУ &НачалоПериода И &КонецПериода

я понимаю почему конструкция ГДЕ работает медленно т.к. сначало тяним все записи а потом отбираем, а в моем варианте сначало отбираем а потом тяним нужные записи, НО ПРАВИЛЬНА ЛИ такая конструкция с левым соединением?

спасибо.

1с уф 8.3
1 prtx
 
02.04.17
19:32
Любопытная ну хоть ты ответь как спец))
2 Maniac
 
02.04.17
19:36
Это у тебя по всем товарам ?
3 mehfk
 
02.04.17
19:36
ВЫБРАТЬ
                   |    НоменклатураКонтрагентов.Ссылка КАК Ссылка
                   |ПОМЕСТИТЬ НоменклатураКонтрагентов
                   |ИЗ
                   |    Справочник.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                   |ГДЕ
                   |    НоменклатураКонтрагентов.Номенклатура = &Номенклатура
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Ссылка
копрокод
4 Maniac
 
02.04.17
19:39
(3) ну и причем тут нафиг твой запрос со справочником?)))
5 mehfk
 
02.04.17
19:39
(4) Надень очки.
6 prtx
 
02.04.17
19:39
(2) этот запрос у мну вызывается при активизации строки в динамическом списке и тянутся только цены номенклатуры кот. сейчас активна.
7 Maniac
 
02.04.17
19:40
(0) у тебя выборка в прямой таблице данных периодического регистра сведений.

Имхо обращение к прямым таблицам регистра всегда будет медленное.

Можешь попробовать -

Самым эффективным будет это присоединить календарь - во временную таблицу.

И соединить даты со срезом псоедних регистра на каждую дату.
Во внутреннем запросе.

А в верхнему просто МАКСИМУМ(Цена)
8 prtx
 
02.04.17
19:41
(3) чет не догнал.... разжуй
9 Maniac
 
02.04.17
19:42
(5) может еще телескоп заказать? Приперся с каим то запросом по справочнику еще и умничает
10 Джинн
 
02.04.17
19:42
11 Maniac
 
02.04.17
19:43
+(7)  кстати с таким запросом можно будет и ТЗ даже показать истории изменения цены.

У меня как минимум так и работает и летает. Для проверки понадобится. Потому что чую тебе дальше дадут задачу показать когда она была)
12 h-sp
 
02.04.17
19:48
(9) это запрос автора из (0)
13 Maniac
 
02.04.17
19:50
ааа сорян)) ох уж эти эти плюсики)
14 prtx
 
02.04.17
19:53
(12) ну так а че нет, без этой части я смогу сделать и данныю конструкцию левого соединения и придется обращаться через "две точки"
15 Maniac
 
02.04.17
19:53
(14) нах тебе соединять еслди в регистре у тебя есть Номенклатура поставщика.

Берд какой то получается. Да еще и условие с одной номенклатурой
16 Maniac
 
02.04.17
19:54
Это все равно что ты взял две одинаковые лопаты - и одной ногой на обе в землю давишь
17 Maniac
 
02.04.17
19:57
|ВЫБРАТЬ
                   |    МИНИМУМ(Цены.Цена) КАК МинимальнаяЦена,
                   |    СРЕДНЕЕ(Цены.Цена) КАК СредняяЦена,
                   |    МАКСИМУМ(Цены.Цена) КАК МаксимальнаяЦена
                   |ИЗ
                   |    РегистрСведений.ЦеныНоменклатурыКонтрагента КАК ЦеныНоменклатурыКонтрагента
                   |        ГДЕ ЦеныНоменклатурыКонтрагента.НоменклатураПоставщика.Номенклатура = &ВыбНоменклатура
                   |            И (ЦеныНоменклатурыКонтрагента.Период МЕЖДУ &НачалоПериода И &КонецПериода)
18 Maniac
 
02.04.17
19:58
Могу сразу сказать - среднее будет каким то дерьмом.
19 Maniac
 
02.04.17
20:00
А самым быстрым будет

Даты календаря - соединение со срезом.
20 youalex
 
02.04.17
20:19
(0)
первый запрос (помещение в вт) - лишний, ненужные расходы на создание вт/помещение в вт/индексацию

непонятно зачем здесь вообще запрос к таблице  Справочник.НоменклатураКонтрагентов ? Чтобы во втором запросе получить NULL если он есть? Но этот NULL все равно нивелируется агрегатными функциями третьего запроса.
21 kosts
 
02.04.17
21:26
(0) А если в периоде нет ни одной записи, и цена действующая на начало периода не интересует?
Ошибка? Это не ошибка, это системная функция.