Имя: Пароль:
1C
1С v8
Запросы и СКД
0 vip67
 
24.07.13
20:46
Все добрый вечер! УПП для Украины. помогите разобраться с СКД.
Суть вопроса: есть 2 таблицы: 1-я - Бух остатки и обороты - на нее наложен отбор по определенному счету БУ (631), из нее получаю сделку, остаток на начало и оборот за период. Далее делаю вложенный запрос, в котором указываю таблицу ОБоротыДтКт, фильтр по счету БУ (20). обе этих таблицы связываю по Субконто3 из первой и регистратор.Сделка из 2-й. Суть в чем: необходимо по сделке, полученной из первой таблицы получить приход материала за тек месяц, сгруппированный по группе кода (часть номера кода). Как я понимаю, внутренний запрос первоначально отберет все данные, а потом уже будет происходит внутреннее соединение. В итоге работает ОЧЕНЬ медленно. Нужно, чтобы для каждой записи 1-й таблицы отбирались данные по 2-й таблице. Как это реализовать в СКД?
текст запроса прилагаю:
ВЫБРАТЬ
    ПриходЗаМесяц.НомГруппа КАК НомГруппа,
    ПриходЗаМесяц.СуммаОборот КАК ПриходМатБезНДС,
    ПриходЗаМесяц.Регистратор КАК Регистратор,
    ПлатежТекМес.Субконто3 КАК Сделка,
    ПлатежТекМес.Валюта,
    ПлатежТекМес.СуммаНачальныйОстатокКт,
    ПлатежТекМес.СуммаОборотДт,
    СУММА(ВЫБОР
            КОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0) > 0
                ТОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0)
            ИНАЧЕ 0
        КОНЕЦ) КАК ОплатаТекМес
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет В ИЕРАРХИИ (&счет631), , ) КАК ПлатежТекМес
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ПриходМат20.Регистратор КАК Регистратор,
            ПриходМат20.СубконтоДт1 КАК СубконтоДт1,
            ПриходМат20.СуммаОборот КАК СуммаОборот,
            ПОДСТРОКА(ПриходМат20.СубконтоДт1.Код, 1, 2) КАК НомГруппа,
            ПриходМат20.Регистратор.Сделка КАК Сделка
        ИЗ
            РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачПериода, &КонПериода, Запись, СчетДт В ИЕРАРХИИ (&Счет20), , , , ) КАК ПриходМат20
        ГДЕ
            НЕ ПриходМат20.Регистратор ССЫЛКА Документ.ПоступлениеДопРасходов) КАК ПриходЗаМесяц
        ПО ПлатежТекМес.Субконто3 = ПриходЗаМесяц.Регистратор.Сделка
ГДЕ
    ВЫБОР
            КОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0) > 0
                ТОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0)
            ИНАЧЕ 0
        КОНЕЦ > 0

СГРУППИРОВАТЬ ПО
    ПлатежТекМес.Субконто3,
    ПриходЗаМесяц.Регистратор,
    ПриходЗаМесяц.НомГруппа,
    ПриходЗаМесяц.СуммаОборот,
    ПлатежТекМес.Валюта,
    ПлатежТекМес.СуммаНачальныйОстатокКт,
    ПлатежТекМес.СуммаОборотДт

УПОРЯДОЧИТЬ ПО
    Сделка,
    Регистратор,
    НомГруппа
1 vip67
 
24.07.13
20:51
при этом этот же запрос в консоле запросов отрабатывает гораздо быстрее
2 France
 
24.07.13
21:01
для начала попробуй вынести группировки из запроса - пусть скд группирует.
3 vip67
 
24.07.13
21:10
(2) ок, счас, а то уже минут 15 - и ничего, а в консоле - ну 30сек-1мин
4 vip67
 
24.07.13
21:14
(2) не помогает
5 viktor_vv
 
24.07.13
21:16
Я бы на это не надеялся
" Как я понимаю, внутренний запрос первоначально отберет все данные, а потом уже будет происходит внутреннее соединение"

как там скуль выгребет это дело, только ему и известно, учитывая еще что, виртуальные таблицы тоже разворачиваются в подзапросы.

Загони это во временные таблицы и их соединяй.
6 viktor_vv
 
24.07.13
21:17
Как миниму приход за месяц во временную загони.
7 vip67
 
24.07.13
21:18
на данный момент база - файловая
8 viktor_vv
 
24.07.13
21:25
(7) Ну там таки тоже есть некоторый планировщик запросов. Плюс СКД некоторым образом модифицирует этот запрос, для отборов и т. д.
Ты попробуй.
9 Sorm
 
24.07.13
21:27
(0) Гы:) А на уровне запроса, а не в СКД, это реализовать нельзя? Две временных таблицы, проиндексированные по полям поиска, имхо, спасут отца русской демократии.
10 1s_ivan
 
24.07.13
21:30
1. Вам точно нужны строки в части СГРУППИРОВАТЬ ПО:
...
ПлатежТекМес.СуммаНачальныйОстатокКт,
ПлатежТекМес.СуммаОборотДт
...
????

2. Как считаете, может нужно в начале запроса в части ВЫБРАТЬ:
    ...
    ПлатежТекМес.СуммаНачальныйОстатокКт,
    ПлатежТекМес.СуммаОборотДт,
    ...
ЗАМЕНИТЬ на:
    сумма (ПлатежТекМес.СуммаНачальныйОстатокКт),
    сумма (ПлатежТекМес.СуммаОборотДт),
???
11 viktor_vv
 
24.07.13
21:32
Плюс там еще в виртуальные таблицы условия на виды субконто неплохо было бы, тем более, что тебе не все нужны. Тут правда я не сильно знаю как загнать их параметрами СКД, ну и с бухРегистром не часто работал.
12 vip67
 
24.07.13
21:44
(9) да вот наверно и придется на уровне запроса а не в СКД... хотя зотелось бы.
кстати вопорс на засыпку - как в СКД создать временную таблицу и связать потом с запросом? на пальцах кто-то объяснит? потому что в инете натолкнулся на то, что временные таблицы в СКД не есть гуд... а тут все рекомендуют...
13 France
 
24.07.13
21:46
легко...
ща пальцы разомну только..
14 France
 
24.07.13
21:48
1. В Конструкторе СКД создаешь обычным образом запрос
2. Переходишь на закладку "Дополнительно" и в нем выбираешь "Создание временной таблицы" и задаешь и имя..
и..все..
15 vip67
 
24.07.13
21:50
(14) Это легко, как 2 пальца... так я уже делал, а вот что дальше - создал я к примеру временную таблицу, а где основная таблица или еще одна? и как ихз потом увязать?
через пакет добавлять? тут без 100гр не разобраться видать
16 France
 
24.07.13
21:53
да, через пакет создаешь еще нужно количество таблиц и увязиываешь нужным образом с временной таблицей.. и пакет тоже так же легко создается.
17 France
 
24.07.13
21:55
созданная первым временная таблица становится доступна следующему запросу в пакете в дереве метаданных при формировании запроса.. прям в конце списка "Временные таблицы"
18 vip67
 
24.07.13
21:56
а вот как увязать между пакетами? куда жать? вот это я не нашел :(

кстати, уже минут 40 работает отчет на СКД за период в один день! ужас какой-то! такого у меня еще не было.
19 vip67
 
24.07.13
22:00
(17) точно! вот за это СПАСИБО!!!
20 France
 
24.07.13
22:00
два разных пакета увязать или временную таблицу с таблицей в одном пакете??
- увязать два разных пакета - это два разных набора данных запрос в СКД
- увязать временную таблицу с другой в пределах одного пакета: объявить временную таблицу, и при создании нового запроса в пакете объявленная таблица доступна на закладке "Таблицы и поля" конструктора запроса" в разделе "Временные таблицы" (последняя в списке).
21 viktor_vv
 
24.07.13
22:12
Эти конструкторы до добра не доведут :)

ВЫБРАТЬ
            ПриходМат20.Регистратор КАК Регистратор,
            ПриходМат20.СубконтоДт1 КАК СубконтоДт1,
            ПриходМат20.СуммаОборот КАК СуммаОборот,
            ПОДСТРОКА(ПриходМат20.СубконтоДт1.Код, 1, 2) КАК НомГруппа,
            ПриходМат20.Регистратор.Сделка КАК Сделка
ПОМЕСТИТЬ
   ВремПриходЗаМесяц

        ИЗ
            РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачПериода, &КонПериода, Запись, СчетДт В ИЕРАРХИИ (&Счет20), , , , ) КАК ПриходМат20
        ГДЕ
            НЕ ПриходМат20.Регистратор ССЫЛКА Документ.ПоступлениеДопРасходов

;

ВЫБРАТЬ
    ПриходЗаМесяц.НомГруппа КАК НомГруппа,
    ПриходЗаМесяц.СуммаОборот КАК ПриходМатБезНДС,
    ПриходЗаМесяц.Регистратор КАК Регистратор,
    ПлатежТекМес.Субконто3 КАК Сделка,
    ПлатежТекМес.Валюта,
    ПлатежТекМес.СуммаНачальныйОстатокКт,
    ПлатежТекМес.СуммаОборотДт,
    СУММА(ВЫБОР
            КОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0) > 0
                ТОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0)
            ИНАЧЕ 0
        КОНЕЦ) КАК ОплатаТекМес
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет В ИЕРАРХИИ (&счет631), , ) КАК ПлатежТекМес
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремПриходЗаМесяц КАК ПриходЗаМесяц
        ПО ПлатежТекМес.Субконто3 = ПриходЗаМесяц.Регистратор.Сделка
ГДЕ
    ВЫБОР
            КОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0) > 0
                ТОГДА ЕСТЬNULL(ПлатежТекМес.СуммаОборотДт, 0) - ЕСТЬNULL(ПлатежТекМес.СуммаНачальныйОстатокКт, 0)
            ИНАЧЕ 0
        КОНЕЦ > 0

СГРУППИРОВАТЬ ПО
    ПлатежТекМес.Субконто3,
    ПриходЗаМесяц.Регистратор,
    ПриходЗаМесяц.НомГруппа,
    ПриходЗаМесяц.СуммаОборот,
    ПлатежТекМес.Валюта,
    ПлатежТекМес.СуммаНачальныйОстатокКт,
    ПлатежТекМес.СуммаОборотДт

УПОРЯДОЧИТЬ ПО
    Сделка,
    Регистратор,
    НомГруппа
22 France
 
24.07.13
22:14
на ко ругается?
23 viktor_vv
 
24.07.13
22:27
(22) На кого ругается ?
Даже выполняется, правда нихрена не выводит :).