Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Зависает запрос при соединение по субконто

Зависает запрос при соединение по субконто
Я
   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))
 
 
   mehfk
 
1 - 10.12.17 - 19:57
   Lama12
 
2 - 10.12.17 - 20:32
(0) Что ж ты так над системой издеваешься?
   Beduin
 
3 - 10.12.17 - 20:42
(2) Я в последней строчке местами поменял условие.
У меня задача. Мне нужно снять остатки и найти первое движение по формированию этого остатка и суммы из него. Если, есть другие варианты решения. Скажи.
   Borteg
 
4 - 10.12.17 - 20:48
(0)  Счет.Код = "60.01"
                ИЛИ Счет.Код = "60.21"
                ИЛИ Счет.Код = "60.31"
                ИЛИ Счет.Код = "60.41"
                ИЛИ Счет.Код = "60.51"
                ИЛИ Счет.Код = "60.61"
                ИЛИ Счет.Код = "60.71",
это срочно надо менять
   Borteg
 
5 - 10.12.17 - 20:50
(0) вложенный запрос последний скорей всего не может быть просчитан оптимизатором поэтому делается неправильное соединение
   Borteg
 
6 - 10.12.17 - 20:54
(0) еще надо бы все это разбить на нормальные временные таблицы, а на самом деле запрос шляпа.
   H A D G E H O G s
 
7 - 10.12.17 - 20:55
Жесть, как она есть
   Renat11111
 
8 - 10.12.17 - 20:55
Это пиз.....ц
   H A D G E H O G s
 
9 - 10.12.17 - 20:56
Но, гражданину с 9 годами стажа я лишь приведу 4 строчки

Я знаю, скоро утро взорвется рассветом.
И это будет последний мирный рассвет.
Здравствуй дружок, ты хотел быть поэтом?
Что же, прошу к амбразуре – теперь ты поэт.
   Beduin
 
10 - 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))
 
 Рекламное место пустует
   Beduin
 
11 - 10.12.17 - 20:57
(2)(7)(8)
Кроме ржача, может ответите как мне оптимально решить задачу (3)
   Beduin
 
12 - 10.12.17 - 21:00
(7) Если тебя смущает вложенный запрос в соединение, то это называется кореллированый подзапрос. http://www.sql.ru/articles/mssql/2005/032101usingcorrelated
В таких задачах его использование допустимо.
   H A D G E H O G s
 
13 - 10.12.17 - 21:01
   H A D G E H O G s
 
14 - 10.12.17 - 21:03
(12) Я знаю, что такое коррелированный подзапрос, так как только с его помощью можно корректно выводить динамические списки в связке с дублями доп. таблиц без
Сгруппировать ПО.
   mehfk
 
15 - 10.12.17 - 21:03
(11) О, в теме появился вопрос!

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует