Имя: Пароль:
1C
1С v8
Помогите оптимизировать запрос в РЛС
0 Нуф-Нуф
 
18.09.13
14:14
Задача - сделать шаблон ограничения РЛС на чтение документов в зависимости от счетов в проводках (т.е. не показывает документы, у которых в проводках есть определенный счет)

Первый запрос. Выполняется быстро.

ВЫБРАТЬ
    ТекущаяТаблица.Ссылка
ИЗ
    Документ.ОперацияБух КАК ТекущаяТаблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            Хозрасчетный.Регистратор КАК Регистратор,
            Хозрасчетный.СчетКт КАК СчетКт,
            Хозрасчетный.СчетДт КАК СчетДт
        ИЗ
            РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
        ГДЕ
            НЕ Хозрасчетный.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)
            И НЕ Хозрасчетный.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)) КАК ВложенныйЗапрос
        ПО ТекущаяТаблица.Ссылка = ВложенныйЗапрос.Регистратор

Проблема: исключает непроведенные документы и документа "Операция бух" без проводок.


Второй запрос. Выполняется ощутимо дольше.

ВЫБРАТЬ
    ТекущаяТаблица.Ссылка
ИЗ
    Документ.ОперацияБух КАК ТекущаяТаблица
ГДЕ
    НЕ ТекущаяТаблица.Ссылка В
                (ВЫБРАТЬ
                    Хозрасчетный.Регистратор КАК Регистратор
                ИЗ
                    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
                ГДЕ
                    (Хозрасчетный.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)
                        ИЛИ Хозрасчетный.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)))

Проблема: долго выполняется.
Причина думаю в "НЕ В" и "ИЛИ" в условии "ГДЕ"


Как доработать первый запрос или как оптимизировать второй?
1 Fragster
 
модератор
18.09.13
14:16
Не (ТекущаяТаблица.Ссылка, Истина) В (ВЫБРАТЬ
                    Хозрасчетный.Регистратор КАК Регистратор, Истина)
2 Fragster
 
модератор
18.09.13
14:21
ИЛИ заменить на объединение поможет слабо
3 Fragster
 
модератор
18.09.13
14:23
по первому запросу - логично же - в регистре записей нет, внутреннее соединение дает уничтожение. Замени на левое и проверку на NULL или не проведен (но будет ощутимо медленнее)
4 Нуф-Нуф
 
18.09.13
14:39
(1) а что это даст?
5 Нуф-Нуф
 
18.09.13
14:41
(3) да я понимаю что логично... тоже думаю в сторону левого соединения и проверку на нулл (проведен не прокатит, так как операцибух не проводится), но чем кажется прогиб в скорости будет жесткий...
6 Нуф-Нуф
 
18.09.13
14:41
(2) думаешь?
7 Нуф-Нуф
 
18.09.13
14:47
апнуштоле
8 Fragster
 
модератор
18.09.13
14:53
(4) итс мэджик
9 Нуф-Нуф
 
18.09.13
14:55
(8) че за на??? реально мэджик! а в чем прикол???
10 Fragster
 
модератор
18.09.13
15:02
(9) открой профайлер, да посмотри. кстати, если б индекс по вложенному запросу можно было б сделать - то разницы такой не было бы
11 Мыш
 
18.09.13
15:26
(0) Я б не строил РЛС на проводках.
12 Нуф-Нуф
 
18.09.13
15:30
(10) т.е. в случае добавления второго поля добавляется индекс?
13 Нуф-Нуф
 
18.09.13
15:30
(11) если бы знал другой путь - тоже бы не стоил...
14 Fragster
 
модератор
18.09.13
15:31
(12) нет, заменяется in на exists
15 Нуф-Нуф
 
18.09.13
15:32
спасибо! буду знать
16 Tateossian
 
18.09.13
15:33
(0)
Мне кажется,вот это ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда) лучше засунуть в параметр сеанса - по-любому РЛС будет работать быстрее.
17 Нуф-Нуф
 
18.09.13
15:35
Вот результирующий запрос

ТекущаяТаблица              
ИЗ
    #ТекущаяТаблица КАК ТекущаяТаблица
ГДЕ
    НЕ (ТекущаяТаблица.#Параметр(1), истина) В
                (ВЫБРАТЬ
                    Хозрасчетный.Регистратор КАК Регистратор,
                    ИСТИНА КАК ДополнительноеПоле
                ИЗ
                    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                            Хозрасчетный.Ссылка КАК Счет
                        ИЗ
                            ПланСчетов.Хозрасчетный КАК Хозрасчетный
                        ГДЕ
                            Хозрасчетный.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)) КАК ПланСчетов
                        ПО Хозрасчетный.СчетДт = ПланСчетов.Счет
                
                ОБЪЕДИНИТЬ ВСЕ
                
                ВЫБРАТЬ
                    Хозрасчетный.Регистратор,
                    ИСТИНА
                ИЗ
                    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                            Хозрасчетный.Ссылка КАК Счет
                        ИЗ
                            ПланСчетов.Хозрасчетный КАК Хозрасчетный
                        ГДЕ
                            Хозрасчетный.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)) КАК ПланСчетов
                        ПО Хозрасчетный.СчетКт = ПланСчетов.Счет)


Дополнительно чтобы избавиться от В и ИЛИ добавил внутреннее соединение и объединение.
18 Нуф-Нуф
 
18.09.13
15:35
(16) почему так думаешь?
19 Fragster
 
модератор
18.09.13
15:40
(17) нафига соединения?
20 Нуф-Нуф
 
18.09.13
15:42
(19) а разве внутреннее не быстрее работает чем В?
21 Fragster
 
модератор
18.09.13
15:43
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
Где Хозрасчетный.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТру


Не?
22 Нуф-Нуф
 
18.09.13
15:44
(21) аааа, понял про что ты. да, это подойдет для одного счета. но у меня есть другие случаи, когда проверять надо на несколько счетов.
23 Fragster
 
модератор
18.09.13
15:45
(22) для нескольких значений лучше В
24 Нуф-Нуф
 
18.09.13
15:45
+(22)

ВЫБРАТЬ
                                                  Хозрасчетный.Ссылка КАК Счет
                                              ИЗ
                                                  ПланСчетов.Хозрасчетный КАК Хозрасчетный
                                              ГДЕ
                                                  Хозрасчетный.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда)
                                              
                                              ОБЪЕДИНИТЬ ВСЕ
                                              
                                              ВЫБРАТЬ
                                                  Хозрасчетный.Ссылка
                                              ИЗ
                                                  ПланСчетов.Хозрасчетный КАК Хозрасчетный
                                              ГДЕ
                                                  Хозрасчетный.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСУчредителями)
                                              
                                              ОБЪЕДИНИТЬ ВСЕ
                                              
                                              ВЫБРАТЬ
                                                  Хозрасчетный.Ссылка
                                              ИЗ
                                                  ПланСчетов.Хозрасчетный КАК Хозрасчетный
                                              ГДЕ
                                                  Хозрасчетный.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоВыплатеДоходов)
                                              
                                              ОБЪЕДИНИТЬ ВСЕ
                                              
                                              ВЫБРАТЬ
                                                  Хозрасчетный.Ссылка
                                              ИЗ
                                                  ПланСчетов.Хозрасчетный КАК Хозрасчетный
                                              ГДЕ
                                                  Хозрасчетный.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоВкладамВУставныйКапитал)
25 Fragster
 
модератор
18.09.13
15:46
ВЫБРАТЬ
                                                  ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда) КАК Счет
                                              
                                              ОБЪЕДИНИТЬ ВСЕ
                                              
                                              ВЫБРАТЬ
                                                  ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСУчредителями)
                                              
                                              ОБЪЕДИНИТЬ ВСЕ
                                              
                                              ВЫБРАТЬ
                                                  ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоВыплатеДоходов)
                                              
                                              ОБЪЕДИНИТЬ ВСЕ
                                              
                                              ВЫБРАТЬ
                                                  ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоВкладамВУставныйКапитал)
26 Fragster
 
модератор
18.09.13
15:46
(25)+ тогда уж
27 Fragster
 
модератор
18.09.13
15:47
или вообще Где ... В (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда), ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСУчредителями), ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоВыплатеДоходов), ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоВкладамВУставныйКапитал))
28 Мыш
 
18.09.13
15:49
(13) В том же ЗУПе табличная часть документов "ФизическиеЛица" специально для РЛС присобачена.
29 Нуф-Нуф
 
18.09.13
15:54
(27) гыгыгы, тема ))))
30 Нуф-Нуф
 
18.09.13
16:02
Спасибо за помощь!
31 Мыш
 
18.09.13
16:04
(30) Всё же будешь терзать таблицу проводок? )
32 Нуф-Нуф
 
18.09.13
16:06
(31) ну этот вариант более менее универсальный. если завязываться на документы - тогда придется писать херову гору шаблонов для каждого типа документа (с учетом того, что реквизиты содержащие счет называются по разному и могут находится в табличных частях)
33 Мыш
 
18.09.13
16:11
(32) Да, монотонный труд. Но в итоге решение более эффективное. РЛС на проводках чревато тормозами.
34 Мыш
 
18.09.13
16:13
Собственно суть решения в ЗУПе следующая. При записи документов в табличную часть пишутся различные физ.лица. А шаблоны рлс для документов там практически идентичны.