Имя: Пароль:
1C
1С v8
Хитрый запрос динамического списка. Может, можно оптимальнее?
, ,
0 fisher
 
03.07.15
15:37
Суть. На основании одного заказа очень редко но бывает несколько отгрузок (обычно одна). Хочется в запросе динамического списка с основной таблицей "Заказы" получить признак множественных отгрузок по заказу и поле со ссылкой на одного из них. Может, есть косметические предложения для получившегося монстра?

ВЫБРАТЬ
    Заказ.Ссылка,
    ВЫБОР
        КОГДА 1 В
                    (ВЫБРАТЬ
                        КОЛИЧЕСТВО(*)
                    ИЗ
                        Документ.РасходныйОрдерНаТовары КАК Отгрузка
                    ГДЕ
                        Отгрузка.ЗаказПокупателя = Заказ.Ссылка)
                ИЛИ 0 В
                    (ВЫБРАТЬ
                        КОЛИЧЕСТВО(*)
                    ИЗ
                        Документ.РасходныйОрдерНаТовары КАК Отгрузка
                    ГДЕ
                        Отгрузка.ЗаказПокупателя = Заказ.Ссылка)
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК НесколькоОтгрузок,
    Отгрузка.Ссылка КАК Отгрузка
ИЗ
    Документ.ЗаказПокупателя КАК Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйОрдерНаТовары КАК Отгрузка
        ПО Заказ.Ссылка = Отгрузка.ЗаказПокупателя
            И (Отгрузка.Ссылка В
                (ВЫБРАТЬ
                    МАКСИМУМ(Отгрузка1.Ссылка)
                ИЗ
                    Документ.РасходныйОрдерНаТовары КАК Отгрузка1
                ГДЕ
                    Отгрузка1.ЗаказПокупателя = Заказ.Ссылка))
1 Ненавижу 1С
 
гуру
03.07.15
15:42
Заказ.Ссылка,
ВЫБОР КОГДА КОЛИЧЕСТВО(Отгрузка.Ссылка)>1
   ТОГДА ИСТИНА
   ИНАЧЕ ЛОЖЬ КОНЕЦ КАК НесколькоОтгрузок,
    МИНИМУМ(Отгрузка.Ссылка) КАК Отгрузка
ИЗ
    Документ.ЗаказПокупателя КАК Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйОрдерНаТовары КАК Отгрузка
        ПО Заказ.Ссылка = Отгрузка.ЗаказПокупателя
СГРУППИРОВАТЬ ПО Заказ.Ссылка
2 butterbean
 
03.07.15
15:42
во вложенном запросе к Документ.РасходныйОрдерНаТовары сгруппировать по ЗаказПокупателя, с СУММА(1) КАК КоличествоОтгрузок
3 H A D G E H O G s
 
03.07.15
15:43
В документ ЗаказПокупателя добавить флаг "ЕстьНесколькоРеализаций"
4 fisher
 
03.07.15
15:43
(1) А разве можно группировать в динамическом списке?
5 Гёдза
 
03.07.15
15:44
группировка убивает всю динамичность
6 Ненавижу 1С
 
гуру
03.07.15
15:44
(4) ах да, а почему нельзя? на уровне платформы почему запретили?
7 Ненавижу 1С
 
гуру
03.07.15
15:47
+(6) хотя стоп, открыл - работает СГРУППИРОВАТЬ
8 fisher
 
03.07.15
15:48
(2) Я и так получаю количество отгрузок по заказу. Как от двух веток избавиться?
9 fisher
 
03.07.15
15:50
(7) Странно. Галка "Динамическое считывание данных осталась"?
10 fisher
 
03.07.15
15:50
Галка "Динамическое считывание данных" осталась?
11 Ненавижу 1С
 
гуру
03.07.15
15:51
(9) да
12 Ненавижу 1С
 
гуру
03.07.15
15:52
ВЫБОР
        КОГДА 1 В
                    (ВЫБРАТЬ
                        ВЫБОР КОГДА КОЛИЧЕСТВО(Ссылка)<2 ТОГДА 1 ИНАЧЕ 2 КОНЕЦ КАК БыдлоПоле
                    ИЗ
                        Документ.РасходныйОрдерНаТовары КАК Отгрузка
                    ГДЕ
                        Отгрузка.ЗаказПокупателя = Заказ.Ссылка)
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ
13 butterbean
 
03.07.15
15:53
(8) у тебя и так получается количество отгрузок, либо null когда ни одной, можно еще МАКСИМУМ по Отгрузка.Ссылка считать
14 fisher
 
03.07.15
15:54
(11) Проверяю...
(12) Блин, точно :)
15 fisher
 
03.07.15
15:59
(11) В самом деле, работает! Почему-то был уверен, что так нельзя. Спасибо. Всё значительно упрощается.
16 fisher
 
03.07.15
16:03
Ан нет :( Нифига не упрощается. Из отгрузки мне тоже нужно данные доставать. Получается еще хуже в итоге.
17 fisher
 
03.07.15
16:09
Текущая итерация монстра, сеанс продолжается!
ВЫБРАТЬ
    Заказ.Ссылка,
    ВЫБОР
        КОГДА 1 В
                (ВЫБРАТЬ
                    ВЫБОР
                        КОГДА КОЛИЧЕСТВО(*) > 1
                            ТОГДА 1
                        ИНАЧЕ 0
                    КОНЕЦ
                ИЗ
                    Документ.РасходныйОрдерНаТовары КАК Отгрузка
                ГДЕ
                    Отгрузка.ЗаказПокупателя = Заказ.Ссылка)
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК НесколькоОтгрузок,
    Отгрузка.Ссылка КАК Отгрузка,
    Отгрузка.Ссылка.ВесДокумента КАК ВесОтгрузки
ИЗ
    Документ.ЗаказПокупателя КАК Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйОрдерНаТовары КАК Отгрузка
        ПО Заказ.Ссылка = Отгрузка.ЗаказПокупателя
            И (Отгрузка.Ссылка В
                (ВЫБРАТЬ
                    МАКСИМУМ(Отгрузка1.Ссылка)
                ИЗ
                    Документ.РасходныйОрдерНаТовары КАК Отгрузка1
                ГДЕ
                    Отгрузка1.ЗаказПокупателя = Заказ.Ссылка))
18 fisher
 
03.07.15
16:12
Через ссылку к весу - лишнее обращение. Ну да я добавлял просто для иллюстрации, что из отгрузки тоже данные нужны.
19 butterbean
 
03.07.15
16:13
ВЫБРАТЬ
    Заказ.Ссылка,
    ВЫБОР
        КОГДА ЕСТЬNULL(Отгрузка.КоличествоОтгрузок,0) > 1 ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК НесколькоОтгрузок,
    Отгрузка.Ссылка КАК Отгрузка,
    Отгрузка.Ссылка.ВесДокумента КАК ВесОтгрузки
ИЗ
    Документ.ЗаказПокупателя КАК Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                    МАКСИМУМ(Отгрузка.Ссылка) КАК Ссылка,Отгрузка.ЗаказПокупателя,СУММА(1) КАК КоличествоОтгрузок
                ИЗ
                    Документ.РасходныйОрдерНаТовары КАК Отгрузка
                СГРУППИРОВАТЬ ПО
                    Отгрузка.ЗаказПокупателя) КАК Отгрузка
        ПО Заказ.Ссылка = Отгрузка.ЗаказПокупателя
20 fisher
 
03.07.15
16:27
(19) Нууууууу.... Думаешь, это быстрее будет?
21 H A D G E H O G s
 
03.07.15
16:38
(20) Думаю - нет.

При записи РТУ надо запускать фоновое, которое подсчитает количество других РТУ, их общий вес и общее представление и запишет все это в Заказ.
22 H A D G E H O G s
 
03.07.15
16:46
Хотя, планы запросов выходят годные. Никаких тормозов быть не должно в (19)
23 fisher
 
03.07.15
16:48
(21) Ну, во-первых, просто фоновым - нифига ненадежно. Придется огород с очередями городить. Во-вторых, текущая производительность устраивает.
24 H A D G E H O G s
 
03.07.15
16:51
(23) Что за огород с очередями?
25 fisher
 
03.07.15
16:54
(24) Ну, фиксировать необработанные документы. Хоть планами обмена.
26 Гёдза
 
03.07.15
17:09
(22) Это смотря сколько будет расходных ордеров, все таки скан таблицы идет
27 H A D G E H O G s
 
03.07.15
17:18
(26) Ты проверил?
28 Гёдза
 
03.07.15
17:20
(27) нет, но и так видно
29 H A D G E H O G s
 
03.07.15
17:21
(28) Проверь.
30 H A D G E H O G s
 
03.07.15
17:21
(28) Что "так видно"?
31 Гёдза
 
03.07.15
17:23
(30) видно что идет выборка по все таблице расходных ордеров
32 Гёдза
 
03.07.15
17:23
(29) ну скажи, как скл читает таблицу ордеров?
33 H A D G E H O G s
 
03.07.15
17:26
(32) Ищет в цикле по индексу подходящие Заказы, для найденных заказов ищет в цикле по индексу подходящие ордера.
34 Гёдза
 
03.07.15
17:30
(33) и что INDEX SEEK,  а не INDEX SCAN?
35 H A D G E H O G s
 
03.07.15
17:35
(34) да
36 Bober
 
03.07.15
18:56
Сделать доп сведения объекта (те что хранятся в РС ) и через внешнюю обработку-рег задание пересчитывать эти значения, в динамическом списке уже показывать через левое соединение.