Имя: Пароль:
1C
 
Помогите оптимизировать запрос
0 Borteg
 
25.02.16
16:41
Добрый день. Есть запрос, работает он 10-12 минут, хотелось бы его ускорить. Проблема  в условии, надо выбрать все движения с субконто где счетДт = 76 05,62 02 или счетКт = 76 05,62 02, но не проводка дт 7605 кт 6202.
Можно как то это условии оптимизировать?

(СчетДт В (&СчетаУчета)
        |                ИЛИ СчетКт В (&СчетаУчета))
        |                И ВЫБОР
        |                    КОГДА Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
        |                            ИЛИ Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        |                        ТОГДА СубконтоКт1 В
        |                                    (ВЫБРАТЬ
        |                                        СписокКонтрагентовСАвансами.Контрагент
        |                                    ИЗ
        |                                        СписокКонтрагентовСАвансами)
        |                                И СубконтоКт2 В
        |                                    (ВЫБРАТЬ
        |                                        СписокКонтрагентовСАвансами.Договор
        |                                    ИЗ
        |                                        СписокКонтрагентовСАвансами)
        |                    ИНАЧЕ СубконтоДт1 В
        |                                (ВЫБРАТЬ
        |                                    СписокКонтрагентовСАвансами.Контрагент
        |                                ИЗ
        |                                    СписокКонтрагентовСАвансами)
        |                            И СубконтоДт2 В
        |                                (ВЫБРАТЬ
        |                                    СписокКонтрагентовСАвансами.Договор
        |                                ИЗ
        |                                    СписокКонтрагентовСАвансами)
        |                КОНЕЦ
        |                И НЕ(СчетДт = &Счет7605
        |                        И СчетКт = &Счет6202),    



// Весь Запрос
МенеджерВТНовый = Новый МенеджерВременныхТаблиц;
        Запрос = Новый Запрос;
        Запрос.МенеджерВременныхТаблиц = МенеджерВТНовый;
        Запрос.Текст = "ВЫБРАТЬ
        |    СписокКонтрагентовСАвансами.Контрагент,
        |    СписокКонтрагентовСАвансами.Договор
        |ПОМЕСТИТЬ СписокКонтрагентовСАвансами
        |ИЗ
        |    &СписокКонтрагентовСАвансами КАК СписокКонтрагентовСАвансами";
        
        Запрос.УстановитьПараметр("СписокКонтрагентовСАвансами",ТаблицаСКонтрагентами);
        Запрос.Выполнить();
        
        Запрос = Новый Запрос;
        Запрос.МенеджерВременныхТаблиц = МенеджерВТНовый;
        Запрос.Текст = "ВЫБРАТЬ
        |    ХозрасчетныйДвиженияССубконто.Период КАК Период,
        |    ХозрасчетныйДвиженияССубконто.Регистратор КАК Регистратор,
        |    ВЫБОР
        |        КОГДА ХозрасчетныйДвиженияССубконто.Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
        |                ИЛИ ХозрасчетныйДвиженияССубконто.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        |            ТОГДА ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт1 КАК Справочник.Контрагенты)
        |        ИНАЧЕ ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоДт1 КАК Справочник.Контрагенты)
        |    КОНЕЦ КАК Контрагент,
        |    ВЫБОР
        |        КОГДА ХозрасчетныйДвиженияССубконто.Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
        |                ИЛИ ХозрасчетныйДвиженияССубконто.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        |            ТОГДА ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоКт2 КАК Справочник.ДоговорыКонтрагентов)
        |        ИНАЧЕ ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.СубконтоДт2 КАК Справочник.ДоговорыКонтрагентов)
        |    КОНЕЦ КАК Договор
        |ПОМЕСТИТЬ ПериодыВместеСРегистраторами
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
        |            &НачалоПериодаДО,
        |            &КонецПериодаДО,
        |            (СчетДт В (&СчетаУчета)
        |                ИЛИ СчетКт В (&СчетаУчета))
        |                И ВЫБОР
        |                    КОГДА Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
        |                            ИЛИ Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        |                        ТОГДА СубконтоКт1 В
        |                                    (ВЫБРАТЬ
        |                                        СписокКонтрагентовСАвансами.Контрагент
        |                                    ИЗ
        |                                        СписокКонтрагентовСАвансами)
        |                                И СубконтоКт2 В
        |                                    (ВЫБРАТЬ
        |                                        СписокКонтрагентовСАвансами.Договор
        |                                    ИЗ
        |                                        СписокКонтрагентовСАвансами)
        |                    ИНАЧЕ СубконтоДт1 В
        |                                (ВЫБРАТЬ
        |                                    СписокКонтрагентовСАвансами.Контрагент
        |                                ИЗ
        |                                    СписокКонтрагентовСАвансами)
        |                            И СубконтоДт2 В
        |                                (ВЫБРАТЬ
        |                                    СписокКонтрагентовСАвансами.Договор
        |                                ИЗ
        |                                    СписокКонтрагентовСАвансами)
        |                КОНЕЦ
        |                И НЕ(СчетДт = &Счет7605
        |                        И СчетКт = &Счет6202),
        |            ,
        |            ) КАК ХозрасчетныйДвиженияССубконто
        |
        |СГРУППИРОВАТЬ ПО
        |    ХозрасчетныйДвиженияССубконто.СубконтоКт1,
        |    ХозрасчетныйДвиженияССубконто.СубконтоДт1,
        |    ХозрасчетныйДвиженияССубконто.СубконтоКт2,
        |    ХозрасчетныйДвиженияССубконто.СубконтоДт2,
        |    ХозрасчетныйДвиженияССубконто.Период,
        |    ХозрасчетныйДвиженияССубконто.Регистратор
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    МАКСИМУМ(ПериодыВместеСРегистраторами.Период) КАК Период,
        |    ПериодыВместеСРегистраторами.Контрагент КАК Контрагент,
        |    ПериодыВместеСРегистраторами.Договор КАК Договор
        |ПОМЕСТИТЬ МаксимальныеДаты
        |ИЗ
        |    ПериодыВместеСРегистраторами КАК ПериодыВместеСРегистраторами
        |
        |СГРУППИРОВАТЬ ПО
        |    ПериодыВместеСРегистраторами.Контрагент,
        |    ПериодыВместеСРегистраторами.Договор
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    МаксимальныеДаты.Период КАК ДатаОперации,
        |    МаксимальныеДаты.Контрагент КАК Контрагент,
        |    МаксимальныеДаты.Договор,
        |    МАКСИМУМ(ПериодыВместеСРегистраторами.Регистратор) КАК Операция,
        |    КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(МаксимальныеДаты.Период, МЕСЯЦ, 36), КВАРТАЛ) КАК ДатаЗакрытия,
        |    МаксимальныеДаты.Контрагент.КодАгента КАК КодАгента
        |ИЗ
        |    МаксимальныеДаты КАК МаксимальныеДаты
        |        ЛЕВОЕ СОЕДИНЕНИЕ ПериодыВместеСРегистраторами КАК ПериодыВместеСРегистраторами
        |        ПО МаксимальныеДаты.Период = ПериодыВместеСРегистраторами.Период
        |            И МаксимальныеДаты.Контрагент = ПериодыВместеСРегистраторами.Контрагент
        |
        |СГРУППИРОВАТЬ ПО
        |    МаксимальныеДаты.Период,
        |    МаксимальныеДаты.Контрагент,
        |    МаксимальныеДаты.Контрагент.КодАгента,
        |    МаксимальныеДаты.Договор
        |
        |УПОРЯДОЧИТЬ ПО
        |    ДатаЗакрытия,
        |    МаксимальныеДаты.Контрагент.Наименование";
1 Fragster
 
гуру
25.02.16
17:03
выкинь ВЫБОР
        |                    КОГДА Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
        |                            ИЛИ Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        |                        ТОГДА СубконтоКт1 В
        |                                    (ВЫБРАТЬ
        |                                        СписокКонтрагентовСАвансами.Контрагент
        |                                    ИЗ
        |                                        СписокКонтрагентовСАвансами)
        |                                И СубконтоКт2 В
        |                                    (ВЫБРАТЬ
        |                                        СписокКонтрагентовСАвансами.Договор
        |                                    ИЗ
        |                                        СписокКонтрагентовСАвансами)
        |                    ИНАЧЕ СубконтоДт1 В
        |                                (ВЫБРАТЬ
        |                                    СписокКонтрагентовСАвансами.Контрагент
        |                                ИЗ
        |                                    СписокКонтрагентовСАвансами)
        |                            И СубконтоДт2 В
        |                                (ВЫБРАТЬ
        |                                    СписокКонтрагентовСАвансами.Договор
        |                                ИЗ
        |                                    СписокКонтрагентовСАвансами)
        |                КОНЕЦ
2 viktor_vv
 
25.02.16
17:05
И по озвученным условиям по счетам, у тебя все сводится к проводке Сч Дт 62.02 Кт 76.05
3 viktor_vv
 
25.02.16
17:06
(2) + А не, протупил я.
4 Borteg
 
25.02.16
17:11
(1) это условие выборку режет,проверяет не по всем контрагентам и договорам,а намного меньше, или такое условие усложняет план запроса и проще посмотреть по всем, а потом убрать ненужных?
5 mehfk
 
25.02.16
17:11
Почему используется именно виртуальная таблица ДвиженияССубконто?
6 Borteg
 
25.02.16
17:12
(5) (СчетДт В (&СчетаУчета)
                   ИЛИ СчетКт В (&СчетаУчета))
подобное условие только в этой таблице можно сделать, в других таблицах будет условие И
7 hhhh
 
25.02.16
17:41
(6) в общем наоборот задача отказаться от ИЛИ.
8 Fragster
 
гуру
25.02.16
17:51
а что мы вообще запросом ищем? последние регистраторы по счету?
9 ViSo76
 
25.02.16
17:52
Я накидаю пример ( не проверял тут только идея )
дальше ты соединишь движения с субконто и получишь свой результат

ВЫБРАТЬ
    тзДвижения.*
ИЗ
    ( ВЫБРАТЬ РАЗЛИЧНЫЕ
        Регистратор
    ИЗ
        СписокКонтрагентовСАвансами

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Субконто
            ПО Период МЕЖДУ &НачалоПериодаДО И &КонецПериодаДО
             И ( Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
                ИЛИ Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг )
             И ВидДвижения = ЗНАЧЕНИЕ( ПланВидовХарактеристик.ВидыСубконтоУправленческие.Договоры )
             И Значение = СписокКонтрагентовСАвансами.Договор

    ) КАК ВТ_Регистраторы

    СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий КАК тзДвижения
        ПО тзДвижения.Регистратор = ВТ_Регистраторы.Регистратор
         И ( СчетДт В ( &СчетаУчета ) Или СчетКт В ( &СчетаУчета ) )
         И Не ( СчетДт = &Счет7605 И СчетКт СчетКт = &Счет6202 )
10 ViSo76
 
25.02.16
17:55
Да соединение должно быть внетренним с РегистрБухгалтерии.Управленческий.Субконто
11 ViSo76
 
25.02.16
17:56
ВЫБРАТЬ
    тзДвижения.*
ИЗ
    ( ВЫБРАТЬ РАЗЛИЧНЫЕ
        Регистратор
    ИЗ
        СписокКонтрагентовСАвансами

        СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Субконто
            ПО Период МЕЖДУ &НачалоПериодаДО И &КонецПериодаДО
             И ( Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
                ИЛИ Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг )
             И ВидДвижения = ЗНАЧЕНИЕ( ПланВидовХарактеристик.ВидыСубконтоУправленческие.Договоры )
             И Значение = СписокКонтрагентовСАвансами.Договор

    ) КАК ВТ_Регистраторы

    СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий КАК тзДвижения
        ПО тзДвижения.Регистратор = ВТ_Регистраторы.Регистратор
         И ( СчетДт В ( &СчетаУчета ) Или СчетКт В ( &СчетаУчета ) )
         И Не ( СчетДт = &Счет7605 И СчетКт СчетКт = &Счет6202 )
12 malem13
 
25.02.16
18:05
В любом случае из большой таблицы для начала имеет смысл взять максимально простые условия, отсекающие примерно нужные данные.
Для начала взять данные из
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
            &НачалоПериодаДО,
            &КонецПериодаДО,
            (СчетДт В (&СчетаУчета)
                ИЛИ СчетКт В (&СчетаУчета))
                И НЕ(СчетДт = &Счет7605
                        И СчетКт = &Счет6202)
потом данные фильтровать можно левым соединением с таблицей
СписокКонтрагентовСАвансами
13 Borteg
 
26.02.16
12:04
(8) да это последний регистратор по счетам, не учитываю начисления авансов (дт 76 05, кт 62 02).
14 Borteg
 
26.02.16
12:34
(12) запрос выполняется в разы дольше без условия по субконто, а потом еще соединение
15 Borteg
 
26.02.16
12:34
(7) попробую через объединение, надо тестировать
16 ViSo76
 
26.02.16
13:25
(13) Тебе нужно выбрать последние движения по договорам за период с учётом проводок?
17 Borteg
 
26.02.16
13:41
(16) 1 последнее движение(Регистратор), по определенным договорам, но это движение не должно быть 76 05 - 62 02.
18 Borteg
 
26.02.16
13:42
(16) последнюю операцию по договору
19 ViSo76
 
26.02.16
14:27
(18) Ну так возьми запрос который я набросал получишь движения, соедини с субконто ( договора ) получишь по какому договору движение ( или вытащи в ВТ_Регистраторы в выборку Значение КАК Договор ). Далее найдёшь максимальную дату по договору и из массива отберёшь последнее движение по договору. Это будет максимально быстро.
Закон Брукера: Даже маленькая практика стоит большой теории.