Имя: Пароль:
1C
1С v8
Зависает запрос при соединение по субконто
,
0 Beduin
 
10.12.17
19:40
Обычный регистр бухгалтерии Хозрасчетный. Типовой.
Зависает по жесткому, как поменял на соединение по субконто, до этого было по регистратору
ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.НомерПоставщикаСкалы КАК НомерПоставщикаСкалы,
    ХозрасчетныйОстатки.Субконто3.Номер КАК НомерСчетФактуры,
    ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаСчетФактуры,
    ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаПроводкиПоСчетФактуре,
    ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаВЛокальнойВалюте,
    ХозрасчетныйОбороты.ВалютнаяСуммаОборотКт КАК СуммаВОригинальнойВалюте,
    ВЫБОР
        КОГДА ХозрасчетныйОстатки.Валюта.Код = "643"
                ИЛИ ХозрасчетныйОстатки.Валюта ЕСТЬ NULL
            ТОГДА "00"
        КОГДА ХозрасчетныйОстатки.Валюта.Код = "978"
            ТОГДА "05"
        КОГДА ХозрасчетныйОстатки.Валюта.Код = "840"
            ТОГДА "02"
        ИНАЧЕ NULL
    КОНЕЦ КАК КодВалютыСчетаФактуры,
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1.ШаблонОрганизацииСкала.Код КАК ТипОрганизации,
    ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
    ХозрасчетныйОстатки.Субконто2 КАК Договор,
    ХозрасчетныйОстатки.Субконто3 КАК Документ,
    ХозрасчетныйОстатки.Валюта,
    ХозрасчетныйОбороты.КорСубконто1
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &НаДату,
            Счет.Код = "60.01"
                ИЛИ Счет.Код = "60.21"
                ИЛИ Счет.Код = "60.31"
                ИЛИ Счет.Код = "60.41"
                ИЛИ Счет.Код = "60.51"
                ИЛИ Счет.Код = "60.61"
                ИЛИ Счет.Код = "60.71",
            ,
            ) КАК ХозрасчетныйОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(
                ,
                ,
                Регистратор,
                Счет.Код = "60.01"
                    ИЛИ Счет.Код = "60.21"
                    ИЛИ Счет.Код = "60.31"
                    ИЛИ Счет.Код = "60.41"
                    ИЛИ Счет.Код = "60.51"
                    ИЛИ Счет.Код = "60.61"
                    ИЛИ Счет.Код = "60.71",
                ,
                ,
                ,
                ) КАК ХозрасчетныйОбороты
        ПО ХозрасчетныйОстатки.Субконто3 = ХозрасчетныйОбороты.Субконто3
            И (ХозрасчетныйОбороты.Период В
                (ВЫБРАТЬ
                    МИНИМУМ(ХозрасчетныйОбороты.Период)
                ИЗ
                    РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, Счет.Код = "60.01"
                        ИЛИ Счет.Код = "60.21"
                        ИЛИ Счет.Код = "60.31"
                        ИЛИ Счет.Код = "60.41"
                        ИЛИ Счет.Код = "60.51"
                        ИЛИ Счет.Код = "60.61"
                        ИЛИ Счет.Код = "60.71", , , , ) КАК ХозрасчетныйОбороты
                ГДЕ
                    ХозрасчетныйОстатки.Субконто3 = ХозрасчетныйОбороты.Субконто3))
1 mehfk
 
10.12.17
19:57
2 Lama12
 
10.12.17
20:32
(0) Что ж ты так над системой издеваешься?
3 Beduin
 
10.12.17
20:42
(2) Я в последней строчке местами поменял условие.
У меня задача. Мне нужно снять остатки и найти первое движение по формированию этого остатка и суммы из него. Если, есть другие варианты решения. Скажи.
4 Borteg
 
10.12.17
20:48
(0)  Счет.Код = "60.01"
                ИЛИ Счет.Код = "60.21"
                ИЛИ Счет.Код = "60.31"
                ИЛИ Счет.Код = "60.41"
                ИЛИ Счет.Код = "60.51"
                ИЛИ Счет.Код = "60.61"
                ИЛИ Счет.Код = "60.71",
это срочно надо менять
5 Borteg
 
10.12.17
20:50
(0) вложенный запрос последний скорей всего не может быть просчитан оптимизатором поэтому делается неправильное соединение
6 Borteg
 
10.12.17
20:54
(0) еще надо бы все это разбить на нормальные временные таблицы, а на самом деле запрос шляпа.
7 H A D G E H O G s
 
10.12.17
20:55
Жесть, как она есть
8 Renat11111
 
10.12.17
20:55
Это пиз.....ц
9 H A D G E H O G s
 
10.12.17
20:56
Но, гражданину с 9 годами стажа я лишь приведу 4 строчки

Я знаю, скоро утро взорвется рассветом.
И это будет последний мирный рассвет.
Здравствуй дружок, ты хотел быть поэтом?
Что же, прошу к амбразуре – теперь ты поэт.
10 Beduin
 
10.12.17
20:56
(6) У меня такой же запрос, но правую таблицу я джойню через регистратор и все отрабатывает быстро.
ВЫБРАТЬ
    ХозрасчетныйОстатки.Субконто1.НомерПоставщикаСкалы КАК НомерПоставщикаСкалы,
    ХозрасчетныйОстатки.Субконто3.Номер КАК НомерСчетФактуры,
    ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаСчетФактуры,
    ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаПроводкиПоСчетФактуре,
    ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаВЛокальнойВалюте,
    ХозрасчетныйОбороты.ВалютнаяСуммаОборотКт КАК СуммаВОригинальнойВалюте,
    ВЫБОР
        КОГДА ХозрасчетныйОстатки.Валюта.Код = "643"
                ИЛИ ХозрасчетныйОстатки.Валюта ЕСТЬ NULL
            ТОГДА "00"
        КОГДА ХозрасчетныйОстатки.Валюта.Код = "978"
            ТОГДА "05"
        КОГДА ХозрасчетныйОстатки.Валюта.Код = "840"
            ТОГДА "02"
        ИНАЧЕ NULL
    КОНЕЦ КАК КодВалютыСчетаФактуры,
    ХозрасчетныйОстатки.Счет КАК Счет,
    ХозрасчетныйОстатки.Субконто1.ШаблонОрганизацииСкала.Код КАК ТипОрганизации,
    ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
    ХозрасчетныйОстатки.Субконто2 КАК Договор,
    ХозрасчетныйОстатки.Субконто3 КАК Документ,
    ХозрасчетныйОстатки.Валюта,
    ХозрасчетныйОбороты.КорСубконто1
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &НаДату,
            Счет.Код = "60.01"
                ИЛИ Счет.Код = "60.21"
                ИЛИ Счет.Код = "60.31"
                ИЛИ Счет.Код = "60.41"
                ИЛИ Счет.Код = "60.51"
                ИЛИ Счет.Код = "60.61"
                ИЛИ Счет.Код = "60.71",
            ,
            ) КАК ХозрасчетныйОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(
                ,
                ,
                Регистратор,
                Счет.Код = "60.01"
                    ИЛИ Счет.Код = "60.21"
                    ИЛИ Счет.Код = "60.31"
                    ИЛИ Счет.Код = "60.41"
                    ИЛИ Счет.Код = "60.51"
                    ИЛИ Счет.Код = "60.61"
                    ИЛИ Счет.Код = "60.71",
                ,
                ,
                ,
                ) КАК ХозрасчетныйОбороты
        ПО ХозрасчетныйОстатки.Субконто3 = ХозрасчетныйОбороты.Регистратор
            И (ХозрасчетныйОбороты.Период В
                (ВЫБРАТЬ
                    МИНИМУМ(ХозрасчетныйОбороты.Период)
                ИЗ
                    РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, Счет.Код = "60.01"
                        ИЛИ Счет.Код = "60.21"
                        ИЛИ Счет.Код = "60.31"
                        ИЛИ Счет.Код = "60.41"
                        ИЛИ Счет.Код = "60.51"
                        ИЛИ Счет.Код = "60.61"
                        ИЛИ Счет.Код = "60.71", , , , ) КАК ХозрасчетныйОбороты
                ГДЕ
                    ХозрасчетныйОбороты.Регистратор = ХозрасчетныйОстатки.Субконто3))
11 Beduin
 
10.12.17
20:57
(2)(7)(8)
Кроме ржача, может ответите как мне оптимально решить задачу (3)
12 Beduin
 
10.12.17
21:00
(7) Если тебя смущает вложенный запрос в соединение, то это называется кореллированый подзапрос. http://www.sql.ru/articles/mssql/2005/032101usingcorrelated
В таких задачах его использование допустимо.
13 H A D G E H O G s
 
10.12.17
21:01
14 H A D G E H O G s
 
10.12.17
21:03
(12) Я знаю, что такое коррелированный подзапрос, так как только с его помощью можно корректно выводить динамические списки в связке с дублями доп. таблиц без
Сгруппировать ПО.
15 mehfk
 
10.12.17
21:03
(11) О, в теме появился вопрос!

Во-первых - изучить виртуальные таблицы регистра бухгалтерии. Во-вторых убрать (4).
16 Beduin
 
10.12.17
21:06
(15) Если интересно могу показать результат через профайлер. С кодом из (4) и через параметры установленные.
17 Beduin
 
10.12.17
21:08
(15) С помощью какой виртуальной таблицы мне можно найти первое движение из остатка на дату по документу?
Нужен срез остатков до документа на дату и туда же вывести сумму первоначальную, когда было первое движение.
18 H A D G E H O G s
 
10.12.17
21:12
(15)++В третьих почитать про параметр ВТ - Субконто
19 mehfk
 
10.12.17
21:14
(18) Это во-первых, я же так и написал:  изучить виртуальные таблицы регистра бухгалтерии.
20 Cyberhawk
 
10.12.17
21:15
"срез остатков до документа на дату" // Какого документа, не регистратора ли? ;)
21 H A D G E H O G s
 
10.12.17
21:16
(17) ДвижениеССубконто
22 H A D G E H O G s
 
10.12.17
21:16
(19) окей
23 Beduin
 
10.12.17
21:17
(20) Документов из третьего субконто. Там документ.
24 H A D G E H O G s
 
10.12.17
21:19
не, все равно дичь.
Переписывайте на Временные таблицы и уберите это
ИЛИ Счет.Код = "60.21"
                    ИЛИ Счет.Код = "60.31"
                    ИЛИ Счет.Код = "60.41"
                    ИЛИ Счет.Код = "60.51"
                    ИЛИ Счет.Код = "60.61"
                    ИЛИ Счет.Код = "60.71"
25 H A D G E H O G s
 
10.12.17
21:19
Аврелий и Октавиан...
26 Beduin
 
10.12.17
21:21
(21) Предлагаешь из движениессубконто вытаскивать первое движение? Чем это лучше если из таблицы оборотов взять движение до регистратора?
27 H A D G E H O G s
 
10.12.17
21:29
(26) Я не предлагаю. Я ответил на вопрос.
Я вообще не понимаю этой странной конструкции, по которой регистратор может сделать проводки в разном периоде. Зачем?
28 Beduin
 
10.12.17
21:33
(27) У меня задача. Это не я придумал ее. Заказчик.
Мне нужно снять остатки до документа по 60 счету и показать в отдельной колонке первоначальную сумму по этому документу. В табчасть найденного документа лезть не стал, решил найти первое движение по нему, так как там перенос остатков и т.п. и вывести.
29 H A D G E H O G s
 
10.12.17
21:33
Выбрать в 1 ВТ остатки, выбрать ПРАВИЛЬНО (см. параметр Субконто)
В 3 субконто получим все регистраторы
2 запросом выберем минимумы и максимумы ДАТ, ну пусть будет из Таблицы ДВиженийССубконто в разрезе регистраторов

3 запросом выберем обороты с внутренним соединением с 2 таблицей по 2-м условиям по периодам.
Профит
30 H A D G E H O G s
 
10.12.17
21:36
Ну и эту дичь тоже заменить
ХозрасчетныйОстатки.Субконто3.Дата КАК ДатаСчетФактуры,
на ВЫРАЗИТЬ()
31 Beduin
 
10.12.17
21:40
(29) Внутреннее соединение зачем? Мне главное наличие остатка.
И в итоге из моего одного запроса получилось 3 вложенных. Это считается оптимизацией?
32 Мимохожий Однако
 
10.12.17
22:14
(31) Тебе дело говорят, а ты упираешься вместо того, чтобы попробовать и померить результат.
33 Beduin
 
10.12.17
22:18
(32) У меня вопрос был общий. Про архитектуру системы. Почему при соединении по регистратору у меня отрабатывается за 1 секунду. А при соединение по субконто зависает намертво. Мне зачем эти производительности. Просто ответ, нужен, что по субконто не соединяются таблицы потому-то потому-то. В итоге половина написала жесть, другому не нравилось, что я не ссылку передал, а заставил рег бухгалтерии найти мне счет. Мне нужен просто запрос. Сделать один раз и забыть. Меня заинтересовало, почему у меня зависает намертво именно когда соединение по субконто идет.
34 Мимохожий Однако
 
10.12.17
22:33
"А при соединение по субконто зависает намертво."Ответ есть -неправильно строишь запрос.
и тут же:" Мне зачем эти производительности".
Это вторая причина проблем - не хочешь с этим разбираться.
"Сделать один раз и забыть" наивный подход. Вот если бы один разобрался, то это было бы правильнее.
Твой запрос наглухо вешает из-за того, что не учитываешь особенности объекта Субконто
35 Beduin
 
10.12.17
22:37
(34) Приведение типа или внутренние особенности таблиц?
36 Мимохожий Однако
 
10.12.17
23:34
Да. Смотри (29) (30)
И убедись, 3 субконто заполнено
37 Cyberhawk
 
10.12.17
23:40
Думаю, если ты заменишь условие
"ПО ХозрасчетныйОстатки.Субконто3 = ХозрасчетныйОбороты.Регистратор"
На
"ПО выбор когда ХозрасчетныйОстатки.Субконто3 ссылка документ1 тогда выразить(ХозрасчетныйОстатки.Субконто3) как документ1 = ХозрасчетныйОбороты.Регистратор
когда ... документ 2 тогда ... "
то результат тебя удовлетворит
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс