Имя: Пароль:
1C
1С v8
Помогите понять условие связи 2х таблиц
0 Sekuda
 
27.04.17
16:17
Запрос большой в нем есть связь двух таблиц.
Первая таблица - периодический регистр сведений "АкцииСрезПоследних", вторая таблица - табличная часть документа Акция - "АкцияПолучатели".
Эти таблицы связаны по регистратору левое соединение и ещё одно левое соединение с условием связи:

(АкцияПолучатели.Контрагент = &Контрагент И АкцияПолучатели.Магазин = &Магазин ИЛИ АкцияПолучатели.Контрагент = &Контрагент И АкцияПолучатели.Магазин = ЗНАЧЕНИЕ(Справочник.Магазины.ПустаяСсылка)


Не могу понять логику этой связи, на количество записей в выборке оно не влияет, но во всех записях поле АкцияПолучатели.Контрагент заменяется на значение &Контрагент. Помогите понять как работает это условие связи.
1 Лефмихалыч
 
27.04.17
16:20
Это то же самое, что
контрагент=&контрагент и магазин в (&Магазин, ПустаяСсылка)

ни чего ни где не заменяется.
записи с каким-то другим контрагентом просто не попадают в выобрку
2 Sekuda
 
27.04.17
16:24
(1) Я тоже так сперва подумал, но когда я из документа удаляю записи с другими контрагентами (провожу его), в выгрузке этого запроса количество записей тоже уменьшается
3 vicof
 
27.04.17
16:27
По связи нельзя судить о всем запросе, юный падаван.
4 Лефмихалыч
 
27.04.17
16:28
(2) а соединение у тебя какого типа?
5 Sekuda
 
27.04.17
16:34
(4) Левые соединения
6 Serg_1960
 
27.04.17
16:34
"Эти таблицы связаны по регистратору[!] левое соединение" --> "удаляю записи с другими контрагентами... количество записей тоже уменьшается"
7 Лефмихалыч
 
27.04.17
16:39
(5) короче, вопрос твой в чем? Если в том, что означает условие, то ответ в (1).
Если, почему у тебя количество записей меняется или не меняется, то ответ еще проще - ты где накосячил с измерениями.
8 Sekuda
 
27.04.17
16:39
(6) Всё верно и это означает что условие "контрагент=&контрагент и магазин в (&Магазин, ПустаяСсылка)" не исключает записи с другими контрагентами, это как раз то чего я не могу понять.
9 Лефмихалыч
 
27.04.17
16:40
(7) измерения - не те, которые у регистров, а те, которые measurements. То ли удалил не то и не оттуда, то ли посмотрел потом не туда. Не может быть такого, короче. Либо ты что-то важное не сообщил.
10 Лефмихалыч
 
27.04.17
16:41
(8) исключает оно записи с другими контрагентами. Насовсем. Железно исключает.
11 Sekuda
 
27.04.17
16:42
<code>test<\code>
12 Sekuda
 
27.04.17
16:50
https://i.paste.pics/1MRHS.png

Обрезал запрос как мог.
Если удаляю из документа контрагента РПСтрой, то в результате запросе - одна запись.
Вопрос: почему? :)
13 h-sp
 
27.04.17
16:54
(10) вообще-то количество записей не зависит от строчки АкцияПолучатели.Контрагент = &Контрагент

поэтому если он удаляет там в документе строчки с другими контрагентами, количество записей уменьшится естественно. То есть нигде он не накосячил, всё правильно работает.
14 Sekuda
 
27.04.17
17:00
Методом проб, могу сделать вывод, что такая связь: к каждой записи левой таблица цепляет запись правой таблицы удовлетворяющей условию.
15 h-sp
 
27.04.17
17:03
(14) ну вот. В левой таблице у вас все контрагенты. Они всегда все.
16 Buster007
 
27.04.17
17:20
А почему по контрагенту не соединяем?
17 Sekuda
 
27.04.17
17:28
(16) Хороший вопрос. В данном, обрезанном, примере было бы достаточно соединить по контрагенту, но в полном запросе такой вариант не подходит.
18 Serg_1960
 
27.04.17
17:57
Потому что в ГДЕ исключается условие отбора по контрагенту, если в  регистраторе установлена галочка "Для всех получателей".
19 Лефмихалыч
 
27.04.17
20:32
(12) Когда ты удаляешь одну строчку из документы, ты получаешь одну строчку в запросе потому, что ты удаляешь строчку из документа.
У тебя запрос после записи в БД, а строчки в документе = записи в регистре.