Имя: Пароль:
1C
1С v8
Оптимизация запроса 1С УТ
0 crisalis
 
12.08.16
15:51
Доброго время суток, помогите что то сделать с запросом, работает, но не оптимально, заранее благодарен, вот это чудо:
ВЫБРАТЬ
    группОтгрузка.Номенклатура,
    группОтгрузка.ХарактеристикаНоменклатуры,
    группОтгрузка.Сделка
ПОМЕСТИТЬ ВТ_Отгрузка
ИЗ
    (ВЫБРАТЬ
        ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
        ТоварыНаСкладахОбороты.КоличествоРасход КАК КоличествоРасход,
        ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
        ВЫБОР
            КОГДА ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.РасходныйОрдерНаТовары
                ТОГДА ТоварыНаСкладахОбороты.Регистратор.ДокументПередачи.Сделка
            ИНАЧЕ ТоварыНаСкладахОбороты.Регистратор.Сделка
        КОНЕЦ КАК Сделка
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
    ГДЕ
        (ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
                ИЛИ ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
                ИЛИ ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.РасходныйОрдерНаТовары)
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        РеализацияТоваровУслугУслуги.Номенклатура,
        РеализацияТоваровУслугУслуги.Количество,
        ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка),
        РеализацияТоваровУслугУслуги.Ссылка.Сделка
    ИЗ
        Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
    ГДЕ
        РеализацияТоваровУслугУслуги.Ссылка.Проведен) КАК группОтгрузка
ГДЕ
    группОтгрузка.Сделка = &Заказ

СГРУППИРОВАТЬ ПО
    группОтгрузка.Номенклатура,
    группОтгрузка.ХарактеристикаНоменклатуры,
    группОтгрузка.Сделка
;

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

СГРУППИРОВАТЬ ПО
    ЗаказыПокупателейОбороты.Номенклатура,
    ЗаказыПокупателейОбороты.ХарактеристикаНоменклатуры,
    ЗаказыПокупателейОбороты.ЗаказПокупателя
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Отгрузка.Сделка КАК Сделка,
    СУММА(ЕСТЬNULL(ВТ_ЗаказПокупателей.СуммаОтгрузки, 0)) КАК СуммаОтгрузки
ИЗ
    ВТ_Отгрузка КАК ВТ_Отгрузка
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗаказПокупателей КАК ВТ_ЗаказПокупателей
        ПО ВТ_Отгрузка.Сделка = ВТ_ЗаказПокупателей.ЗаказПокупателя
            И ВТ_Отгрузка.ХарактеристикаНоменклатуры = ВТ_ЗаказПокупателей.ХарактеристикаНоменклатуры
            И ВТ_Отгрузка.Номенклатура = ВТ_ЗаказПокупателей.Номенклатура
ГДЕ
    НЕ ВТ_Отгрузка.Сделка = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
    И НЕ ВТ_Отгрузка.Сделка = НЕОПРЕДЕЛЕНО

СГРУППИРОВАТЬ ПО
    ВТ_Отгрузка.Сделка
1 vicof
 
12.08.16
16:15
Убрать вложенные запросы, убрать обращения через точку, при обращении к регистратору использовать ВЫРАЗИТЬ,
использовать параметры виртуальных таблиц, индексировать измерения, по которых идут соединения и условия
2 crisalis
 
12.08.16
16:41
(1) "убрать обращения через точку" - это как ?
3 vicof
 
12.08.16
16:44
ТоварыНаСкладахОбороты.Регистратор.ДокументПередачи.Сделка
как - это уже вопрос фантазии.
Писать сделку в регистр отдельнеым измерением, не учитывать вообще, еще чонить.
4 crisalis
 
12.08.16
16:45
(1) "Убрать вложенные запросы" - имеется ввиду только вложенные запросы или пакетный запрос тоже попадает под раздачу
5 crisalis
 
12.08.16
16:57
(3) оххх, измерение это конечно хорошо , но нет, это потом проведения каждого регистратора исправлять, как то стрёмно.
6 Fragster
 
гуру
12.08.16
17:00
(5) можно перед записью набора сделать подписку, в которой заполнять доп. измерение/ресурс/реквизит
7 Широкий
 
12.08.16
17:00
ВЫРАЗИТЬ где??
8 crisalis
 
12.08.16
17:01
(1) а вот за ВЫРАЗИТЬ спасибо , как-то не приходилось использовать, до сих пор.
9 youalex
 
12.08.16
17:01
в первом запросе вообще непонято зачем вложенный запрос. Если даже не вдаваться, то объединение - также помещается в Вт.
Что за условие "группОтгрузка.Сделка = &Заказ" ? Может быть стоит логику от него начинать строить?
10 youalex
 
12.08.16
17:03
(7) как  "выражать", если там три типа может быть (судя по условиям ССЫЛКА). Через ОБЪЕДИНИТЬ ВСЕ ?
11 crisalis
 
12.08.16
17:05
(9) группОтгрузка.Сделка = &Заказ - это для того чтобы получить по одному заказу (чтобы сверить) , этот код я добавил в консольке, в запросе в базе его нет
12 crisalis
 
12.08.16
17:06
(10) с ВЫРАЗИТЬ         ВЫБОР
            КОГДА ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.РасходныйОрдерНаТовары
                ТОГДА ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.Регистратор.ДокументПередачи.Сделка КАК Документ.ЗаказПокупателя)
            ИНАЧЕ ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.Регистратор.Сделка КАК Документ.ЗаказПокупателя)
        КОНЕЦ КАК Сделка
13 youalex
 
12.08.16
17:09
(12) смысл? Выражать нужно поля до точки, т..е до неявного соединения.
Т.е. ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.Регистратор КАК документ.РеализацияТоваровУслуг).Сделка
14 crisalis
 
12.08.16
17:10
(9) "в первом запросе вообще непонято зачем вложенный запрос" - для группировки, я понял что вы имеете ввиду сейчас исправлю
15 youalex
 
12.08.16
17:10
Возможно, стоит посмотреть в сторону регистра на Продажи, там есть поле ЗаказПокупателя.
16 youalex
 
12.08.16
17:12
(14) там же ничего не группируется, нет агрегатных полей, "сгруппировать" можно через ОБЪЕДИНИТЬ  (не ОБЪЕДИНИТЬ ВСЕ)
17 youalex
 
12.08.16
17:17
+ во втором пакете запроса группировать тоже не нужно, т.к. используются только измерения;  вирт. таблица Обороты и так должна сгруппировать по ним
(тут могу наврать)
18 crisalis
 
12.08.16
17:37
(13)
ВЫБОР
        КОГДА ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.РасходныйОрдерНаТовары
            ТОГДА ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.Регистратор КАК Документ.РасходныйОрдерНаТовары).ДокументПередачи.Сделка
        КОГДА ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
            ТОГДА ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.Регистратор КАК Документ.РеализацияТоваровУслуг).Сделка
        КОГДА ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
            ТОГДА ВЫРАЗИТЬ(ТоварыНаСкладахОбороты.Регистратор КАК Документ.ВозвратТоваровОтПокупателя).Сделка
    КОНЕЦ КАК Сделка

19 youalex
 
12.08.16
17:43
(18)
ДокументПередачи - по идее тоже нужно выражать (посмотрите сколько типов у этого реквизита д-та РасходныйОрдерНаТовары)

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

жесть конечно) Я бы сделал явными соединениями с таблицами документов
20 aleks_default
 
12.08.16
17:47
Обороты вобще не нужны, лучше обращение к реальной таблице
21 crisalis
 
12.08.16
17:52
(20) и что потом самому группировать и суммировать ?
22 crisalis
 
12.08.16
17:53
(21) почему не нужны , там сразу получаю искомую сумму
23 aleks_default
 
12.08.16
17:54
(22)А ты там что-то суммируешь? Там вообще количества нет в конечной таблице. Только сделка.
24 crisalis
 
12.08.16
17:55
(23) так есть суммарасход
25 aleks_default
 
12.08.16
17:58
Я про
РегистрНакопления.ТоварыНаСкладах.Обороты
где тут сумма или количество?
26 crisalis
 
12.08.16
18:43
(19) 4 типа
(25) понял, надо поправить, изначально там было количество потом я убрал

Скажите а может я вообще не правильно все делаю- мне надо получить таблицу заказов и "сумму отгрузки"  (это как объяснил мне бухгалтер все реализации и реализации с проведёнными документами расходный ордер на товары)
27 crisalis
 
12.08.16
18:44
(26) если нет расходого ордера то не учитывать плюс к этому надо учесть и возвраты
28 youalex
 
12.08.16
20:35
(26) посмотри в сторону регистров Продажи ,  Заказы.
29 crisalis
 
15.08.16
12:55
(28) Продажи мне тоже подходят , ведь реализация делает движения по регистру Продажи если даже расходный ордер на основании Реализации не проведен. А может склеить Продажи и ПродажиСебестоимость ? Подтолкните пожалуйста , как сделать лучше
30 ViSo76
 
15.08.16
14:05
(0) Топикастр весёлый парень... пишет такие расчудесные запросы просто ужас...

1. В начале напиши что хочешь получить, каково задание.
2. Что за тема со всеми движениями по складам за всё время существование базы ( ТоварыНаСкладах )? PS: Где скорее всего будет выполнена после поднятия с диска всех движений...
31 crisalis
 
15.08.16
14:10
(30) (1) хочу получить сумму отгрузки (это сумма всех документов реализация со склада и по ордеру (только учесть что если нет расходного ордера тогда не включать эти расходные в выборку) - возвраты)
32 crisalis
 
15.08.16
14:13
(30) 2. это чтобы потом слеить по сделке "ЗаказПокупателя" и получить итоговою таблицу :

ЗаказаПокупателя|СуммаЗаказа|СуммаСУчетомКорр|СуммаОтгрузки
33 ViSo76
 
15.08.16
14:39
Во первых всегда есть интерес смотреть за период ( нужно учитывать ), во вторых движения по складу не только расход, но и приход, перемещения, списания и по этому:
  Нужно взять регистр накопления Продажи, в нём фиксируются как продажи, так и возвраты ( Скорее всего возврат у вас создаётся на основе РН, а не заказа что не принципиально ). Так же есть ссылка на ЗаказПокупателя ( чтобы взять сумму начального заказа ). Скорее всего РасходныйОрдерНаТовары так же делается на основании РН, по этому не составляет труда соединить движения взятые из "Продажи" свернуть, чтобы получить сумму и регистратор ( РН ), и затем соединить уже с "Ордером", для проверки факта отгрузки.

PS: УТ10 явно
34 crisalis
 
15.08.16
14:44
Вот так вроде бы быстрее получилось:

ВЫБРАТЬ
    Вложенный.Сделка,
    ЗаказыПокупателейОбороты.СуммаВзаиморасчетовРасход
ИЗ
    (ВЫБРАТЬ
        РеализацияТоваровУслуг.Сделка КАК Сделка
    ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    ГДЕ
        НЕ РеализацияТоваровУслуг.Сделка = НЕОПРЕДЕЛЕНО
        И НЕ РеализацияТоваровУслуг.Сделка = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
        И РеализацияТоваровУслуг.ВидПередачи = ЗНАЧЕНИЕ(Перечисление.ВидыПередачиТоваров.СоСклада)
        И РеализацияТоваровУслуг.Проведен
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        РеализацияТоваровУслуг.Сделка
    ИЗ
        Документ.РасходныйОрдерНаТовары КАК РасходныйОрдерНаТовары
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ПО РасходныйОрдерНаТовары.ДокументПередачи = РеализацияТоваровУслуг.Ссылка
    ГДЕ
        НЕ РеализацияТоваровУслуг.Сделка = НЕОПРЕДЕЛЕНО
        И НЕ РеализацияТоваровУслуг.Сделка = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
        И РеализацияТоваровУслуг.ВидПередачи = ЗНАЧЕНИЕ(Перечисление.ВидыПередачиТоваров.ПоОрдеру)
        И РасходныйОрдерНаТовары.Проведен
        И РеализацияТоваровУслуг.Проведен) КАК Вложенный
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты КАК ЗаказыПокупателейОбороты
        ПО Вложенный.Сделка = ЗаказыПокупателейОбороты.ЗаказПокупателя
35 floody
 
15.08.16
16:59
В этой ситуации нужно получать инфу из регистров. Как например ваш запрос учитывает корректировки?
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший