Имя: Пароль:
1C
1С v8
левое соединение
0 ВежливаяТварь
 
18.04.12
10:11
Добрый день Столкнулся с весьма затруднительной проблемой

Имеем запрос
ВЫБРАТЬ
   ПродажиОбороты.Контрагент.Код
ПОМЕСТИТЬ Контрагенты
ИЗ
   РегистрНакопления.Продажи.Обороты(&ДатаКонМинусГод, &ДатаКон, , ) КАК ПродажиОбороты
ГДЕ
   ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&Бенкизер)
   И ПродажиОбороты.ДокументПродажи.Склад В(&Склады)

СГРУППИРОВАТЬ ПО
   ПродажиОбороты.Контрагент.Код
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Контрагенты.КонтрагентКод КАК КонтрагентКод,
   ФактическийАдрес.Представление,
   АдресДоставки.Представление КАК Представление1
ИЗ
   Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК ФактическийАдрес
       ПО Контрагенты.КонтрагентКод = ФактическийАдрес.Объект.Код
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресДоставки
       ПО Контрагенты.КонтрагентКод = АдресДоставки.Объект.Код
ГДЕ
   ФактическийАдрес.Вид = &ФактическийАдрес
   И АдресДоставки.Вид = &АдресДоставки

УПОРЯДОЧИТЬ ПО
   КонтрагентКод
ИТОГИ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентКод)
ПО
   ОБЩИЕ

Проблема в том что Из 643 строк таблицы контрагенты выводит только 60. Что я делаю не правильно?
1 Ненавижу 1С
 
гуру
18.04.12
10:12
ПО Контрагенты.КонтрагентКод = АдресДоставки.Объект.Код
И
   ФактическийАдрес.Вид = &ФактическийАдрес
   И АдресДоставки.Вид = &АдресДоставки

а вообще соединение по коду это глупо
2 ВежливаяТварь
 
18.04.12
10:14
а как не глупо?
3 Godofsin
 
18.04.12
10:15
по ссылке?
4 Ненавижу 1С
 
гуру
18.04.12
10:15
не вдумывался в остальное:

ВЫБРАТЬ
   ПродажиОбороты.Контрагент
ПОМЕСТИТЬ Контрагенты
....

ПО Контрагенты.Контрагент = АдресДоставки.Объект
И
   ФактическийАдрес.Вид = &ФактическийАдрес
   И АдресДоставки.Вид = &АдресДоставки
5 butterbean
 
18.04.12
10:16
убери условия ГДЕ в условия соединения
6 ВежливаяТварь
 
18.04.12
10:22
Убрал проблема втом что оно все равно нужно, можно сделать ещё одну виртуальную таблицу с эти условием а потом связать с таблицей контрагенты?
7 zakidonoff
 
18.04.12
10:23
(Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК ФактическийАдрес
       ПО Контрагенты.КонтрагентКод = ФактическийАдрес.Объект.Код)
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресДоставки
       ПО Контрагенты.КонтрагентКод = АдресДоставки.Объект.Код
Семантика: всё, что у тебя получилось из первого соединения отсекает по левому соединению всё, что получилось из второго.
Попробуй во втором случае сделать просто соединение, а не внутреннее
8 ВежливаяТварь
 
18.04.12
10:25
Понял попробую, спасибо огромное
9 butterbean
 
18.04.12
10:25
(6) куда убрал?? надо было
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК ФактическийАдрес
       ПО Контрагенты.Контрагент = ФактическийАдрес.Объект
И ФактическийАдрес.Вид = &ФактическийАдрес
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресДоставки
       ПО Контрагенты.Контрагент = АдресДоставки.Объект
И АдресДоставки.Вид = &АдресДоставки
10 Serginio1
 
18.04.12
10:26
ФактическийКод и АдресДоставки сделай подзапросами с условиями. А в основной запросе исключи условия.
11 Buster007
 
18.04.12
10:28
условие ГДЕ у тебя убирает все записи по контрагентам, по которым, например, не задан ФактическийАдрес ИЛИ АдресДоставки.. в соединении если перенести, то все записи по контрагентам выведутся, а по которым не будет адреса, соответственно он просто не заполнится в результате
12 Buster007
 
18.04.12
10:29
+(11) для наглядности выполни запрос без условия ГДЕ, посмотри что выведется, а потом на то, что вывелось наложи условия в уме и поймешь, что такое ГДЕ)
13 ВежливаяТварь
 
18.04.12
10:34
Понял, попробую так, спасибо.
14 ВежливаяТварь
 
18.04.12
10:39
Сделал через временные таблицы сработало. Такой вопрос ещё если я в запросе делаю временные таблицы их потом нужно уничтожать? или они сами уничтожаются?
15 Ненавижу 1С
 
гуру
18.04.12
10:41
(14) в пакете не нужно
16 Serginio1
 
18.04.12
10:51
(14) Нужно стараться избегать временные таблицы  и использовать подзапросы как в твоей ситуации для уменьшения конфликтов в TempDB и скорости, так как таблица физически создается. Но иногда для упрощения понимания запроса и для индексации применение временных таблиц оправдано.
17 ВежливаяТварь
 
18.04.12
10:56
(16) понял спасибо
(15) А где нужно?
18 Ненавижу 1С
 
гуру
18.04.12
10:58
(17) возможно может быть нужно в Менеджере
19 ВежливаяТварь
 
18.04.12
11:25
(18) понял спасибо