Имя: Пароль:
1C
1С v8
оптимизировать запрос
0 vip67
 
02.01.14
11:46
Всем привет! с Новым Годом! и новыми успехами!
... и проблемами....
Есть запрос:
ВЫБРАТЬ
    СуммаДт.Счет,
    СуммаДт.Субконто1,
    СуммаДт.СуммаОстатокДт,
    ДатаДт.Период КАК ДатаДолга,
    СуммаДт.Субконто2,
    СуммаДт.Субконто3,
    ВЫБОР
        КОГДА СуммаДт.Счет В ИЕРАРХИИ (&СчетПТУ)
            ТОГДА СуммаДт.Субконто2.КвоДнейПоставки
        ИНАЧЕ СуммаДт.Субконто2.КвоДнейПлатежа
    КОНЕЦ КАК КвоДнейПросрочки
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &КонПериода,
            Счет В ИЕРАРХИИ (&СчетПТУ)
                ИЛИ Счет В ИЕРАРХИИ (&СчетРТУ),
            ,
            ) КАК СуммаДт
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
            ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Субконто1,
            ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Субконто2,
            ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Субконто3,
            МАКСИМУМ(ХозрасчетныйОстаткиИОбороты.Период) КАК Период
        ИЗ
            РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
                    ,
                    &КонПериода,
                    Регистратор,
                    ,
                    Счет В ИЕРАРХИИ (&СчетПТУ)
                        ИЛИ Счет В ИЕРАРХИИ (&СчетРТУ),
                    ,
                    ) КАК ХозрасчетныйОстаткиИОбороты
        ГДЕ
            ХозрасчетныйОстаткиИОбороты.Субконто1 = &Контрагент
            И НЕ ХозрасчетныйОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
            И ВЫБОР
                    КОГДА ХозрасчетныйОстаткиИОбороты.Счет В ИЕРАРХИИ (&СчетПТУ)
                        ТОГДА НЕ ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
                    ИНАЧЕ НЕ ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее
                КОНЕЦ
        
        СГРУППИРОВАТЬ ПО
            ХозрасчетныйОстаткиИОбороты.Счет,
            ХозрасчетныйОстаткиИОбороты.Субконто1,
            ХозрасчетныйОстаткиИОбороты.Субконто2,
            ХозрасчетныйОстаткиИОбороты.Субконто3) КАК ДатаДт
        ПО СуммаДт.Счет = ДатаДт.Счет
            И СуммаДт.Субконто1 = ДатаДт.Субконто1
            И СуммаДт.Субконто2 = ДатаДт.Субконто2
            И СуммаДт.Субконто3 = ДатаДт.Субконто3
ГДЕ
    СуммаДт.Субконто1 = &Контрагент
    И СуммаДт.СуммаОстатокДт > 0

этот запрос отрабатывает в течении 7-9 сек. Так как к нему нужно обращаться многократно,  в итоге отчет может формироваться в течении десятков минут.
Цель запроса - возвращает дату возникновения долга и сумму долга - для расчета просроченной задолженности по условиям договора (условия отрабатываются позже.
Как можно оптимизировать запрос, чтобы уменьшить время выполения (хотя бы до секунды)?
1 alex7six
 
02.01.14
12:23
1. Условие из ГДЕ по контрагенты перенеси в параметры вирт. таблицы.
2.  "Счет В ИЕРАРХИИ" замени на список счетов.
3. Внутреннее соединение делай не с вложенным запросом, а с временной таблицей.
4. Используй Выразить когда обращаешься к реквизитам субконто.
5. В параметры вирт. таблицу добавь по возможности отбор по массиву субконто.
2 ИсчадиеADO
 
02.01.14
12:25
(1) опередил :)
1) "Так как к нему нужно обращаться многократно" - попытаться написать алгоритм так, чтобы за 1 раз вытащить
2) Счет В ИЕРАРХИИ (&СчетПТУ)
ИЛИ Счет В ИЕРАРХИИ (&СчетРТУ)
заменить на временную таблицу. Эту временную таблицу можно оставить в менеджере временных таблиц, итого она будет формироваться 1 раз
3 vip67
 
02.01.14
13:01
спасибо! в качестве параметра счетПТУ и счет РТУ я уже передаю массив счетов.
передалеать алгоритм чтобы обращаться один раз - уже такая мысль была, потому как что 1 запись, что 10 формируются в запросе примерно за одно и то-же время .