Имя: Пароль:
1C
1С v8
Помогите ускорить запрос
0 Bodrug
 
22.04.16
12:05
Добрый день, колеги! Запрос в таком виде работает около 10-15 сек, используется в формировании отчета большое количество раз. Из-за этого отчет формируется оооочень долго. Нужна Ваша помощь в оптимизации.

ВЫБРАТЬ ПЕРВЫЕ 1
                              |    ХозрасчетныйДвиженияССубконто.Регистратор.Дата КАК РегистраторДата
                              |ИЗ
                              |    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, &НачДата, , , ) КАК ХозрасчетныйДвиженияССубконто
                              |ГДЕ
                              |    (ХозрасчетныйДвиженияССубконто.СчетКт = &СчетКт
                              |                И ХозрасчетныйДвиженияССубконто.СубконтоКт1 = &СубконтоКт1
                              |            ИЛИ ХозрасчетныйДвиженияССубконто.СчетДт = &СчетКт
                              |                И ХозрасчетныйДвиженияССубконто.СубконтоДт1 = &СубконтоКт1)
                              |    И ТИПЗНАЧЕНИЯ(ХозрасчетныйДвиженияССубконто.Регистратор) <> ТИП(Документ.ОперацияБух)
                              |    И ТИПЗНАЧЕНИЯ(ХозрасчетныйДвиженияССубконто.Регистратор) <> ТИП(Документ.ЗакрытиеМесяца)
                              |
                              |УПОРЯДОЧИТЬ ПО
                              |    РегистраторДата УБЫВ
1 mehfk
 
22.04.16
12:06
2 aleks_default
 
22.04.16
12:08
"используется в формировании отчета большое количество раз" - не использовать запрос в цикле
3 Bodrug
 
22.04.16
12:11
(2) приходится, т.к. циклом перебирается таблица значений и по каждой строке нужно находить дату последнего движения по регистру в разрезе контрагента (субконто)
4 cons74
 
22.04.16
12:16
(3) так не делают. Делают так: тз загоняют в запрос как ВТ (параметр)и левое соединение.
Да еще и "РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(, &НачДата, , , )" - это вообще "песня" - обращение к виртуальной таблице без параметров-отборов. Мда. Верную книжку порекомендовали выше.
Ну или курс хоть того же Чистова (с тырнета бесплатный, если денег жалко) - а лучше новый платный (хоть от кого).
6 Локи-13
 
22.04.16
12:18
а так не стоит использовать конструкцию                              
ТИПЗНАЧЕНИЯ(ХозрасчетныйДвиженияССубконто.Регистратор) <> ТИП(Документ.ОперацияБух)
                              |    И ТИПЗНАЧЕНИЯ(ХозрасчетныйДвиженияССубконто.Регистратор) <> ТИП(Документ.ЗакрытиеМесяца)

изменить ее на "равно"
7 asady
 
22.04.16
12:23
(0) а конфа какая?
8 mexanik_96
 
22.04.16
12:32
дак а зачем ХозрасчетныйДвиженияССубконто если только дата по регистратору?
и  "И не ТИПЗНАЧЕНИЯ(ХозрасчетныйДвиженияССубконто.Регистратор) в (искл типы)"
9 RomanYS
 
22.04.16
12:43
ХозрасчетныйДвиженияССубконто.Регистратор.Дата
на порядок медленнее чем
ХозрасчетныйДвиженияССубконто.Период

Но главная проблема в (3), запроса в цикле быть не должно
10 Dmitrii
 
гуру
22.04.16
12:53
(0) Дарю:
ВЫБРАТЬ ПЕРВЫЕ 1
   ХозрасчетныйСубконто.Регистратор
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХозрасчетныйСубконто
ГДЕ
   ХозрасчетныйСубконто.Значение = &СубконтоКт1
   И ХозрасчетныйСубконто.Период <= &НачДата
   И НЕ ХозрасчетныйСубконто.Регистратор ССЫЛКА Документ.ОперацияБух
   И НЕ ХозрасчетныйСубконто.Регистратор ССЫЛКА Документ.ЗакрытиеМесяца
УПОРЯДОЧИТЬ ПО
   ХозрасчетныйСубконто.Период УБЫВ

Можно topt воткнуть условие на вид субконто (поле Вид).
11 Dmitrii
 
гуру
22.04.16
12:55
+ к (10) Но соглащусь с остальными по поводу запроса в цикле. Это идиотизм и главная причина тормозов.
12 Dmitrii
 
гуру
22.04.16
12:58
(3) >> нужно находить дату последнего движения по регистру в разрезе контрагента

За неправильный выбор нужных виртуальных таблиц на экзамене 1С Специалист ставят сразу незачет.

Поставленная задача решается обращение к реальной(!) таблице Субконто, а не к виртуальной таблице ДвиженияССубконто. См. (10)
13 Dmitrii
 
гуру
22.04.16
13:00
+ к (10) только выбирать не Регистратор, а Период.

За выбор Регистратор.Дата тоже надо бы расстреливать.
14 Serginio1
 
22.04.16
13:12
15 ViSo76
 
22.04.16
13:36
Как минимум можно подправить так:

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

УПОРЯДОЧИТЬ ПО
    РегистраторДата УБЫВ
16 RomanYS
 
22.04.16
13:36
(12) в целом соглашусь, но в данном случае придется соединять таблицу движений (фильтр на Счета) с ДВУМЯ таблицами субконто: по Дт и по Кт.
17 RomanYS
 
22.04.16
13:38
*(16) две таблицы субконто отменяются, "ИЛИ" я не заметил.
18 ViSo76
 
22.04.16
13:39
(15) Даже пожалуй так:

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

УПОРЯДОЧИТЬ ПО
    РегистраторДата УБЫВ
19 ViSo76
 
22.04.16
13:39
(18) Ошибочка в строке:

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