Имя: Пароль:
1C
 
Как соединить 3 таблицы в запросе 1с?
0 maksyandra
 
23.03.17
22:03
Как соединить 3 таблицы в запросе 1с???

Таблица 1:
Контрагент  | Возраст
------------+-------
Иван        | 12
Тарас       | 34
Юра         | 23

Таблица 2:
Контрагент  | НомерПаспорта
------------+-------
Иван        | 123
Тарас       | 345
Юра         | 023  

Таблица 3:
Контрагент  | Адрес
------------+-------
Иван        | Ватутина
Тарас       | Пушкина
Юра         | Гагарина

На выходе нужно получить таблицу 4.

Таблица 4:
Контрагент  | Адрес     Возраст    НомерПаспорта
------------+-------
Иван        | Ватутина     12          123
Тарас       | Пушкина      34          345
Юра         | Гагарина     23          023
1 XLife
 
23.03.17
22:09
(0) Как соединить 3 таблицы в запросе 1с???
по контрагенту
2 maksyandra
 
23.03.17
22:34
(1) Это понятно. Что в запросе делать??
3 youalex
 
23.03.17
22:40
(2) Соединение
4 EvgeniuXP
 
23.03.17
22:45
в твоем случае - внутреннее, чтоб не разбираться с левым и правым :)
5 CepeLLlka
 
23.03.17
22:46
(2)https://www.youtube.com/watch?v=tcW5mCMLrPo

Погляди по ссылке, всё доходчиво объясняется.
6 maksyandra
 
23.03.17
22:46
(3) Выдает что-то типа этого
Иван        | Ватутина     0          0
Иван        |    0         12         0
Иван        |    0         0          123
Тарас       | Пушкина      0          0
Тарас       |    0         34         0
Тарас       |    0         0          345
Юра         | Гагарина     0          0
Юра         |    0         23         0
Юра         |    0         0          023
7 EvgeniuXP
 
23.03.17
22:46
Возьми книжку волшебника - почитай там про соединения.
8 EvgeniuXP
 
23.03.17
22:47
(6) две галки поставь
9 youalex
 
23.03.17
22:47
(6) запрос покажи
10 EvgeniuXP
 
23.03.17
22:48
наоборот сними :)
11 maksyandra
 
23.03.17
22:49
(9)
ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент КАК Контрагент,
    ДанныеЧленовКооператива.Значение КАК Область,
    NULL КАК Район,
    NULL КАК НаселенныйПункт
ИЗ
    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ
    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.Область)

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

ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент,
    NULL,
    ДанныеЧленовКооператива.Значение,
    NULL
ИЗ
    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ
    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.Район)

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

ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент,
    NULL,
    NULL,
    ДанныеЧленовКооператива.Значение
ИЗ
    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ
    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.НаселенныйПункт)
12 maksyandra
 
23.03.17
22:51
(8) (9) Какие галки?
13 youalex
 
23.03.17
22:58
(11) Контрагент у тебя кто? Справочник.Контрагенты?
Вот к нему цепляй через  ЛС

Типа
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
ЧленыОбласть.Значение КАК Область
ИЗ Справочник.Контрагенты КАК Контрагенты
ЛС РегистрСведений.ДанныеЧленовКооператива КАК ЧленыОбласть ПО   Контрагенты.Ссылка = ЧленыОбласть.Контрагент И ЧленыОбласть.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.Область)
14 d546
 
23.03.17
22:59
не показывай больше запросы :) не твое
15 maksyandra
 
23.03.17
23:01
(14) А что не так?
16 d546
 
23.03.17
23:03
(15) используй подсказки из постов 3 и 4

и ищи различие между словами "соединить" и "объединить"
17 maksyandra
 
23.03.17
23:36
(16) И мне каждую таблицу нужно соединить с каждой???
18 NorthWind
 
24.03.17
07:15
(17) нет, каждую с каждой не надо. При написании запроса достаточно чтобы каждая таблица поучаствовала в соединении, а дальше уже движок для работы с запросами сам все поймёт.
19 1dvd
 
24.03.17
07:26
20 maksyandra
 
24.03.17
11:44
(18) Вот запрос. В таком виде выводит пустые строки.

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент,
    ДанныеЧленовКооператива.Значение КАК НомерПаспорта
ПОМЕСТИТЬ ТабНомерПаспорта
ИЗ
    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ
    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.НомерПаспорта)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТабНаселенныйПункт.Контрагент,
    ТабНаселенныйПункт.НаселенныйПункт,
    ТабДатаРождения.ДатаРождения,
    ТабНомерПаспорта.НомерПаспорта,
    ТабСерияПаспорта.СерияПаспорта
ИЗ
    ТабНаселенныйПункт КАК ТабНаселенныйПункт
        ПОЛНОЕ СОЕДИНЕНИЕ ТабДатаРождения КАК ТабДатаРождения
            ПОЛНОЕ СОЕДИНЕНИЕ ТабСерияПаспорта КАК ТабСерияПаспорта
                ПОЛНОЕ СОЕДИНЕНИЕ ТабНомерПаспорта КАК ТабНомерПаспорта
                ПО ТабСерияПаспорта.Контрагент = ТабНомерПаспорта.Контрагент
            ПО ТабДатаРождения.Контрагент = ТабСерияПаспорта.Контрагент
        ПО ТабНаселенныйПункт.Контрагент = ТабДатаРождения.Контрагент
21 maksyandra
 
24.03.17
11:51
Вот последний вариант, но все равно все строки не соединяет, что не так???

ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент КАК Контрагент,
    ДанныеЧленовКооператива.Значение КАК НаселенныйПункт,
    ДанныеЧленовКооператива.Значение.КодКОАТУУ КАК КодКОАТУУ
ПОМЕСТИТЬ ТабНаселенныйПункт
ИЗ РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.НаселенныйПункт)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент,
    ДанныеЧленовКооператива.Значение КАК ДатаРождения
ПОМЕСТИТЬ ТабДатаРождения
ИЗ    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.ДатаРождения)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент,
    ДанныеЧленовКооператива.Значение КАК СерияПаспорта
ПОМЕСТИТЬ ТабСерияПаспорта
ИЗ    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.СерияПаспорта)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеЧленовКооператива.Контрагент,
    ДанныеЧленовКооператива.Значение КАК НомерПаспорта
ПОМЕСТИТЬ ТабНомерПаспорта
ИЗ    РегистрСведений.ДанныеЧленовКооператива КАК ДанныеЧленовКооператива
ГДЕ    ДанныеЧленовКооператива.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.РеквизитыДаныхЧленовКооператива.НомерПаспорта)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ТабНаселенныйПункт.Контрагент, ЕСТЬNULL(ТабДатаРождения.Контрагент, ЕСТЬNULL(ТабНомерПаспорта.Контрагент, ТабСерияПаспорта.Контрагент))) КАК Поле1,
    ТабНаселенныйПункт.НаселенныйПункт,
    ТабДатаРождения.ДатаРождения,
    ТабНомерПаспорта.НомерПаспорта,
    ТабСерияПаспорта.СерияПаспорта
ИЗ    ТабНаселенныйПункт КАК ТабНаселенныйПункт
        ПОЛНОЕ СОЕДИНЕНИЕ ТабДатаРождения КАК ТабДатаРождения
            ПОЛНОЕ СОЕДИНЕНИЕ ТабСерияПаспорта КАК ТабСерияПаспорта
                ПОЛНОЕ СОЕДИНЕНИЕ ТабНомерПаспорта КАК ТабНомерПаспорта
                ПО ТабСерияПаспорта.Контрагент = ТабНомерПаспорта.Контрагент
            ПО ТабДатаРождения.Контрагент = ТабСерияПаспорта.Контрагент
        ПО ТабНаселенныйПункт.Контрагент = ТабДатаРождения.Контрагент
22 catena
 
24.03.17
11:57
(21)Составь полную выборку контрагентов и к ней присоединяй паспорта и дни рождения.
23 maksyandra
 
24.03.17
12:00
(22) Мне не нужна полная выборка контрагентов. Только те который есть в регистре
24 dezss
 
24.03.17
12:05
чета вроде этого

Выбрать таблица1.Контрагент,
    таблица1.Возраст,
    таблица2.НомерПаспорта,
    таблица3.адрес
Из таблица1 как таблица1
  левое соединение таблица2 как таблица2
  по таблица1.контрагент = таблица2.контрагент
  левое соединение таблица3 как таблица3
  по таблица1.контрагент = таблица3.контрагент
25 maksyandra
 
24.03.17
12:21
(24) А если в таблицах 2 и 3 есть записи с контрагентами которых нет в таблице 1 их не выведет при таком соединении.
26 VladZ
 
24.03.17
12:23
(0) Также, как соединить две.
27 dezss
 
24.03.17
12:23
(25) Ну тогда брать справочник контрагентов и к нему все цеплять
Как поставлена задача, так и решение написано.
А если есть несколько адресов у одного контрагента и т.п.?
28 catena
 
24.03.17
12:33
(23)Составь полную выборку контрагентов ИЗ ПЕРВЫХ ТРЕХ ЗАПРОСОВ и к ней присоединяй паспорта и дни рождения.
29 HardBall
 
24.03.17
13:14
(0) Самое интересное, что 4 таблица исходя из задачи и так находится как минимум в 3НФ, зачем такая декомпозиция.
30 Maniac
 
24.03.17
13:22
О тема интересная.

А как есть есть две таблицы значений (не регистры каки то)

И в одной не дополнено несколько колонок которые есть в другой.
Таблицы разного размера.

В одной таблице есть много строк, в которой нужно допролнить значение из другой таблицы.

Обе таблицы связывает одна колонка со значением которое есть и в одной и в другой. Ключ.

В общем надо чтобы в одной ТЗ заполнить данные из другой ТЗ по связи ключа.
Без циклов.

Сейчас идет перебор с методом Найти (используется ключ)
Но надо сделать чтобы это было в РАЗЫ быстрее.
31 Maniac
 
24.03.17
13:25
Запрос не поможет - так как - эти таблицы являются обьектами.

Запросы потребуют выгрузки этих таблиц. А также даже если мы каким то образом получим запрос - еще надо будет и загружать.

Таблицы огромные. И времени на выгрузки и загрузки обратно в 1С тоже как бы не пять секунд делается.

Очень печально вто в 1С нет таких встроенных методов по какому то ключу-колонке заполнить значения из другой таблицы.
32 DrShad
 
24.03.17
13:37
(31) [Запрос не поможет - так как - эти таблицы являются обьектами]

источником данных для запроса может быть и объект
33 DrShad
 
24.03.17
13:37
а если их загнать как внешние источники данных то вообще все элементарно
34 Maniac
 
24.03.17
13:46
(33) слабо себе представляю что в внешние истоники можно загнать таблицы значений вшитые в обработку
35 Maniac
 
24.03.17
13:47
В общем то я попробовал вчера даже просто через выгрузку таблиц и передачу в запрос.

Но запрос ругается на вторую таблицу хоть тресни. и не понятно как сделать соединение.
36 DrShad
 
24.03.17
13:48
(34) слабо себе представляю как можно вшить в обработку ТЗ
37 DrShad
 
24.03.17
13:48
(35) для того чтобы запрос съел таблицу значений в ней должны быть типизированы колонки
38 Maniac
 
24.03.17
13:55
(36) табличная часть обработки.
Обе.
39 Maniac
 
24.03.17
13:55
Тапизированы естественно.
40 Maniac
 
24.03.17
13:57
о епс заработало!
41 1dvd
 
24.03.17
13:57
(35) >>Но запрос ругается на вторую таблицу хоть тресни. и не понятно как сделать соединение.

Как ругается-то? Маня, ты чо как маленький?
42 DrShad
 
24.03.17
13:58
(40) с пятницей
43 Maniac
 
24.03.17
13:58
СвойстваНоменклатуры  = Объект.СвойстваНоменклатуры.Выгрузить();
    ТаблицаНоменклатуры = Объект.ТабличнаяЧасть.Выгрузить();
    
    ТектЗапроса =
    "ВЫБРАТЬ
    |    СвойстваНоменклатуры.КлючСтроки КАК КлючСтроки,
    |    СвойстваНоменклатуры.ВидНоменклатуры КАК ВидНоменклатуры,
    |    СвойстваНоменклатуры.НаборСвойств КАК НаборСвойств,
    |    СвойстваНоменклатуры.Свойство КАК Свойство,
    |    СвойстваНоменклатуры.Значение КАК Значение,
    |    СвойстваНоменклатуры.Индивидуальные КАК Индивидуальные,
    |    СвойстваНоменклатуры.ТипЗначенияТекст КАК ТипЗначенияТекст,
    |    СвойстваНоменклатуры.БезСвойств КАК БезСвойств
    |ПОМЕСТИТЬ ВременнаяСвойстваНоменклатуры
    |ИЗ
    |    &СвойстваНоменклатуры КАК СвойстваНоменклатуры
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    КлючСтроки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТаблицаНоменклатуры.КлючСтроки КАК КлючСтроки,
    |    ТаблицаНоменклатуры.Номенклатура КАК Номенклатура
    |ПОМЕСТИТЬ ВременнаяТаблицаНоменклатуры
    |ИЗ
    |    &ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    КлючСтроки
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВременнаяСвойстваНоменклатуры.КлючСтроки КАК КлючСтроки,
    |    ВременнаяСвойстваНоменклатуры.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ВременнаяСвойстваНоменклатуры.НаборСвойств КАК НаборСвойств,
    |    ВременнаяСвойстваНоменклатуры.Свойство КАК Свойство,
    |    ВременнаяСвойстваНоменклатуры.Значение КАК Значение,
    |    ВременнаяСвойстваНоменклатуры.Индивидуальные КАК Индивидуальные,
    |    ВременнаяСвойстваНоменклатуры.ТипЗначенияТекст КАК ТипЗначенияТекст,
    |    ВременнаяСвойстваНоменклатуры.БезСвойств КАК БезСвойств,
    |    ВременнаяТаблицаНоменклатуры.Номенклатура КАК Номенклатура
    |ИЗ
    |    ВременнаяСвойстваНоменклатуры КАК ВременнаяСвойстваНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблицаНоменклатуры КАК ВременнаяТаблицаНоменклатуры
    |        ПО ВременнаяСвойстваНоменклатуры.КлючСтроки = ВременнаяТаблицаНоменклатуры.КлючСтроки";
    
    Запрос = Новый Запрос();
    Запрос.Текст = ТектЗапроса;
    Запрос.УстановитьПараметр("СвойстваНоменклатуры", СвойстваНоменклатуры);
    Запрос.УстановитьПараметр("ТаблицаНоменклатуры", ТаблицаНоменклатуры);
    
    РезультатЗапроса = Запрос.Выполнить();
    Объект.СвойстваНоменклатуры.Загрузить(РезультатЗапроса.Выгрузить());
44 Волшебник
 
модератор
24.03.17
13:58
(40) Ждём новую версию Мегапрайса
45 DrShad
 
24.03.17
14:01
а когда он еще для себя откроет менеджер временных таблиц, не говоря про СКД, то ......
46 Maniac
 
24.03.17
14:04
(45) рассказывай секрет)
47 DrShad
 
24.03.17
14:06
(46) я понаблюдаю лучше )))
48 Oftan_Idy
 
24.03.17
14:07
(46) деньги давай, да
49 Maniac
 
24.03.17
14:08
(48) нивапрос. Подключайся разжую проблему. Заплачу за каждый час 2500
50 1dvd
 
24.03.17
14:08
Скопирую сюда описание менеджера временных таблиц из СП за 500 руб
51 Oftan_Idy
 
24.03.17
14:12
(49) Проблема то в чем?
Тебе уже выше написали все.
Помещаешь в запрос параметр - табличную часть.
Выбираешь во временную таблицу с обязательно типизацией.
Соединяешь левым соединением, берешь колонку из второй таблицы. ерунда
И быстро все будет
52 Maniac
 
24.03.17
14:14
(51 - (43) уже заработало.
53 DrShad
 
24.03.17
14:18
(49) куда подключаться?
54 Oftan_Idy
 
24.03.17
14:20
эээ, а деньги ?
55 DrShad
 
24.03.17
14:22
(54) он о других проблемах
56 Maniac
 
24.03.17
14:27
(53) выходи на связь. тебя давно знаю. ты ж даже вроде из Ростова.
Поболтаем. Давно ищу себе помощника.
Готов при нормальном раскладе мотивировать
57 DrShad
 
24.03.17
14:28
(56) я не из Ростова )))
58 Maniac
 
24.03.17
14:31
Значения не имеет) помню общались.

В общем по теме (0) в (43) реальный пример
Думаю задача закрыта у автора
59 maksyandra
 
24.03.17
14:47
Всем спасибо. Проблему решил. Последовав совету (28)
60 maksyandra
 
24.03.17
14:48
(58) Да, задача закрыта.