Имя: Пароль:
1C
1С v8
Не могу соединить 2 таблицы в рамках одного запроса
0 Azik2000
 
24.01.12
21:03
Привет всем. Выручайте, голову сломал, не могу написать запрос оптимально! Задача примерно следующая: Есть 2 таблицы, в одной список контрагентов, во второй документы определенного вида по контрагентам. Необходимо получить таблицу, где для каждого контрагента будет указана ссылка на документ, который является последним в рамках документооборота по этому контрагенту. Решить задачу одним запросом.
Смог написать работающий запрос, но он не надежный:

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

  ЛЕВОЕ СОЕДИНЕНИЕ Документ.Поставки КАК ДокументПоставки
  ПО ВложенныйЗапрос.КонтрагентСсылка = ДокументПоставки.Контрагент
     И ВложенныйЗапрос.ДатаПоставки = ДокументПоставки.Дата



Т.е. получается что я сначала нахожу дату последнего документа, а потом уже тем же соединением получаю информацию из документа. НО здесь не надежность, если на время последнего документа будет существовать несколько документов по контрагенту. ХЭЛППП !
1 Wobland
 
24.01.12
21:07
есть двадцать "последних" документов по контрагенту. какой из них твой?
2 zak555
 
24.01.12
21:07
выбрать первый док
док.контрол в спискеКотров
условие период
группировка по убыванию по доку
3 Wobland
 
24.01.12
21:08
и ВЫБРАТЬ ПЕРВЫЕ 1 УПОРЯДОЧИТЬ ПО Дата вроде как быстрее должно работать
4 Azik2000
 
24.01.12
21:09
(1) Любой из этих 20, если они в пределах одной секунды, главное чтобы левым соединением потом не размножить этого контрагента для каждого документа. Зак, напиши языком запросов, не получается у мну никак, пробовал я уже так
5 Wobland
 
24.01.12
21:12
не, ну а чо? делаешь (3), и всё начинает работать, не?
6 Azik2000
 
24.01.12
21:12
пытался я через "первые" и сортировку по дате сделать, не получилось у мну. Напишите плиз запрос, раз вам видно решение
7 Wobland
 
24.01.12
21:14
(6) что за Документ.Поставки? самописное?
8 Azik2000
 
24.01.12
21:18
(7) да, конфа не типовая, но это не суть важно. Вобланд, смотри, если через первые и сортировку, то обрубаются остальные контрагенты по списку, тут как то надо по хитрому. В общем не можу я написать, пробовал и так и этак. Прошу только советовать в тексте запроса
9 Wobland
 
24.01.12
21:24
я чего-то не понял. в ВложенныйЗапрос не отвечает требованиям? //не суди строго, у нас первый час уже
10 Wobland
 
24.01.12
21:24
(9) *а ВложенныйЗапрос
11 Azik2000
 
24.01.12
21:26
нет не отвечает, требования треьуют получить список контрагентов без повторения и для каждого документ последний. Если то что я написал использовать, то когда в одну секунду будут 3 документа по одному контрагенту, то левым соединением контрагентов тоже "разтроит", какбэ так
12 Wobland
 
24.01.12
21:29
ВЫБРАТЬ ПЕРВЫЕ 1 к Вложенному?
13 Wobland
 
24.01.12
21:29
(12) фигню сказал, пардоньте
14 Azik2000
 
24.01.12
21:32
вот и я изначально посчитал что быстро справлюсь, анннет. Толи просто день не мой и решение простое, но голова никак не поворачивается в сторону этого решения, толи тут надо действительно помозговать
15 Wobland
 
24.01.12
21:34
ТаблицаРаз - все контрагенты. ТаблицаДва - Контрагент+ПоследнийДокумент. соединяешь, получаешь искомое
16 Wobland
 
24.01.12
21:34
+(15) ну и НЕ ЭтоГруппа у ТаблицыРаз, наверное
17 Azik2000
 
24.01.12
21:39
слушай, раз - оп, два - тыдынс, три - вуаля. Не поняимать моя твоя. Напиши запросом! Но мне кажется что не так как посоветовал
18 Дядя Васька
 
24.01.12
21:44
(17) Ну типа выбрать первые с сортировкой взад наверное...
19 Azik2000
 
24.01.12
21:46
Гражданне, у кого еще есть варианты ......
20 Wobland
 
24.01.12
21:51
ну-ка

ВЫБРАТЬ ПЕРВЫЕ 1
   Поставки.Ссылка,
   Поставки.Контрагент,
   Поставки.Дата КАК Дата
ПОМЕСТИТЬ ВТ
ИЗ
   Документ.Поставки КАК Поставки

УПОРЯДОЧИТЬ ПО
   Дата УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   вт.Ссылка,
   вт.Контрагент,
   вт.Дата,
   Контрагенты.Ссылка КАК Ссылка1
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК вт
       ПО вт.Контрагент = Контрагенты.Ссылка
21 Дядя Васька
 
24.01.12
21:52
(19) Извини, но ты даже наверное не представляешь КАК впадлу мозгами скрипеть когда весь день тебя закидывают различными задачами по трое сразу, а к вечеру "выясняется" что ты оказывается весь день одну галочку рисовал... Мля, если эта дура завтра не оплатит, откачу как было нафик...
22 Wobland
 
24.01.12
21:54
(21) да ладно, подобная фигня, спать не иду из альтруизма ;)
23 Wobland
 
24.01.12
21:56
ВТ не то, конечно, даст, надо группировать по контрагенту с максимумом даты
24 Дядя Васька
 
24.01.12
21:57
(22) Да так-то не жалко... Просто когда люди торгуют железом составами и экономят даже на бумаге и соответственно прогах тоже. Ну ты понимаешь...
25 Wobland
 
24.01.12
21:58
(24) было дело, проходил ;)
26 Wingless
 
24.01.12
21:58
ВЫБРАТЬ
  ВложенныйЗапрос.КонтрагентСсылка,
  ВложенныйЗапрос.КонтрагентПредставление,
  МАКСИМУМ(ДокументПоставки.Ссылка) КАК ПоследняяПоставка
ИЗ
  (ВЫБРАТЬ
     Контрагенты.Ссылка КАК КонтрагентСсылка,
     Контрагенты.Наименование КАК КонтрагентПредставление,
     МАКСИМУМ(Поставки.Дата) КАК ДатаПоставки
  ИЗ
     Справочник.Контрагенты КАК Контрагенты
     ЛЕВОЕ СОЕДИНЕНИЕ Документ.Поставки КАК Поставки
     ПО Контрагенты.Ссылка = Поставки.Контрагент
  СГРУППИРОВАТЬ ПО Контрагенты.Ссылка,
                   Контрагенты.Наименование) КАК ВложенныйЗапрос

  ЛЕВОЕ СОЕДИНЕНИЕ Документ.Поставки КАК ДокументПоставки
  ПО ВложенныйЗапрос.КонтрагентСсылка = ДокументПоставки.Контрагент
     И ВложенныйЗапрос.ДатаПоставки = ДокументПоставки.Дата
СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.КонтрагентСсылка,
       ВложенныйЗапрос.КонтрагентПредставление,
27 Wingless
 
24.01.12
21:59
Предложения по использовать Выбрать первые пипец конечно...
28 Azik2000
 
24.01.12
22:00
Дядь Вась, держись. Как же я тебя понимаю ) Я сегодня на этот гребаный запрос потратил туеву хучу времени, и дернул меня язык пообещать юзеру что эту задачу можно решить за пол часа. Вобланд, вроде не совсем то получается, ты сначала получаеешь первый документ всеравно от какого контрагента, далее только для него стыкуешь таблицу с контрагентами, совсем даже не то
29 acsent
 
24.01.12
22:01
классический вопрос про срез последних ))
30 acsent
 
24.01.12
22:02
31 Wingless
 
24.01.12
22:04
(29) Мимо ))
32 Wobland
 
24.01.12
22:05
(31) ахха
33 Дядя Васька
 
24.01.12
22:08
(28) Ну я-то обещал за три и сделал за два, что заказывали-то. Еще в прошлую пятницу. В субботу одмины снесли что сделал, откатив базу на четверг, приехал восстановить вчерась, благо работал в копии 15 минут заняло. После чего посыпалось еще куча вопросов на два дня работы и в итоге претензия что я вообще обещал все сделать за три часа, а уже вон сколько вожусь, а сегодня так и вовсе весь день одну галочку делал (в шесть вечера попросили перенести на форму дока из обработки, просто начальница как раз подошла). Ну верну как было в тяпницу, фигли. Удалю с шифтом нахрен! :)
34 Wobland
 
24.01.12
22:09
ВЫБРАТЬ ПЕРВЫЕ 1
   Поставки.Контрагент,
   МАКСИМУМ(Поставки.Дата) КАК Дата,
   Поставки.Ссылка
ПОМЕСТИТЬ ВТ
ИЗ
   Документ.Поставки КАК Поставки

СГРУППИРОВАТЬ ПО
   Поставки.Контрагент,
   Поставки.Ссылка

УПОРЯДОЧИТЬ ПО
   Дата УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ.Контрагент,
   ВТ.Дата,
   Контрагенты.Ссылка КАК Ссылка1,
   ВТ.Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
       ПО (ВТ.Контрагент = Контрагенты.Ссылка)
35 Wobland
 
24.01.12
22:11
(33) мастдайщик ;) меня тут как-то обругали за ctrl+ins/shift+ins... я удаляю по F8 или Del ;)
36 Azik2000
 
24.01.12
22:13
(30) способ с актуальными курсами валют без применения среза последних тут не применим, я в курсе его, но тут другой случай.
(33) а в чем была причина руганья то ?
37 Vahe
 
24.01.12
22:15
(36) используй момент времени
38 Wobland
 
24.01.12
22:16
(36) иди уже (34) проверяй, мне интересно
39 Wobland
 
24.01.12
22:16
(37) он сказал, пофих, пусть так и будет. пока не вкурит
40 Vahe
 
24.01.12
22:17
и сгруппировать не нужно
41 Дядя Васька
 
24.01.12
22:17
(35) Ctrl-Ins Shift-Ins и сам пользуюсь до сих пор, просто Shift с Del'ом уже в винде придумали, раньше не было такого )
42 Vahe
 
24.01.12
22:18
больше чем момент времени последнего документа по контрагенту нету
43 Дядя Васька
 
24.01.12
22:19
(36) Да жадные они просто. Хотят внедрение восьмерки за три часа... Руганье сильно сказано конечно, оплатят я думаю, но фиксировать там надо каждый чих...
44 Azik2000
 
24.01.12
22:24
Вобланд, (34) тут совсем никак не канает, вариант у (26) получается самый оптимальный.
(43) Вот потому при поиске нового места работы всегда отсекал франчи и консалтинги, каждый чих нужно фиксировать, за каждый пук доплачивать. Заказчика жаба душить начинает когда начинает считать все. На одном месте работа как то менее "напрягающая", сидишь себе, ковыряешь то что сам раньше написал, все в курсе, оптимизируешь там кусочек, там кусочек. Да хоть и ничего не делаешь, значешь что в конце месяца получишь то что и в прошлом
45 Wobland
 
24.01.12
22:25
(41) кстати, в то же фаре шифт+дел - о том же. лично я переназначил кнопку дел ;)
46 Vahe
 
24.01.12
22:28
(44) можно без СГРУППИРОВАТЬ
можно через ЛЕВОЕ СОЕДИНЕНИЕ + ГДЕ
47 Wobland
 
24.01.12
22:28
(44) получилось или где? скажи (26) отчётливое спасибо. я как-то сегодня на призы не рассчитывал, но работал всеръёз. с учётом того, что уже пол-второго
48 Azik2000
 
24.01.12
22:32
Ребят, всем огроменное спасибо за приятный не напрягающий многолог, Wingless особая благодарность, за четко выложенный вариант верного решения. Ну и конечно же Wobland, дружищще, конечно тебе спасибо за активное участие.
49 Azik2000
 
24.01.12
22:34
(46) на счет вариванта без применения "Сгруппировать", как то даже не представляю решения, напиши если не сложно свой вариант