Имя: Пароль:
1C
1С v8
Логика СКД при применении полного соединения
0 Crush
 
27.03.13
11:35
Не могу сообразить. Есть два набора данных. Соединяю их. В результате получается полное соединение. А нужно левое. Наборы данных достаточно сложные, что бы методом тыка искать причину.
В инете нарыл, что скд делает полное соединение, когда в правой таблице есть условие на НЕ НУЛЛ.
Взял два простых набора и ни как не получается заставить скд делать полное соединение.

Цель темы: понять из-за чего возникает полное соединение и добиться на простом примере.

Набор данных 1
ВЫБРАТЬ
   "Стол" КАК Товар,
   "Красный" КАК Цвет
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Стул",
   "Синий"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Шкаф",
   "Белый"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.Товар КАК Товар,
   вт.Цвет КАК Цвет
{ВЫБРАТЬ
   Товар,
   Цвет}
ИЗ
   вт КАК вт

Набор данных 2
ВЫБРАТЬ
   "Стол" КАК Товар,
   "Кухня" КАК Склад,
   1 КАК Количество
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Стул",
   "Кухня",
   4
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.Товар КАК Товар,
   ЕСТЬNULL(вт.Склад, "") КАК Склад,
   ЕСТЬNULL(вт.Количество, 0) КАК Количество
{ВЫБРАТЬ
   Товар,
   Склад,
   Количество}
ИЗ
   вт КАК вт
ГДЕ
   (НЕ вт.Товар ЕСТЬ NULL )


Вывод: Таблица {Строки=Товар; Колонки = Склад; Ресурсы = Количество}

Срабатывает левое соединение. Как заставить СКД делать полное?
1 fisher
 
27.03.13
11:37
(0) "Как заставить СКД делать полное?"
Спроси это у того мудреца, который про него заикнулся.
2 el-gamberro
 
27.03.13
11:37
(0) Идешь в библиотеку. Берешь любую книгу по теории реляц. баз данных. Долго куришь. Потом долго смеешься на там какую ерунду ты написал в етой теме.

По сути убери условие

ГДЕ
   (НЕ вт.Товар ЕСТЬ NULL )
3 el-gamberro
 
27.03.13
11:39
Кстати говоря в (0) в запросе нет НИ ОДНОГО соединения, и етот человек спршивает как получить ПОЛНОЕ вместо ЛЕВОГО
4 fisher
 
27.03.13
11:40
(3) Писатель? Речь о наборах данных СКД.
5 Crush
 
27.03.13
11:41
(2) Без этого условия срабатывает левое соединение. И с ним тоже.
(3) Соединение наборов данных по полю Товар (думал, что это и так понятно)
6 Crush
 
27.03.13
11:44
Ссори! Речь не о полном, а о ВНУТРЕННЕМ соединении.
2 часа сна сказываются. Простите.

Вместо левого у меня получается внутреннее. Помогите разобраться от чего это зависит
7 fisher
 
27.03.13
11:46
(6) От кривых рук. Наборы данных всегда левым соединяются. Или докажи обратное на простом примере.
8 Crush
 
27.03.13
11:50
(7) Да вот за простым примером и обратился сюда. Если никто не сталкивался, то придется тогда упрощать свои наборы данных. Обязательно выложу.
9 fisher
 
27.03.13
11:56
(8) Проверь отборы СКД. Может, у тебя хитрый отбор накладывается на результат соединения, а тебе кажется что внутреннее отрабатывает.
10 Crush
 
27.03.13
12:02
Отбор ставится только на правый набор. Псевдоним поля отбора не совпадает с полями левого набора.
Если задать отбор приводящий к пустой правой таблице, то весь отчет получается пустой..
Эм... попробую ка я дать разные имена полям по которым соединяю..
11 fisher
 
27.03.13
12:08
(10) Это ТЫ ВООБРАЖАЕШЬ, что отбор ставится только на правый набор. Чтобы это стало реальностью, нужна магия фигурных скобок. А сейчас у тебя отбор применяется к РЕЗУЛЬТАТУ соединения наборов.
12 Classic
 
27.03.13
12:09
(10)
Отбор в СКД ставится уже на результирующую таблицу.
Если у тебя левое соединение, а отбор вешается на элементы из правой таблицы, то фактические нулы правой таблицы не попадают в вывод. А значит получаешь внутреннее соединение.
Что не понятно?
13 fisher
 
27.03.13
12:12
(12) Не внутреннее соединение, а результат аналогичный внутреннему соединению.
14 Classic
 
27.03.13
12:13
(13)
Пофиг :)
15 fisher
 
27.03.13
12:23
(14) Не пофиг. Вот благодаря такой формулировке, в мозгу ТС и поселилась ересь, что СКД умеет соединять наборы не только левым соединением.
16 Crush
 
27.03.13
12:26
Лёд тронулся.
Перенес отбор в параметы

В правой таблице было условие
{ГДЕ
   (ЕСТЬNULL(втДанные.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))).* КАК СравнениеНоменклатура}

Убрал

Теперь левая таблица полностью выводится. (Осталось вспомнить на кой я вчера это кривое условие добавил.)
17 Crush
 
27.03.13
12:33
(12) Да, точно! Такая штука и в обычных запросах есть когда
Выбрать что то
Из вт1
Левое соединение вт2
Где вт2.Поле1 = "бла бла"

Вроде условие ставишь на правую таблицу, а ограничивается весь результат

Спасибо за помощь!
18 fisher
 
27.03.13
13:20
(16) Хм... Если это условие было только в правом наборе и автозаполнение настроек было отключено - тогда должно было правильно отработать. Может, галка автозаполнения настроек стоит?
19 Crush
 
27.03.13
14:52
(18) Автозаполнение отключено на обоих наборах.
И это условие тоже было ни причем.

Второй набор данных выбирается из виртуальной таблицы оборотов регистра накопления. Если в параметрах таблицы написать .Обороты(, , , Измерение1=&ЗначениеИзмерения), то результат не ограничивается, а если
.Обороты(, , , {(Измерение1)}) или .Обороты(, , , {(Измерение1).*}), то весь результат ограничивается данными правой таблицы.

С параметром всё работает, но хочется пользоваться отбором скд. А сливать запросы обоих наборов - это уж очень тяжелая табличка получится. Хотя... Кто знает эту шибкоумную скд. Попробую.
20 Classic
 
27.03.13
15:00
(19)
С колокольни твоей логики ограничение на Измерение1 - это не отбор. Это фактически условие соединения.
21 fisher
 
27.03.13
15:21
(19) Хм... Очень странно. А попробуй Обороты(, , , {(Измерение1).* КАК ХитроеИмечко})
22 fisher
 
27.03.13
15:23
(21) + Подозреваю, что дефолтное имя отбора правой таблицы совпало с каким-то из левой.
23 Crush
 
27.03.13
15:32
(22) Отдельные имена уже давал. Всё равно строки с правыми нулами отбрасывает.
Чесал левой рукой правое ухо:
1) Ставил отбор не в параметры виртуальной таблицы а в секцию ГДЕ. Результат: Формируется долго и всё равно не выводит пустые значения.
2) Объединил наборы данных в один. Результат: Формируется долго. В группировку колонок попадает группировка по Null. т.е. лишняя пустая колонка выводится.

Интуиция мне подсказывает, что должно быть решение, работающее как с параметрами.
24 fisher
 
27.03.13
16:00
(23) Фигню подтверждаю. Смоделировал бяку на простом примере. Чешу репу...
25 Crush
 
27.03.13
16:00
Нашел у себя типовую демку бухгалтерии 2.0. Там простой пример сделал.
http://webfile.ru/6448135

Левый набор: ВЫБРАТЬ Ссылка из ПланСчетов.Хозрасчетный
Правый набор: ВЫБРАТЬ СчетРасходов, Организация, СуммаОборот ИЗ    РегистрНакопления.РеализацияУслуг.Обороты(, , , {(Организация)})

Соединение по Счет=СчетРасходов

Вывод Таблица:
Строки: Счета
Колонки: Органицации
Ресурс: СуммаОборот

Если не задавать отбор по организации, то будет весь план счетов и суммы по всем организациям. Если задать отбор, то счета будут не все.
26 Crush
 
27.03.13
16:05
Мне к зубному. Может кто догадается как решить задачу с использованием скд отбора без потери левого соединения. Результат должен быть такой же как если вместо СКД отбора задать параметр.
Платформы от 8.1.12.101 до 8.2.17.153
27 fisher
 
27.03.13
16:19
Ыыыыы!
Связь наборов компоновки данных таки может быть внутренней!
В конструкторе СКД этого нет, но у объекта "СвязьНаборовДанныхМакетаКомпоновкиДанных" есть свойство "ТипСвязи" типа "ТипСвязиНаборовДанныхКомпоновкиДанных" принимающее значения "Внешняя" и "Внутренняя".
Изначально она внешняя. Но как только в СКД устанавливается отбор в правом наборе, она какого-то муя автоматом меняется на внутреннюю!
28 Crush
 
28.03.13
09:42
Попробовал сначала временную таблицу получить, а потом её вставил в условие таблицы оборотов. Воз и ныне там.
ВЫБРАТЬ
   Организации.Ссылка
ПОМЕСТИТЬ втОрганизации
ИЗ
   Справочник.Организации КАК Организации
{ГДЕ
   Организации.Ссылка.* КАК ОрганизацияДляОтбора}
;

...
РегистрНакопления.РеализацияУслуг.Обороты(,,,Организация В (ВЫБРАТЬ вт.Ссылка ИЗ втОрганизации КАК вт))
...

Копаю в сторону изменения типа связи налету или может найдется способ ограничить интеллектуальные способности скд.
29 Crush
 
28.03.13
10:05
УРА!!!!!ПОБЕДА!!!
Ларчик просто открывался!:)))

Нужно в настройках ставить отбор не на весь отчет (глобальный отбор), а только на интересующую группировку. Тогда сохраняется левое соединение.

Рабочий пример для БП20 тут http://webfile.ru/6449381

Помогла тема v8: 3 набора в СКД - реально?
30 fisher
 
28.03.13
11:18
(29) Рад, что проблемка решилась, но глобально - всё равно неведомая фигня :(
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.