Имя: Пароль:
1C
 
Оптимизация запроса по периодам
0 serg-lom89
 
01.09.16
16:52
запрос,который берет остатки на указанные даты.Подскажите как можно оптимизировать данный запрос
1 serg-lom89
 
01.09.16
16:53
ВЫБРАТЬ
    ПринадлежностьСкладовСрезПоследних.Склад,
    ПринадлежностьСкладовСрезПоследних.Организация
ПОМЕСТИТЬ СкладыОрганизаций
ИЗ
    РегистрСведений.ПринадлежностьСкладов.СрезПоследних(&КонецПериода, Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный)) КАК ПринадлежностьСкладовСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период
ПОМЕСТИТЬ ТЗ_Дат
ИЗ
    (ВЫБРАТЬ
        0 КАК a
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        1
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        2
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        3
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        4
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        5
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        6
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        7
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        8
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        9) КАК aa
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК b
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК bb
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК c
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК cc
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК d
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК dd
        ПО (ИСТИНА)
ГДЕ
    aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    НАЧАЛОПЕРИОДА(ТЗ_Дат.Период, ДЕНЬ) КАК Период
ПОМЕСТИТЬ Дни
ИЗ
    ТЗ_Дат КАК ТЗ_Дат
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Движения.Номенклатура,
    ДНИ.Период КАК ПериодОстатки,
    СУММА(ВЫБОР
            КОГДА Движения.Период = &НачалоПериода
                ТОГДА Движения.КоличествоКонечныйОстаток
            ИНАЧЕ ВЫБОР
                    КОГДА Движения.Период <= ДНИ.Период
                        ТОГДА Движения.КоличествоОборот
                    ИНАЧЕ 0
                КОНЕЦ
        КОНЕЦ) КАК КоличествоКонечныйОстаток,
    Движения.Склад
ПОМЕСТИТЬ втБезЦены
ИЗ
    Дни КАК ДНИ,
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный) {(Склад), (Номенклатура), (Номенклатура.НоменклатурнаяГруппа), (Номенклатура.НоменклатурнаяГруппа.Поставщик), (Номенклатура.ОсновнойПоставщик), (Номенклатура.Закрыт), (Номенклатура.Распродажа)}) КАК Движения

СГРУППИРОВАТЬ ПО
    Движения.Номенклатура,
    ДНИ.Период,
    Движения.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втБезЦены.Номенклатура,
    втБезЦены.ПериодОстатки,
    втБезЦены.КоличествоКонечныйОстаток,
    втБезЦены.Склад,
    ЦеныНоменклатуры.Валюта,
    ЦеныНоменклатуры.Цена,
    ЦеныНоменклатуры.ЕдиницаИзмерения,
    втБезЦены.КоличествоКонечныйОстаток * втБезЦены.Номенклатура.ЕдиницаХраненияОстатков.Литраж КАК Литраж
ПОМЕСТИТЬ ОстаткиИЦены
ИЗ
    втБезЦены КАК втБезЦены
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО (ЦеныНоменклатуры.ТипЦен.Код = "А00000004")
            И втБезЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    ЦеныНоменклатуры.Период КАК Период
                ИЗ
                    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                ГДЕ
                    ЦеныНоменклатуры.ТипЦен.Код = "А00000004"
                    И ЦеныНоменклатуры.Период <= КОНЕЦПЕРИОДА(втБезЦены.ПериодОстатки, ДЕНЬ)
                    И ЦеныНоменклатуры.Номенклатура = втБезЦены.Номенклатура
                УПОРЯДОЧИТЬ ПО
                    Период УБЫВ))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОстаткиИЦены.Номенклатура,
    ОстаткиИЦены.ПериодОстатки,
    ОстаткиИЦены.КоличествоКонечныйОстаток,
    ОстаткиИЦены.Склад,
    ОстаткиИЦены.Цена * ОстаткиИЦены.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ОстаткиИЦены.ЕдиницаИзмерения.Коэффициент * (КурсыВалют.Курс / КурсыВалют.Кратность) * 1 КАК ПересчитаннаяЦена,
    ОстаткиИЦены.Литраж
ПОМЕСТИТЬ Итоговая
ИЗ
    ОстаткиИЦены КАК ОстаткиИЦены
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ОстаткиИЦены.Валюта = КурсыВалют.Валюта
            И (КурсыВалют.ВалютаКотировки.Код = "978")
            И (КурсыВалют.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    КурсыВалют.Период КАК Период
                ИЗ
                    РегистрСведений.КурсыВалют КАК КурсыВалют
                ГДЕ
                    КурсыВалют.ВалютаКотировки.Код = "978"
                    И КурсыВалют.Валюта = ОстаткиИЦены.Валюта
                    И КурсыВалют.Период <= КОНЕЦПЕРИОДА(ОстаткиИЦены.ПериодОстатки, ДЕНЬ)
                УПОРЯДОЧИТЬ ПО
                    Период УБЫВ))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Итоговая.Номенклатура,
    Итоговая.ПериодОстатки КАК Дата_,
    Итоговая.КоличествоКонечныйОстаток КАК КоличествоОстаток,
    Итоговая.Склад,
    Итоговая.ПересчитаннаяЦена,
    Итоговая.ПересчитаннаяЦена * Итоговая.КоличествоКонечныйОстаток КАК Стоимость,
    Итоговая.Литраж,
    СкладыОрганизаций.Организация КАК ОрганизацияСкладов
ИЗ
    Итоговая КАК Итоговая
        ЛЕВОЕ СОЕДИНЕНИЕ СкладыОрганизаций КАК СкладыОрганизаций
        ПО Итоговая.Склад = СкладыОрганизаций.Склад
2 serg-lom89
 
01.09.16
16:54
как можно ускорить ?
3 Джинн
 
01.09.16
16:56
Что это вообще такое? С мистовским интеллектуальным форматирование это вообще набор букв.
4 aleks_default
 
01.09.16
17:00
(0)Ты хоть связь с таблицей дней пропиши, а то все в куче имени одного знака зодиака
5 serg-lom89
 
01.09.16
17:00
запрос который вибирает остатки на каждую дату,потом берет цены по указанному типу цен и пересчитывает в валюту
6 Горогуля
 
01.09.16
17:00
есть такое слово: этоги периодами
7 serg-lom89
 
01.09.16
17:02
затем его в скд,и вывожу
8 serg-lom89
 
01.09.16
17:03
(7) когда еще отбор ладно ,более менее ,но например за месяц по одному складу что то долго все это
9 vicof
 
01.09.16
17:03
(7) в суд это проще делается
10 vicof
 
01.09.16
17:03
(9) скд
11 serg-lom89
 
01.09.16
17:06
(10) как?через несколько наборов данных?
12 serg-lom89
 
01.09.16
17:07
(10) или есть способ проще.буду признателен за инфу)
13 serg-lom89
 
01.09.16
17:12
(10) если и быстрее то просто класс)
14 Горогуля
 
01.09.16
17:15
тебе строку для гугления дать или ссылку из результата?
15 hhhh
 
01.09.16
17:35
(11) нет, просто копипастишь свой запрос, но без этих объединить. и группировке у твоего поля Дата_ пусть юзер потом ставит: период дополнения день. или период дополнения год. Ну как он захочет.
16 serg-lom89
 
01.09.16
19:40
(14) любое одно из двух)
17 serg-lom89
 
01.09.16
19:43
(15) группировка по ном, складу, и дата_ -это разве так много времени забирает?
18 mistеr
 
01.09.16
19:54
(17) Время забирает генерация таблицы из 100500 дат, из которых потом нужен только месяц. Ну и цены на каждый день, как-то нестандартно они берутся.

И номенклатуру собери в ВТ предварительно.
19 Горогуля
 
01.09.16
19:57
(16) 1с скд итоги периодами
20 serg-lom89
 
01.09.16
20:01
(18) завтра замерю время производительности таб дат.,и ее преобразование на (конец периода,день)  но думаю оно минимальное
21 mistеr
 
01.09.16
20:04
(20) А что, календаря нет в конфе? Зачем такие извращения?
22 serg-lom89
 
01.09.16
20:05
нету(21) ,если Вы про регистр сведений с датами
23 serg-lom89
 
01.09.16
20:08
(18) а стандартно как, получить максимальные даты, и по этим датам соединить
24 mistеr
 
01.09.16
22:30
(23) Да, получить период действия записей (Период и Период следующей записи) и по ним соединять.
25 serg-lom89
 
02.09.16
16:31
(21) ну сделала я РС ,заполнил их датами,производительность не взлетела.может чуток.но не заметно сильно
26 serg-lom89
 
02.09.16
17:16
сформировал 2 запроса.
1 запрос(это старый что в ветке) показал 7 секунд
2 сгрупировал ,выбрал максимальную дату и соединил с остатками показал 10с.
27 serg-lom89
 
02.09.16
17:17
текстЗапроса 2-го


ВЫБРАТЬ
    ПринадлежностьСкладовСрезПоследних.Склад,
    ПринадлежностьСкладовСрезПоследних.Организация
ПОМЕСТИТЬ СкладыОрганизаций
ИЗ
    РегистрСведений.ПринадлежностьСкладов.СрезПоследних(&КонецПериода, Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный)) КАК ПринадлежностьСкладовСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаДат.ДатаДень
ПОМЕСТИТЬ ТЗ_Дат
ИЗ
    РегистрСведений.ТаблицаДат КАК ТаблицаДат
ГДЕ
    ТаблицаДат.ДатаДень МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ТЗ_Дат.ДатаДень, ДЕНЬ) КАК Период
ПОМЕСТИТЬ Дни
ИЗ
    ТЗ_Дат КАК ТЗ_Дат

СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(ТЗ_Дат.ДатаДень, ДЕНЬ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Движения.Номенклатура КАК Номенклатура,
    ДНИ.Период КАК ПериодОстатки,
    ВЫБОР
        КОГДА Движения.Период = &НачалоПериода
            ТОГДА Движения.КоличествоКонечныйОстаток
        ИНАЧЕ ВЫБОР
                КОГДА Движения.Период <= ДНИ.Период
                    ТОГДА Движения.КоличествоОборот
                ИНАЧЕ 0
            КОНЕЦ
    КОНЕЦ КАК КоличествоКонечныйОстаток,
    Движения.Склад КАК Склад
ПОМЕСТИТЬ втБезЦены
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
            &НачалоПериода,
            &КонецПериода,
            ДЕНЬ,
            ,
            Склад.ТипСклада <> ЗНАЧЕНИЕ(перечисление.типыСкладов.виртуальный)
                И склад.код = "0001"
                И Номенклатура.основнойПоставщик.код = "АСП00016" {(Склад), (Номенклатура), (Номенклатура.НоменклатурнаяГруппа), (Номенклатура.НоменклатурнаяГруппа.Поставщик), (Номенклатура.ОсновнойПоставщик), (Номенклатура.Закрыт), (Номенклатура.Распродажа)}) КАК Движения,
    Дни КАК ДНИ

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Склад,
    ПериодОстатки
;

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

СГРУППИРОВАТЬ ПО
    втБезЦены.Номенклатура,
    втБезЦены.ПериодОстатки,
    втБезЦены.КоличествоКонечныйОстаток,
    втБезЦены.Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТабМакДатЦен.Номенклатура,
    ТабМакДатЦен.ПериодОстатки,
    ТабМакДатЦен.КоличествоКонечныйОстаток,
    ТабМакДатЦен.Склад,
    ЦеныНоменклатуры.Цена
ИЗ
    ТабМакДатЦен КАК ТабМакДатЦен
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ТабМакДатЦен.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ТабМакДатЦен.Период = ЦеныНоменклатуры.Период
            И (ЦеныНоменклатуры.ТипЦен.Код = "А00000004")
28 serg-lom89
 
02.09.16
17:17
как сделать что бы еще быстрее было?
29 serg-lom89
 
02.09.16
17:18
остатки аз год,по одному складу выбирала 2,5 минуты примерно
30 serg-lom89
 
02.09.16
17:18
(26) это без пересчета в валюту ,и одинаковыми отборами
31 Горогуля
 
02.09.16
17:19
(29) слабак. мой личный рекорд запроса 1223 секунды
32 Горогуля
 
02.09.16
17:20
поизбавляйся от точек что ли...
Склад.ТипСклада
ЦеныНоменклатуры.ТипЦен.Код = "А00000004" - вообще застрелить
и всё в таком духе
33 mistеr
 
02.09.16
19:41
(25) (26) (29) У вас с женой один аккаунт на двоих? Или все намного хуже?..
34 serg-lom89
 
05.09.16
11:36
(33) не...все ок)))хотя могло бы быть намного хуже)