|
Помогите оптимизировать запрос | ☑ | ||
---|---|---|---|---|
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) Ну так возьми запрос который я набросал получишь движения, соедини с субконто ( договора ) получишь по какому договору движение ( или вытащи в ВТ_Регистраторы в выборку Значение КАК Договор ). Далее найдёшь максимальную дату по договору и из массива отберёшь последнее движение по договору. Это будет максимально быстро.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |