|   |   | 
| 
 | 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 = "+текКонтрагент+" | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |