Имя: Пароль:
1C
1С v8
Выбока торговых точек по которым не было продаж
0 LivingStar
 
26.09.13
05:30
Есть справочник торговые точки. У документа РеализацияТоваровУслуг есть реквизит в шапке торговая точка, типа Справочник.ТорговаяТочка. Задача отобрать торговые точки по которым не было продаж за тот или иной период. Как это можно сделать?
1 MiniMuk
 
26.09.13
05:34
Выбрать все точки, соеденить с теми по которым был оборот?
2 LivingStar
 
26.09.13
05:37
Условие нужно наверное в соединении задавать? Используя NULL. Не совсем знакомо ....


ВЫБРАТЬ
    ТорговыеТочки.Ссылка,
    РеализацияТоваровУслуг.Ссылка КАК Ссылка1
ИЗ
    Справочник.ТорговыеТочки КАК ТорговыеТочки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ТорговыеТочки.Ссылка = РеализацияТоваровУслуг.ТорговаяТочка.Ссылка
ГДЕ
    РеализацияТоваровУслуг.СуммаДокумента = 0
3 SeraFim
 
26.09.13
05:38
ГДЕ
    РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL
4 LivingStar
 
26.09.13
05:40
(3) Так?

ВЫБРАТЬ
    ТорговыеТочки.Ссылка КАК ТорговаяТочка,
    ТорговыеТочки.Владелец КАК Контрагент
ИЗ
    Справочник.ТорговыеТочки КАК ТорговыеТочки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ТорговыеТочки.Ссылка = РеализацияТоваровУслуг.ТорговаяТочка.Ссылка
ГДЕ
    РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL
5 LivingStar
 
26.09.13
05:52
(4+) Добавление периода в этом запросе наверное не уместно, выборка пропадает совсем при добавлении условия. То есть не получится отбирать торговые точки по которым не было продаж за определенный период?  

И РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата
6 LivingStar
 
26.09.13
05:55
Выборка возможна только общая за весь период, я правильно понимаю? Или программно отбирать реализацию за период, перегружать в таблицу, отбирать торговые точки все какие есть, перегружать в таблицу и удалять из них те по которым были продажи. А в запросе этого отобрать не получится? Что бы можно было отбирать торговые точки по которым не было продаж за заданный период.
7 SeraFim
 
26.09.13
05:56
(5) условие на период накладывай в условии соединения
8 LivingStar
 
26.09.13
05:58
(7) Таким образом? Спасибо!

ВЫБРАТЬ
    ТорговыеТочки.Ссылка КАК ТорговаяТочка,
    ТорговыеТочки.Владелец КАК Контрагент
ИЗ
    Справочник.ТорговыеТочки КАК ТорговыеТочки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ТорговыеТочки.Ссылка = РеализацияТоваровУслуг.ТорговаяТочка.Ссылка
            И (РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата)
ГДЕ
    РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL
9 Cyberhawk
 
26.09.13
06:00
ПО ТорговыеТочки.Ссылка = РеализацияТоваровУслуг.ТорговаяТочка.Ссылка И РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL
10 LivingStar
 
26.09.13
06:00
(7) Можно считать что запрос в (8) корректный? Что по отобранным им торговым точкам действительно не было рподаж?
11 LivingStar
 
26.09.13
06:00
(9) а (8) Нормально отработает? Попробую и ваш вариант!
12 Cyberhawk
 
26.09.13
06:02
Нет, (8) не отработает. Условие на "не было продаж только в заданный период" и (9) также несовместимы
13 LivingStar
 
26.09.13
06:06
(12) Вот это не отберет торговые точки без продаж за заданный период?

ВЫБРАТЬ
    ТорговыеТочки.Ссылка КАК ТорговаяТочка,
    ТорговыеТочки.Владелец КАК Контрагент
ИЗ
    Справочник.ТорговыеТочки КАК ТорговыеТочки
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ТорговыеТочки.Ссылка = РеализацияТоваровУслуг.ТорговаяТочка.Ссылка
            И (РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL )
            И (РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата)
14 LivingStar
 
26.09.13
06:07
(12) То есть получается что нельзя все же отобрать торговые точки по которым не было продаж за заданный период? В запросе отбирается очень много торговых точек, я и не пойму корректная выборка или нет?
15 Cyberhawk
 
26.09.13
06:12
Думать сам будешь, не?
На самом деле (8) отработает, но, во-первых, правильнее все засунуть в условие соединения, а во-вторых, смотреть факт продажи не по наличию документа РТУ, а по регистру "Продажи"

Наваял пример без регистра

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Контрагенты.Ссылка,
    РеализацияТоваровУслуг.Ссылка КАК Ссылка1
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО Контрагенты.Ссылка = РеализацияТоваровУслуг.Контрагент
            И (РеализацияТоваровУслуг.Дата МЕЖДУ &Дата1 И &Дата2)
            И (РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL )
16 Cyberhawk
 
26.09.13
06:21
Судя по отсутствию ТС более 5 минут он ушел проверять пример.
Сразу скажу, что пример в (15) не есть решение, в нем ошибка
17 LivingStar
 
26.09.13
06:22
(16) Тут я
18 LivingStar
 
26.09.13
06:25
(15) То же самое что (13) только ТорговыеТочки, н контрагенты. Работает (13) корректно???
19 SeraFim
 
26.09.13
06:29
Cyberhawk не путай.
Условие на ЕСТЬ NULL не надо ставить в условие соединения
20 Cyberhawk
 
26.09.13
06:32
(19) Я знаю. Я написал выше, что (8) отработает, а (13) и (15) - нет
21 LivingStar
 
26.09.13
06:33
(20) А то есть (8) нормальное решение!!!
22 Cyberhawk
 
26.09.13
06:33
Рабочее решение. О нормальности судить не нам.
23 SeraFim
 
26.09.13
06:34
(20)тогда зачем (9) ?
24 VladZ
 
26.09.13
06:34
А если вот так:

ВЫБРАТЬ
    Контрагенты.Ссылка
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    НЕ Контрагенты.Ссылка В
                (ВЫБРАТЬ
                    ПоступлениеТоваровУслуг.Контрагент КАК Контрагент
                ИЗ
                    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                ГДЕ
                    ПоступлениеТоваровУслуг.Дата МЕЖДУ &Д1 И &Д2)
25 VladZ
 
26.09.13
06:35
+24 Как раз по алгоритму: получить те, кого нет.
26 Cyberhawk
 
26.09.13
06:37
(23) чтоб извилины развивались, для затравки так сказать. Вот ты же подумал "а зачем (9)", значит уже есть эффект (хоть кто-то в ветке подумал) :)
(24) тоже рабочее, но о нормальности опять-таки судить не нам
27 LivingStar
 
26.09.13
07:45
Что то мне не нравятся выборки этих запросов. За сентябрь выбирается 700 строк! Убераешь период выбираются 1500 строк. Выборки большие, выборочно проверяю среди документов РеализацияТоваровУслуг вроде их нет. Что за торговые точки по которым нет продаж???

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



ВЫБРАТЬ
    ТорговыеТочки.Ссылка,
    ТорговыеТочки.Наименование КАК Наименование
ИЗ
    Справочник.ТорговыеТочки КАК ТорговыеТочки
ГДЕ
    НЕ ТорговыеТочки.Ссылка В
                (ВЫБРАТЬ
                    РеализацияТоваровУслуг.ТорговаяТочка КАК ТорговаяТочка
                ИЗ
                    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                ГДЕ
                    РеализацияТоваровУслуг.Дата МЕЖДУ &Д1 И &Д2)
УПОРЯДОЧИТЬ ПО
    Наименование
28 Jonny_Khomich
 
26.09.13
07:48
Я худею с темы.
29 1i37процентов
 
26.09.13
07:50
если тупите так безбожно, то хотя бы проверяйте на проведен.
30 SeraFim
 
26.09.13
07:54
(27) РАЗЛИЧНЫЕ
31 alexiv79
 
26.09.13
07:58
(0) Я бы попробывал сначала отобрать точки, по которым были продажи, запихать результат в времтаблицу, потом вовтором запросе выборка по справочнику ТорговыеТочки с условием, что ссылке не в списке торговых точек из врем таблицы
32 alexiv79
 
26.09.13
07:58
+(31) Само-собой, что первый запрос был бы по регистру "продажи", а не по документам реализации
33 LivingStar
 
26.09.13
08:08
(32) Хорошо, рассмотрю ваш вариант!!! Дельное предложение!
34 alexiv79
 
26.09.13
08:12
(33) По идее, должен быть выигрыш в скорости выполнения по сравнению с соединением
35 LivingStar
 
26.09.13
08:23
(34) Да, возможно, но важно что бы выборка была корректная, а то ощущение того было что просто все торговые точки выбирает и все! Но сколько проверил, по ним нет документов РеализацияТоваровУслуг за установленный период аналогично отчету.
36 alexiv79
 
26.09.13
08:26
(35) Какая конфа? Консоль запросов используешь?
37 LivingStar
 
26.09.13
08:26
(36) УТ 10.3, конечно использую консоль без неё никуда !
38 alexiv79
 
26.09.13
08:27
(37) Не увидел в УТ в реализации торговых точек-сами добавляли?
39 Cyberhawk
 
26.09.13
08:29
(34) а почему вложенный запрос выигрывает у соединения? Ну т.е. по какой такой идее?
40 LivingStar
 
26.09.13
08:30
(38) Да, измененная конфигурация.
41 alexiv79
 
26.09.13
08:31
(39) Потому что делаешь выборку по первому запросу, результат в времТаблицу - потом во втором запросе делаешь выборку по справочнику с условием на то, что элемент справочника не в врем талице. Соединение, насколько я знаю, сначала выбирает из двух таблиц по условиям, потом соединяет данные между собой - отсюлда выигрыш
42 alexiv79
 
26.09.13
08:35
(35) Проверь через консоль с итогами по торговым точкам-там увидишь по каким точкам были продажи, по каким нет
43 SeraFim
 
26.09.13
08:39
(39) http://www.gilev.ru/1c/81/index/optimquery.htm
Основная причина недостаточной производительности запросов – неоптимальный план выполнения запроса.
Если есть временная таблица, то будет выбран более оптимальный план выполнения. Если вложенный запрос - заранее неизвестно, какие данные получатся во вложенном, поэтому получается неоптимально.
+ Временные таблицы можно проиндексировать
44 SeraFim
 
26.09.13
08:42
(43) к (41)
45 alexiv79
 
26.09.13
09:07
(43) спс, почитаю