Имя: Пароль:
1C
1С v8
оптимизировать время выполнения запроса - как?
,
0 altaykniga
 
26.10.18
16:37
добрый вечер, уважаемые специалисты. Прошу подсказать, как оптимизировать время выполнения запроса.

в запросе получаю контрагентов с дебиторской задолженностью на определенную дату. Вот поля запроса:
|запр0.Контрагент КАК Контрагент,
|запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт,
|запр0.Договор КАК Договор

Нужно сюда еще прикрутить дату последней операции.
т.е. через левоеСоединение обратиться к РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт.

написал тект запроса для одного контрагента и договора (передаются параметрами в запрос). А как приведенный ниже запрос прикрутить к запросу выше - непонятно мне

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

Заранее благодарю за помощь!
1 altaykniga
 
29.10.18
13:28
поднимаю.

если мой запрос написан некорректно, прошу подсказать, как составить текст запроса для получения даты последнего движения по регистру бухгалтерии с отбором: контрагент, договор, списокСчетов.
2 catena
 
29.10.18
13:31
(1)Левое соединение, максимум(период)
3 RomanYS
 
29.10.18
13:32
(0)
1. зачем ОборотыДтКт, есть просто Обороты
2. обязательно(для норм. производительности) указание параметра ВТ вид субконто
4 RomanYS
 
29.10.18
13:33
*(3)
после выполнения п.1 условие на счет уйдет в параметры ВТ
5 VS-1976
 
29.10.18
13:42
(3) Зачем обороты, когда есть физическая таблица РегистрБухгалтерии.Управленческий.Субконто? Всё равно брать лишь дату...
6 VS-1976
 
29.10.18
14:01
(0) В общем пожалел тебя малость. Лови запрос

ВЫБРАТЬ
    запр0.Контрагент КАК Контрагент,
    запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт,
    запр0.Договор КАК Договор,
    тзПоследнееДвижениеПоДоговору.Период КАК ПоследнееДвижение
ИЗ
    ...

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

    ) КАК тзПоследнееДвижениеПоДоговору
        ПО Истина
7 VS-1976
 
29.10.18
14:03
(6) Там немного не додумал...

ЕСТЬNULL( тзПоследнееДвижениеПоДоговору.Период, ДАТАВРЕМЯ( 1,1,1 ) ) КАК ПоследнееДвижение
8 RomanYS
 
29.10.18
14:15
(5) там нет счетов, придется соединять ещё физ. таблицей РБ. Не факт, что будет лучше ВТ с правильно заданными параметрами
9 altaykniga
 
29.10.18
14:29
(8) в (6) есть отбор в таблице рбОбороты
10 altaykniga
 
29.10.18
14:29
(6) при формировании запроса выходит ошибка:

"Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
тзСубконто.Период <<?>>МЕЖДУ &ДатаНачала И &ДатаОстатков"
11 VS-1976
 
29.10.18
14:31
(10) Ну а что ты а эти параметры пихаешь то? Там должны быть 2 даты. 1-я начала просмотра оборотов и 2-я дата формирования остатка. Эти даты не должны быть пустыми
12 altaykniga
 
29.10.18
14:36
(11) в этих параметрах у меня 2 границы
13 VS-1976
 
29.10.18
14:37
(8) Будет в любом случае лучше. Так как в ВТ в начале идёт соединение, а потом фильтрация. А у меня фильтрация и уменьшенное соединение, а потом небольшая фильтрация
14 altaykniga
 
29.10.18
14:37
ГраницаНачала = Новый Граница(НачалоДня(ЭтотОбъект.ДатаНачала), ВидГраницы.Включая);

ГраницаКонца = Новый Граница(КонецДня(ЭтотОбъект.ДатаОтчета), ВидГраницы.Включая);
15 VS-1976
 
29.10.18
14:37
(12) Дату предавай, а не границы
16 VS-1976
 
29.10.18
14:40
(14) ГДЕ
        тзСубконто.Период МЕЖДУ НАЧАЛОПЕРИОДА( &ДатаНачала, День ) И КОНЕЦПЕРИОДА( &ДатаОстатков, День )

Если не хочешь на клиенте время контралировать
17 VS-1976
 
29.10.18
14:41
(16) контролировать
18 Вафель
 
29.10.18
14:45
вместо ИЛИ сделать ОБЪЕДИНИТЬ ВСЕ
19 Вафель
 
29.10.18
14:46
да и вообще тут лучше к физ. таблице обращаться
20 VS-1976
 
29.10.18
14:49
(18) ИЛИ будет лучше, чем ещё раз отбирать. Там IN будет небольшим, так как счетов не бесконечно. И будут небольшие циклы уже на отобранных данных. А ОБЪЕДИНИТЬ ВСЕ это хоть возможно и из кэша чтение ( если память MS SQL отдано много ), но всё же чтение...
21 Вафель
 
29.10.18
14:59
(20) тут или по разным полям
22 Вафель
 
29.10.18
14:59
основная цель попасть в индекс
23 VS-1976
 
29.10.18
15:05
(21) И?
рбОбороты.Регистратор = тзСубконто.Регистратор

Это соединение по индексу,
Далее

рбОбороты.Организация = &Организация

Фильтрует по организации на отобранной записи

Далее циклы

( рбОбороты.СчетДт IN ( Счет1, Счет2, ... СчетN )
Или рбОбороты.СчетКт IN ( Счет1, Счет2, ... СчетN ) )

IN на сколько я понимаю не использует индексы!!!

Я обычно пишу порядок в фильтре так, как оптимизатор скорее всего будет фильтровать и соединять...
24 VS-1976
 
29.10.18
15:06
(23) Фильтрует по организации на отобранной записи

На поднятом кортеже с таблицы ( физическое чтение ) не в индексе

А далее всё фильтруется уже просто...
25 altaykniga
 
29.10.18
15:13
(6) "И тзСубконто.Значение = &Договор"

в запрос не передается параметр "&Договор", если Левое соединение делать... Как здесь быть?
26 altaykniga
 
29.10.18
15:15
(25) Договор и Контрагент у нас в запр0. И вот к нему нужно через левое соединение прикрутить тзПоследнееДвижениеПоДоговору
27 VS-1976
 
29.10.18
15:48
(25) Договор выбирается где-то в виртуальную таблицу

ВЫБРАТЬ
  запр0.Контрагент КАК Контрагент,
  запр0.СуммаРазвернутыйОстатокДт КАК СуммаРазвернутыйОстатокДт
  запр0.Договор КАК Договор

ПОМЕСТИТЬ тзДанные

ИЗ
  ...
;

ВЫБРАТЬ

ИЗ
  тзДанные

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

    ) КАК тзПоследнееДвижениеПоДоговору
        ПО Истина

Если у тебя разумеется выбирается 1 договор, если нет, то напиши, там нужно запрос подправить немного...
28 VS-1976
 
29.10.18
15:49
(26) Договор подчинён контрагенту, по этому контрагент можно не использовать...
29 altaykniga
 
30.10.18
12:57
(28) VS-1976, прошу написать в личку [email protected]. Готов кинуть небольшую сумму рублей вам за помощь в написании запроса (так и не могу понять, что не так пишу в запросе)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.