|
|
|
Последний документ по каждому контрагенту одним запросом | ☑ | ||
|---|---|---|---|---|
|
0
Odavid
13.07.10
✎
13:50
|
Что-то никак не соображу над хитрой задачей. В коде это можно сделать циклом, а в запрсое?
Нужно выбрать любой последний документ по каждому контрагенту одним запросом. Т.е. получить список "Контрагент - Документ". По одному любому понятно: ВЫБРАТЬ ПЕРВЫЕ 1 ВзаиморасчетыСКонтрагентами.Регистратор, ВзаиморасчетыСКонтрагентами.Регистратор.Дата КАК Дата ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Регистратор, ВзаиморасчетыСКонтрагентами.Регистратор.Дата УПОРЯДОЧИТЬ ПО |
|||
|
1
Odavid
13.07.10
✎
13:51
|
УПОРЯДОЧИТЬ ПО
Дата УБЫВ |
|||
|
2
73
13.07.10
✎
13:53
|
||||
|
3
stangen
13.07.10
✎
13:54
|
так?
ВЫБРАТЬ МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор) КАК Регистратор, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента.Владелец КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента.Владелец |
|||
|
4
Defender aka LINN
13.07.10
✎
13:57
|
Мда
|
|||
|
5
Cube
13.07.10
✎
14:05
|
(3) Думаю, что это не реально, т.к. МоментВремени не доступен в запросе, а дата у документов может быть и одинаковая...
|
|||
|
6
ptiz
13.07.10
✎
14:06
|
(3) Не так.
Сначала выбираешь: Максимум(Дата) КАК МаксДата Контрагент Потом соединяешь по МаксДата и Контрагент и получаешь Максимум(Регистратор) |
|||
|
7
Defender aka LINN
13.07.10
✎
14:08
|
(5) "МоментВремени не доступен в запросе" - да что ты говоришь...
|
|||
|
8
Cube
13.07.10
✎
14:09
|
(6) Сделали на ООО "Рога и копыта" два документа "Реализация товаров и услуг" с датой 01.07.2010 23:59:59 и что тебе запрос выдаст?
(7) А ты не согласен? |
|||
|
9
Odavid
13.07.10
✎
14:10
|
(3) МАКСИМУМ дает последний по номеру, что не так верно.
Хотя в большинстве случаев работает. |
|||
|
10
Jstunner
13.07.10
✎
14:11
|
(8)
ВЫБРАТЬ АвансовыйОтчет.МоментВремени ИЗ Документ.АвансовыйОтчет КАК АвансовыйОтчет |
|||
|
11
ptiz
13.07.10
✎
14:14
|
(8) Читай последнее предложение в (6)
|
|||
|
12
Cube
13.07.10
✎
14:14
|
(9) Ага, не правильный результат, тоже результат, да?
|
|||
|
13
Defender aka LINN
13.07.10
✎
14:14
|
(8) Категорически.
http://s45.radikal.ru/i110/1007/5d/86355bccd92b.jpg |
|||
|
14
Cube
13.07.10
✎
14:16
|
(13) Вау)) Чтоб я сдох... :)
|
|||
|
15
Odavid
13.07.10
✎
14:16
|
(12) нет, просто если повывшение номера совпадает с прямым изменением даты (новый номер - более новая дата), то все нормально, работает. Но это если учет путный.
А если дата свежая, а номер - из середины, то все ломается. |
|||
|
16
Renat11111
13.07.10
✎
14:16
|
(14) Ты пишешь чушь.
|
|||
|
17
Cube
13.07.10
✎
14:17
|
(16) Напиши не чушь, умник
|
|||
|
18
Cube
13.07.10
✎
14:18
|
(13) Запрос напишешь? :)
|
|||
|
19
Renat11111
13.07.10
✎
14:19
|
(17) то что ты написал (8) это чушь. (18) а на фига мне это нужно? думать лень
|
|||
|
20
Cube
13.07.10
✎
14:20
|
(19) Во-первых, про (8) обоснуй.
Во-вторых, (18) не тебе. В-третьих, думать лень - не мешай другим, флудераст. |
|||
|
21
Odavid
13.07.10
✎
14:21
|
Максимум к Дата не работает "корректно":
МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор.Дата) Нужно в группировку вводить и Регистратор (поле это нужно), а это уже не послдений тогда - а все документы-Регистраторы. Решение где-то рядом, через Соединение попробую поиграться.... |
|||
|
22
Renat11111
13.07.10
✎
14:22
|
(20) кто флудераст кто п-ас. Каждому свое.
|
|||
|
23
Черный всадник
13.07.10
✎
14:22
|
(13) Момент времени не прокатит :(
|
|||
|
24
Широкий
13.07.10
✎
14:24
|
(7) На момент времени нельзя накинуть функцию (например максимум)
|
|||
|
25
Cube
13.07.10
✎
14:24
|
(21) Тебе нужно с МоментомВремени играть, а не с датой документа. А это можно сделать только в коде.
(22) Всё с тобой ясно. |
|||
|
26
Renat11111
13.07.10
✎
14:29
|
Кстати а почему нельзя упорядочить вначале по дате, а потом по номеру дока? если к момент времени нельзя применять МАКСИМУМ?
|
|||
|
27
luckyluke
13.07.10
✎
14:31
|
(26) потому что можно по ссылке сделать максимум.
Из справки: МоментВремени (PointInTime) Тип: МоментВремени. Содержит момент времени документа (включает дату и ссылку на документ). |
|||
|
28
Jstunner
13.07.10
✎
14:31
|
МАКСИМУМ(Ссылка) надо
|
|||
|
29
Широкий
13.07.10
✎
14:33
|
(28) Максимум по ссылке вовсе не значит что будет максимум по дате
|
|||
|
30
Odavid
13.07.10
✎
14:35
|
(28) а как это - максимум по ссылке? Что за условие макисмума, которое можно наложить на ссылку? Регистратор включает Период (МоментВрмени), а ссылка? По-моему, включает, но не период документа.
|
|||
|
31
Odavid
13.07.10
✎
14:36
|
(29) да, это точно.
|
|||
|
32
AversDik2
13.07.10
✎
14:36
|
ВЫБРАТЬ
Поставщики.ДоговорКонтрагента.Владелец, Поставщики.Регистратор ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами1 ПО ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента.Владелец = ВзаиморасчетыСКонтрагентами1.ДоговорКонтрагента.Владелец И ВзаиморасчетыСКонтрагентами .МоментВремени < ВзаиморасчетыСКонтрагентами1.МоментВремени ГДЕ ВзаиморасчетыСКонтрагентами1.Договор ЕСТЬ NULL |
|||
|
33
Odavid
13.07.10
✎
14:38
|
Вот, дошлифовал с форума Радченко, работает:
ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Регистратор, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор.Дата) КАК Дата, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент) КАК ДатаПоследнегоДокумента ПО ВзаиморасчетыСКонтрагентами.Контрагент = ДатаПоследнегоДокумента.Контрагент И ВзаиморасчетыСКонтрагентами.Регистратор.Дата = ДатаПоследнегоДокумента.Дата ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее |
|||
|
34
Renat11111
13.07.10
✎
14:39
|
(33) а если будет как мой друг в (8) написал?
|
|||
|
35
luckyluke
13.07.10
✎
14:42
|
(33) тебе еще нужен максимум по ссылке, на одну дату может быть несколько документов.
|
|||
|
36
Renat11111
13.07.10
✎
14:42
|
о Давид! ответь на (34) если будет два документа с одной датой с точностью до секунды что ты получишь вот тут ВзаиморасчетыСКонтрагентами.Регистратор?
|
|||
|
37
73
13.07.10
✎
14:43
|
(33) Во вложенном тоже условие на вид регистратора надо...
|
|||
|
38
Odavid
13.07.10
✎
14:44
|
(36) получу первый из них. Да, нужно условие, только, наверное, не по ссылке, а во МАКСИМУМ(Регистратор).
|
|||
|
39
luckyluke
13.07.10
✎
14:45
|
(38) МАКСИМУМ(Регистратор) - а это по чем у тебя максиму? по Объекту?
|
|||
|
40
Широкий
13.07.10
✎
14:49
|
(33) Все равно не избавляет от ситуации когда на одно время выписаны два дока
|
|||
|
41
Renat11111
13.07.10
✎
14:49
|
Потом еще раз запрос запости интересно посмотреть до чего тебя Радченко и Миста довели...
|
|||
|
42
Odavid
13.07.10
✎
14:50
|
(37) да, точно, иначе найдет последний из других документов, если Регистраторов много....
(39) нет, получается, надо выбрать оба максимальных по дате, а из них - максимальный по номеру. Но у нас даты все равно не совпадают в секундах, так что для нас это не обязательно. Если кто допишет - спасибо, просто, мне надо мой еще ввинтить по всем остальным документам... тут своих еще нюансов полно... |
|||
|
43
Renat11111
13.07.10
✎
14:51
|
(42) если пока не совпадает, это не значит что никогда не будет не совпадать. закон мерфи если неприятность может случиться, то она случается.
|
|||
|
44
Odavid
13.07.10
✎
14:52
|
(41) :)
У меня в запросе больше ничего интересного - еще только десяток видов доков вводится. А доработать до еще и максимум по номеру во вложенном - пока не могу, нет времени. Если кто успеет раньше - я думаю, мы все будеи благодарны :) |
|||
|
45
Odavid
13.07.10
✎
14:54
|
(43) увы, не объяснишь, что если ошибка может случится, поэтому я написал отлов ошибки, из-за этого немного не успел... Только ведь и спросят - а нафига? Самому тошно так работать.
|
|||
|
46
73
13.07.10
✎
14:56
|
(44) Ну так добавить максимум еще один...
ВЫБРАТЬ Максимум(ВзаиморасчетыСКонтрагентами.Регистратор) как Регистратор, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор.Дата) КАК Дата, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент) КАК ДатаПоследнегоДокумента ПО ВзаиморасчетыСКонтрагентами.Контрагент = ДатаПоследнегоДокумента.Контрагент И ВзаиморасчетыСКонтрагентами.Регистратор.Дата = ДатаПоследнегоДокумента.Дата ГДЕ ВзаиморасчетыСКонтрагентами.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент |
|||
|
47
Odavid
13.07.10
✎
15:00
|
Да, (32) не совсем понял - ищется максимальный по времени методом перебора? Так не работает ведь так.
И зачем еще условие, что те, у кого нет Договора? А ДоговорКонтрагента тогда что такое? И потом, у меня не по договорам... (46) а разве я уже не выбрал единственный документ (дату) во вложенном запросе? Из чего будет Максимум выбираться во внешнем? |
|||
|
48
Odavid
13.07.10
✎
15:03
|
(46) другими слолвами - нужен список из двух и более документов (дат), чтобы выбрать, а во вложенном выбирается единственный по последней дате сразу, и только транслируется с полем Регистратор во внешнем.
|
|||
|
49
73
13.07.10
✎
15:06
|
(47)(48) Максимум по регистратору нужен, если на одну и ту же датувремя(определяемую во вложенном) есть несколько документов.
|
|||
|
50
Renat11111
13.07.10
✎
15:10
|
(48) У меня к тебе один вопрос почему у тебя в карточке везде 1 стоит? Поставь везде NULL так оригинальнее.
|
|||
|
51
AversDik2
13.07.10
✎
15:16
|
(47) Если нет ДоговорКонтрагента, используй "Контрагент"
Нет надобности во вложенных запросах. Если в регистре несколько записей по одному регистратору используй РАЗЛИЧНЫЕ |
|||
|
52
Renat11111
13.07.10
✎
15:27
|
(51) ты сам пробовал в консоли, то что в (32) написал?
|
|||
|
53
AversDik2
13.07.10
✎
15:37
|
(52) у меня нет регистра ВзаиморасчетыСКонтрагентами
я пробовал ВЫБРАТЬ РАЗЛИЧНЫЕ Поставщики.Контрагент, Поставщики.Регистратор ИЗ РегистрНакопления.Поставщики КАК Поставщики ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Поставщики КАК Поставщики1 ПО Поставщики.Контрагент = Поставщики1.Контрагент И Поставщики.МоментВремени < Поставщики1.МоментВремени ГДЕ Поставщики1.Контрагент ЕСТЬ NULL |
|||
|
54
Renat11111
13.07.10
✎
15:42
|
(53) Поставщики1.Контрагент ЕСТЬ NULL Это то зачем? )))
|
|||
|
55
Odavid
13.07.10
✎
15:44
|
(49) оказывается, МАКСИМУМ по Регистратору выводит (если выбирать из разных видов документов) те, которые "максимальны" по алфавитув конфигурации.
А если по одному виду - то по дате дает, как положено. В общем, загадочно как все... |
|||
|
56
hhhh
13.07.10
✎
15:48
|
всё-таки это философский вопрос. Если имеются 2 документа за одну секунду, то в свете (0), какая пользователю разница, можно просто взять любой из этих документов. Тем более, что в реальности порядок этих документов может не совпадать с компьютером.
|
|||
|
57
73
13.07.10
✎
15:49
|
(55) Справка 1С:
Правила сравнения значений .... Отношения между различными ссылочными типами определяются на основе внутренних ссылочных номеров таблиц, соответствующих тому или иному типу. .......... Если типы данных совпадают, то производится сравнение значений по следующим правилам: ......... ссылочные типы сравниваются на основе своих значений (номера записи и т. п.); ЗЫ. Не по алфавиту. А как создавались таблицы. ЗЗЫ. Через одно место, имхо. Но что поделаешь... |
|||
|
58
Renat11111
13.07.10
✎
15:50
|
(55) А мне больше понравился вариант предложенный в (53) более проще все правда отбор автор странный надумал какой-то....
|
|||
|
59
Odavid
13.07.10
✎
15:51
|
(57) вероятно... а может, номера (строка) сравнивает и выбирает "последний". В общем, считаю, ненадежно по Регистратору делать Максимум - результат неопределенный.
|
|||
|
60
AversDik2
13.07.10
✎
15:52
|
(54) чтобы выбрать запись с максимальной датой
|
|||
|
61
Renat11111
13.07.10
✎
15:56
|
(60) При чем тут Поставщики1.Контрагент ЕСТЬ NULL и макс Дата я не въезжаю....
(59) чем тебе все таки не нравится вариант предложенный в (53)? |
|||
|
62
Renat11111
13.07.10
✎
15:59
|
как же у тебя соединение выполняется ПО Поставщики.Контрагент = Поставщики1.Контрагент если ты в отборе пишешь Поставщики1.Контрагент ЕСТЬ NULL.
|
|||
|
63
AversDik2
13.07.10
✎
15:59
|
(61) Если не будет "Поставщики1.Контрагент ЕСТЬ NULL" запрос выдаст все записи тз регистра, а так только ту, после которой других записей по контрагенту нет
|
|||
|
64
AversDik2
13.07.10
✎
15:59
|
(62) Соединение то ЛЕВОЕ
|
|||
|
65
Renat11111
13.07.10
✎
16:02
|
(64) ну и что что левое Поставщики.Контрагент (тут справочник.ссылка) = Поставщики1.Контрагент (тут Null) как будет условие соединения выполняться? кто то из нас чушь пишет, может и я, но хоть убей не понимаю твоей логики.
|
|||
|
66
Odavid
13.07.10
✎
16:03
|
(62) AversDik2 прав. Мы, как всегда, не глядим на нюансы :)))
Ведь работает, право слово, и для многих видов тоже. |
|||
|
67
Renat11111
13.07.10
✎
16:08
|
Ответьте кто ниб на (65) а то меня терзает этот вопрос.
|
|||
|
68
Renat11111
13.07.10
✎
16:12
|
ау народ. неужели такой тупой вопрос?
|
|||
|
69
hhhh
13.07.10
✎
16:13
|
(67) ПО выполняется в момент проверки соединения, а ГДЕ накладывается уже после на результурующую таблицу
|
|||
|
70
AversDik2
13.07.10
✎
16:15
|
(65) если у тебя Поставщики1.Контрагент (тут Null) то Поставщики.Регистратор и есть нужная запись
иначе запись Поставщики.Регистратор нам не нужна |
|||
|
71
Renat11111
13.07.10
✎
16:16
|
(69) вот как..... а я 1,5 года думал иначе. что ж спасибо.
|
|||
|
72
Odavid
13.07.10
✎
16:22
|
(67) вот как дело обстоит: отбираются все записи из Регистра (т.к. ЛЕВОЕ), им все находится более свежий по моменту времени (т.к. регистр один и тот же, соответсвенно, n=n строк в оборе СОЕДИНЕНИя). Получается:
n строка: n-контрагент - n-регистратор - n+1-контрагент - n+1-регистратор А последнему nm (который самый поздний для данного контрагента) соответсвия нет - т.к. не выполнено условие n.МоментВремени < n+1.МоментВремени (он же самый свежий, больше нет). И во внешнем условии ГДЕ уже и отбирается именно он (из левой составляющей ТЗ "n" - правая которая "n+1" остается за бортом), с контрагентом и регистратором. Получается обратная матрица с дыркой (по NULL) - вроде выбираем всех, а у последнего нет "пары", он и нужен. |
|||
|
73
Cube
13.07.10
✎
16:24
|
Ну что, всё же я в (5) + (25) всё правильно написал, да?
|
|||
|
74
Odavid
13.07.10
✎
16:29
|
(73) по одинаковым датам пока решения нет - только разобрали два варианта по отличающимся датам и разным видам документов.
|
|||
|
75
Defender aka LINN
13.07.10
✎
16:29
|
Пипец... Я с вас положительно удивляюсь...
|
|||
|
76
Renat11111
13.07.10
✎
16:33
|
(75) ОК. уважаемый объясните тогда чем ваш запрос лучше.
ВЫБРАТЬ РАЗЛИЧНЫЕ Поставщики.Контрагент, Поставщики.Регистратор ИЗ РегистрНакопления.Поставщики КАК Поставщики ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Поставщики КАК Поставщики1 ПО Поставщики.Контрагент = Поставщики1.Контрагент И Поставщики.МоментВремени < Поставщики1.МоментВремени ГДЕ Поставщики1.Контрагент ЕСТЬ NULL |
|||
|
77
Defender aka LINN
13.07.10
✎
16:38
|
(76) Я не утверждаю, что мой лучше, но 2,5 часа обсуждать простой вопрос - это пипец.
|
|||
|
78
Renat11111
13.07.10
✎
16:41
|
(77) 2,5 и 3 часа это не пипец. Потому что: если бы передо мной стояла подобная задача то я бы ее решал до этого дня как в (75). А щас я еще поджумал бы потестировал оба варианта.
|
|||
|
79
hhhh
13.07.10
✎
16:43
|
(77) это ведь не справочная (вопрос - ответ), а форум. Обсуждение в любом случае будет.
|
|||
|
80
Defender aka LINN
13.07.10
✎
16:45
|
Кстати, (76) не учитывает период движений. А он может и не совпадать с датой документа. Так что у меня универсальнее :)
|
|||
|
81
Odavid
13.07.10
✎
17:02
|
(75) этот близок к (46), а вот (76) - оригинальное решение, изящное, можно сказать :))
На 1С такое не часто встретишь - не способствует платформа поиску таких решений. И потом, нашил 2+1 варианта - это же здорово. Задачка-то все равно интересная и востребованная. |
|||
|
82
Renat11111
13.07.10
✎
17:06
|
(81) не все так просто как кажется. я уверен на 90% что (75) на больших базах будет работать быстрее причем намного. Поэтому решение может и изящное, но замер не помешает.
|
|||
|
83
Odavid
13.07.10
✎
17:07
|
(80) уто уже либо грубая ошибка - документ введен одной датой, а проведен в другом периоде, либо документ долго валялся непроведенным :)
|
|||
|
84
Odavid
13.07.10
✎
17:09
|
(82) а в (33) - тоже намного медленне (75)? :)
|
|||
|
85
Renat11111
13.07.10
✎
17:13
|
(84) тут спорить смысла нет. передо мно
|
|||
|
86
Renat11111
13.07.10
✎
17:14
|
передо мной такая задача встанет буду тестить оба варианта, а так просто словами кидаться смысла нет.
|
|||
|
87
luckyluke
13.07.10
✎
17:28
|
(73)
(5)"Думаю, что это не реально, т.к. МоментВремени не доступен в запросе, а дата у документов может быть и одинаковая..." - Это реально. МоментВремени доступен в запросе, дата одинакова, но дата + ссылка не могут быть уникальны, так что ты ошибся. (25) "Тебе нужно с МоментомВремени играть, а не с датой документа. А это можно сделать только в коде." Это можно сделать и в запросе, ты снова ошибся. |
|||
|
88
Odavid
13.07.10
✎
22:39
|
Подведу итог, как автор темы (собственно, кому, как не мне?)
(76) - это аналогично (33), только с использованием Период вместо дата (как всегда, за нюансы спасибо Defender aka LINN - движения по периолду и все такое), и Максимум (Регистратор) во внешнем запросе. Defender (и 73), объясните, пожалуйста, в чем смысл использования МАКСИМУМ второй раз во внешнем запросе? Я уже писал об непонятной работе Максимума на Регистратор в (55), (59), и вот пример (он же в (33) -> (75) - только с использованием Дата вместо Период) с временной таблицей (может, пригодится кому - все то же самое, только, если кроме нахождения последнего документа надо еще какие поля подцепить к результату - суммы там, фамилии :) - создаете пакет нужных временных таблиц с другой выборкой, и подсодиняете через разные СОЕДИНЕНИЕ в результирующем пакетном запросе): ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.Регистратор КАК Регистратор, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ПОМЕСТИТЬ тчДокументыОтобранныеПоДате ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор.Дата) КАК Дата, ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентами.Контрагент) КАК ДатаПоследнегоДокумента ПО ВзаиморасчетыСКонтрагентами.Контрагент = ДатаПоследнегоДокумента.Контрагент И ВзаиморасчетыСКонтрагентами.Регистратор.Дата = ДатаПоследнегоДокумента.Дата ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДокументыОтобранные.Регистратор КАК Регистратор, ДокументыОтобранные.Контрагент КАК Контрагент ИЗ тчДокументыОтобранныеПоДате КАК ДокументыОтобранные СГРУППИРОВАТЬ ПО ДокументыОтобранные.Контрагент, ДокументыОтобранные.Регистратор Работает все без второго МАКСИМУМ (а с МАКСИМУМ - никакого отличия). |
|||
|
89
Odavid
13.07.10
✎
23:05
|
(88) - третья строка сверху: "движения по Периоду"
(82) - по поводу скорости. И (33) (он же (46), он же (75)), и (53) (он же (76)) - будут работать примерно одинаково. Нет, я не тестил на большой базе, но логически: запросы и там, и там преобразуются в- и выполняются на- SQL, а там без разницы, сначала найти дату, и по ней выбирать таблицу, или сразу набирать запросом по условию "Строка n.МоментВремени" < "Строка n+1.МоментВремени", и потом отсечь "лишнее большинство". Даже как-бы (53) не быстрей был - там два запроса к SQL против трех в (33). А вы, Defender aka LINN, удивляетесь :)) Вон сколько всего занимательного можно извлечь из обыденной рутинной работы :)) (8) - два документа с одной датой. Что самое интересное - запросы по Дате и Периоду ((33) (он же (46), он же (75)) требуют условия-функции группировки МАКСИМУМ на Регистратор (окромя этого - како |
|||
|
90
Odavid
13.07.10
✎
23:14
|
требуют условия-функции группировки МАКСИМУМ на Регистратор (снова спрошу, а окромя этого - какой смысл его использования здесь?), и только тогда выводят именно последний по вводу в базу документ (находят последнюю ссылку из двух с одной датой), а вот посик по МоментВремени (от AversDik2 в (53), он же (76)) - без дополнительных условий дает последнюю ссылку в любом случае.
И вот тут я как раз не удивляюсь выкрутасам в 1С: "МоментВремени - сортирован по порядку ввода и в базе с соответсвующим ключом", а, казалось, "тоже самое" - Период и Дата, уже нет, тут уже нужна дополнительная функция группировки, чтобы выудить последнюю по вводу ссылку. Опять, снова и снова, вспоминается ник "Ненавижу1С" - вот он, наверное, мог бы пачками подобного нарассказать :). |
|||
|
91
Odavid
13.07.10
✎
23:17
|
(50) Ренат (через "е"?), это к чему про карточки и NULL?
|
|||
|
92
Odavid
13.07.10
✎
23:36
|
(75), да, "Я с вас положительно удивляюсь..." - я рад, что вызываю у вас положительный эмоции, Defender aka LINN :))
////////////////////////////////////////////// Ваша помощь, как всегда, неоценима и вовремя. |
|||
|
93
Cube
14.07.10
✎
05:57
|
О, неплохо :)
А мне больше импонирует вариант из (76), т.к. там всё понятно. А в варианте из (75) мне лично не понятно как работает конструкция МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор)... В общем, молодцы)) |
|||
|
94
Odavid
14.07.10
✎
07:17
|
(93) - "не понятно как работает конструкция МАКСИМУМ(ВзаиморасчетыСКонтрагентами.Регистратор)". Что такое Регистратор? Это Ссылка+Дата. Дата одинакова, ссылка - разная. Он ищет по "свежей" ссылке - а что это за механизм? Что значит "ссылка свежая"? Это и "раньше введена в таблицу", и "номер более новый" (у меня выдавал якобы более "новый" номер при разных видах документа - просто брал и сравнивал их текстовые номера), и еще не понятно что. Поэтому по МАКСИМУМ можно получить что угодно. Кто и как определит, какая ссылка "свежее"? Вот если бы было четко понятно, что будет возвращено - то дело другое.
|
|||
|
95
Defender aka LINN
14.07.10
✎
07:19
|
(94) "Что такое Регистратор? Это Ссылка+Дата" - нихрена подобного.
"Вот если бы было четко понятно, что будет возвращено - то дело другое" - и так четко понятно. Ссылка - это число, на самом деле. |
|||
|
96
Odavid
14.07.10
✎
07:27
|
(95) есть примеры, что по МАКСИМУМ(Ссылка) возвращается как то, что надо (последние объекты), так и нечто совсем другое, даже вне зависимости от одинаковости дат. А как 1С "разрешила" МАКСИМУМу обрабатывать Ссылку (и, соответственно, Регистратор) - мы можем только догадываться. Вне зависимости, число это там или не число. И, кстати, в арабской записи чисел нет правила записывать число в виде 1234-1234-1234-1234-1234 ;)
Так что результат обработки в этом случае неопределенный - что, собственно, и не отрицает тот же Радченко. |
|||
|
97
Defender aka LINN
14.07.10
✎
07:42
|
(96) "в арабской записи чисел" вообще проблемы с шеснадцатиричными числами.
МоментВремени, кстати, работает так же, но тут я что-то возражений от тебя не вижу :) |
|||
|
98
Odavid
14.07.10
✎
07:45
|
(97) вот дата - это действительно число, и тут у МАКСИМУМ нет проблем в поиске последнего :)
""в арабской записи чисел" вообще проблемы с шеснадцатиричными числами" - это у 1С проблема то ли с обработкой 16-тиричных чисел, то ли с созданием (вот у "арабов" нет проблем - какое число больше, какое - меньше :)) ), но работает это у них с переменным успехом, а потому - надо очень осторожно использовать. |
|||
|
99
Defender aka LINN
14.07.10
✎
08:41
|
(98) батенька, при чем тут 1С? UUID придумали не они. И не они придумали использовать его в качестве идентификатора.
|
|||
|
100
zak555
14.07.10
✎
08:42
|
сто !
|
|||
|
101
AlStorm
14.07.10
✎
08:42
|
100!
|
|||
|
102
AlStorm
14.07.10
✎
08:42
|
Млин
|
|||
|
103
Odavid
21.07.10
✎
02:50
|
А вот еще запрос на похожую задачу. Найти последнюю цену по дате. Но здесь в качестве исходного - ТЗ с набором номеров партий (поле НомерПартии); МАКСИМУМ не подходит - выбирается также и цена, а её суммировать нельзя, цена должна по дате выбираться. Думаю, вы сможете наверняка улучшить:
ВЫБРАТЬ | ТЗЦены." + ПолеОтбора + " |ПОМЕСТИТЬ ТЗЦены |ИЗ | &ТЗ КАК ТЗЦены |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | ПартииТоваровНаСкладах.Период КАК Дата, | ПартииТоваровНаСкладах.Цена КАК Цена |ИЗ | РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах |ГДЕ | ПартииТоваровНаСкладах.НомерПартии В | (ВЫБРАТЬ | ТЗЦены." + ПолеОтбора + " | ИЗ | ТЗЦены КАК ТЗЦены) |УПОРЯДОЧИТЬ ПО | Дата УБЫВ |
|||
|
104
Odavid
21.07.10
✎
02:51
|
(103) ПолеОтбора - "НомерПартии"
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |