Имя: Пароль:
1C
1C 7.7
v7: 1с++ и периодические реквизиты.
,
0 Skom
 
17.04.14
12:26
Имеем:
СправочникА: Наименование, Контрагент (периодический) + другие поля
СправочникБ: Наименование, Контрагент (периодический) + другие поля

СправочникБ подчинен справочнику А.

Необходимо выбрать все элементы из СправочникБ, где Контрагент = СправочникБ.Контрагент на текущую + !!!Внимание!!!
Выбрать все элементы из СправочникБ, где Контрагент = пустое значение, но контрагент у родителя = исходному контрагенту.

У меня лично получается очень долгий запрос.

Всего в справочнике 500000 элементов.
1 Skom
 
17.04.14
12:27
сейчас примерный текст запроса прриведу
2 Skom
 
17.04.14
12:33
|    SELECT
        |        ОЦВодила.ParentExt as ОЦПредприятие,
        |        ОЦВодила.ID as ИД,
        |        $ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),'     0   ') as Контрагент
        |    FROM
        |        $Справочник.ОЦВодила as ОЦВодила (NoLock)
        |    WHERE
        |        $ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата) = "+текКонтрагент+"
        |                
        |    UNION ALL
        |    
        |    SELECT
        |        ОЦВодила2.ParentExt as ОЦПредприятие,
        |        ОЦВодила2.ID as ИД,
        |        isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила2.ID,:ВыбДата),'     0   ') as Контрагент
        |    FROM $Справочник.ОЦВодила as ОЦВодила2 (NoLock)
        |    WHERE
        |        isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила2.ID,:ВыбДата),'     0   ') = "+текКонтрагент+")
        |        And ОЦВодила2.ParentExt IN
        |                            (
        |                                Select
        |                                    ОЦПредприятия.ID
        |                                From
        |                                    $Справочник.ОЦПредприятия as ОЦПредприятия (NoLock)
        |                                WHERE
        |                                    $ПоследнееЗначение.ОЦПредприятия.Контрагент(ОЦПредприятия.ID,:ВыбДата) = "+текКонтрагент
        |                                    )
3 Maxus43
 
17.04.14
12:33
это клюшки же, переношу
4 Skom
 
17.04.14
12:34
ага. перенеси плиз, не обратил внимания на секцию
5 Skom
 
17.04.14
12:34
ОЦВодила - это справочникБ
ОЦПредприятия - СправочникА
6 Skom
 
17.04.14
12:35
в общем, такая реализация запроса выполняется довольно долго.
7 ТогдаКонецЕсли
 
17.04.14
12:47
посмотри отдельно - сколько выполняется первый запрос, до union all, и второй.

Вообще то есть хранимые процедуры, получающие значение периодического реквизита на дату. Тогда все вообще упрощается.
8 Ёпрст
 
17.04.14
12:47
нет сравнения на пустого контрагента во втором запросе
9 КонецЦикла
 
17.04.14
12:50
Называй нормально, что значит "ОЦВодила2"?
10 Skom
 
17.04.14
12:54
(8) не совсем понял
11 Ёпрст
 
17.04.14
12:55
(10)
>>>>Выбрать все элементы из СправочникБ, где Контрагент = !!!!!!!пустое значение!!!!!!!!!, но контрагент у родителя = исходному контрагенту
12 Skom
 
17.04.14
12:55
(9) то же самое что и ОЦВОдила просто. второй запрос просто.
13 Skom
 
17.04.14
13:01
вот этот вариант выполняется 10 сек. но для табличного поля не подходит(

|    SELECT --TOP 10000
        |        ОЦВодила.ParentExt as ОЦПредприятие,
        |        ОЦВодила.ID as ИД,
        |    CASE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+")
        |        WHEN "+ПустойИД9+" THEN isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ParentExt,:ВыбДата),"+ПустойИД9+")
        |        ELSE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+")
        |        END as Контрагент
        |    FROM
        |        $Справочник.ОЦВодила as ОЦВодила (NoLock)
        |    WHERE
        |        CASE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+")
        |        WHEN "+ПустойИД9+" THEN isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ParentExt,:ВыбДата),"+ПустойИД9+")
        |        ELSE isnull($ПоследнееЗначение.ОЦВодила.Контрагент(ОЦВодила.ID,:ВыбДата),"+ПустойИД9+")
        |        END = "+текКонтрагент+"
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший