![]() |
![]() |
![]() |
|
Как получить последний документ через запрос без применения функции МАКСИМУ | ☑ | ||
---|---|---|---|---|
0
EvgeniuXP
09.02.07
✎
14:22
|
В подзапросе пытаюсь заполучить последний документ и не получается.... если применить МАКСИМУМ(Документ.Прием.ДатаПриема), то возвращается физлицо и максимальная дата приема и все.... а самой ссылки на документ нет-у :( а мне нужно, для последующего анализа...
Большое спасибо за помощь :)) |
|||
1
ZolotarevAA
09.02.07
✎
14:25
|
(0) К вложенному запросу клеить таблицу документа, если нет пересечений по дате, конечно.
|
|||
2
megalodon
09.02.07
✎
14:27
|
// последний введенный
выбрать первые 1 упорядочить по ссылка убыв // если последний по моменту времени еще сортировака по дате |
|||
3
ZolotarevAA
09.02.07
✎
14:29
|
(2) А как насчет последнего документа по каждому <чего-нить>?
|
|||
4
megalodon
09.02.07
✎
14:32
|
(3) а подумать немного? :-)))
|
|||
5
megalodon
09.02.07
✎
14:37
|
(3) это тоже возможно, и даже без подзапросов, но конечно же подход будет другой.
|
|||
6
ZolotarevAA
09.02.07
✎
14:39
|
(4) В том и дело, что думал. И не я один думал... ну намекни хоть что-ли.
|
|||
7
ZolotarevAA
09.02.07
✎
14:41
|
+6 К примеру, получить последний документ взаиморасчетов по каждой паре Контрагент+Договор.
|
|||
8
selenat
09.02.07
✎
14:41
|
||||
9
selenat
09.02.07
✎
14:42
|
+8 начиная с 21 поста...
|
|||
10
megalodon
09.02.07
✎
14:44
|
(7) договор однозначно относится к контрагенту, например как в УТ?
|
|||
11
ZolotarevAA
09.02.07
✎
14:44
|
(8) Это вопрос к megalodon?
|
|||
12
ZolotarevAA
09.02.07
✎
14:46
|
(10) Если есть разница, то предполжим, что нет, т.е. в общем случае, имеем ключ из нескольких полей, к каждому ищем последний документ.
|
|||
13
selenat
09.02.07
✎
14:49
|
(11) нет, просто ссылка на обсуждение по сабжу.
|
|||
14
ZolotarevAA
09.02.07
✎
14:50
|
(13) ...так там ответа нету.
|
|||
15
megalodon
09.02.07
✎
14:52
|
(12) разница есть. нужно одно поле (или возможность создать композитное поле, а ее в 1С нету) и одна таблица - источник данных (здесь я думаю сойдет регистр "ВзаиморасчетыСКонтрагентами")
|
|||
16
selenat
09.02.07
✎
14:53
|
(14) нету. Но часто обсуждение проясняет для спрашивающего некоторые моменты и его вопросы могут измениться. А почему интересно автору не нравится функция максимум?
|
|||
17
ZolotarevAA
09.02.07
✎
14:55
|
(16) Думаю, из-за скорости.
|
|||
18
ZolotarevAA
09.02.07
✎
14:56
|
(15) Ну так как насчет композитного поля, никак?
|
|||
19
selenat
09.02.07
✎
14:58
|
(17) видимо, нет. Просто он похоже не правильно пишет, чтоб получить еще и ссылку на документ. А в моем запросе это делается...
|
|||
20
selenat
09.02.07
✎
15:03
|
Композитное поле - это конечно круто, но мне интересно даже по списку объектов одного поля увидеть пример...
|
|||
21
megalodon
09.02.07
✎
15:05
|
(20) речь шла о том, что при некоторых условях это можно сделать без подзапросов, а не о том, круто это или нет.
|
|||
22
selenat
09.02.07
✎
15:09
|
(21) Пример приведешь? Может, я не о том?
|
|||
23
ZolotarevAA
09.02.07
✎
15:09
|
(21) Какие формальные условия должны быть выполнены?
|
|||
24
EvgeniuXP
09.02.07
✎
15:11
|
без запроса я могу:
Выборка=Справочники.ФизическиеЛица.Выбрать(); Пока Выборка.Следующий() Цикл Приказ=НайтиПоследнийДокументПоФизЛицу(ФизЛицо); Если ТипЗнч(Приказ)<>ТипЗнч(Документ.Увольнение.ПустаяСсылка) Тогда // этот человек мне нужен Иначе // продолжаем проверять следующего КонецЕсли; КонецЦикла; |
|||
25
megalodon
09.02.07
✎
15:12
|
(23) читать (15)
|
|||
26
EvgeniuXP
09.02.07
✎
15:12
|
(23) а композитное поле это как???
|
|||
27
megalodon
09.02.07
✎
15:13
|
(26) типа ЗначениеВСтрокуВнутр(Поле1) + "#" + ЗначениеВСтрокуВнутр(Поле2).
|
|||
28
selenat
09.02.07
✎
15:14
|
(25) Поле одно, но по нему надо найти данные из таблицы по списку значений этого поля. Как?
|
|||
29
ZolotarevAA
09.02.07
✎
15:15
|
(24) Очень смешно.
|
|||
30
megalodon
09.02.07
✎
15:16
|
(28) не в тему вопрос.
ГДЕ Поле1 В (&СписокЗначенийПоля1) |
|||
31
EvgeniuXP
09.02.07
✎
15:16
|
Просто 17000 сотрудников - это долго... через запрос было бы быстрее...
|
|||
32
ZolotarevAA
09.02.07
✎
15:17
|
(28) +1. В 15 нет ответа на попрос.
|
|||
33
selenat
09.02.07
✎
15:19
|
(30) Может, я не правильно выразился. Для каждого значения поля из списка надо получить свой последний документ, которому это значение поля соответствует...
|
|||
34
ZolotarevAA
09.02.07
✎
15:19
|
(30) Почитай ссылку в 8. Мы говорим об одном и том же?
|
|||
35
megalodon
09.02.07
✎
15:21
|
(33) ну тогда просто на итоговую таблицу накладываешь условие и все
|
|||
36
selenat
09.02.07
✎
15:22
|
(35) То есть? это как?
|
|||
37
EvgeniuXP
09.02.07
✎
15:22
|
пример можно?... я выложил пример в (24)....
|
|||
38
megalodon
09.02.07
✎
15:22
|
(34) че та там многа букафф, а работать надо
|
|||
39
selenat
09.02.07
✎
15:23
|
(37) пример в (8). Смотри 21 пост и дальше.
|
|||
40
selenat
09.02.07
✎
15:26
|
(35) извини, но по-моему ты немного не в теме...
|
|||
41
ZolotarevAA
09.02.07
✎
15:28
|
(38) Да я тоже не в клубе развлекаюсь...Просто из того, что ты пишешь у меня складывается ощущение, что мы о разных вещах говорим, потому что как получить эту итоговую таблицу в 35, я до сих пор не понял. А задача, между прочим актуальная.
P.S. В частности, в той ветке в районе 40-х постов vde69 утверждает, что в 1С такая задача не может быть решена в принципе на текущий момент. |
|||
42
EvgeniuXP
09.02.07
✎
15:30
|
в моей ситуации проще... человек не может два раза прийти/переместиться/уволиться в одно и то же время...
|
|||
43
EvgeniuXP
09.02.07
✎
15:31
|
датафакта (факт соверщения действия) всегда разная
|
|||
44
selenat
09.02.07
✎
15:32
|
(42) ну дык проблемы нет...
|
|||
45
ZolotarevAA
09.02.07
✎
15:33
|
(44) Я бы сказал, что проблема есть :)
|
|||
46
EvgeniuXP
09.02.07
✎
15:34
|
мне надо найти всех людей, у которых последний документ является не уволенным и непроведенным... кадры забывают проводить документы... и такх людей выкинуть на отдельную вкладку, чтоб отдел кадров исправляли таких людей, иначе при выгрузке данных они их упустят...
|
|||
47
selenat
09.02.07
✎
15:35
|
(45) Если совпадения времени быть не может, то можно использовать максимум по дате с той структурой запроса, которая приведена. Я имел в виду это... :)
|
|||
48
EvgeniuXP
09.02.07
✎
15:35
|
можно хитрее поступить, без запроса... и только изменившихся людей тестить... но это переделывать надо все...
|
|||
49
EvgeniuXP
09.02.07
✎
15:36
|
а эта выборка должна работать при открытии справочника Физические лица... и естественно, если долго будет делать, то окно со списком физлиц открываться будет очень долго....
|
|||
50
EvgeniuXP
09.02.07
✎
15:37
|
а через временную таблицу запроса можно? (8.1)
|
|||
51
megalodon
09.02.07
✎
15:38
|
вот решение задачи из (7)
ВЫБРАТЬ ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента.Владелец КАК Контрагент, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентами.Регистратор КАК ПоследнийДокумент ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентамиФильтр ПО ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиФильтр.ДоговорКонтрагента И ВзаиморасчетыСКонтрагентами.Период < ВзаиморасчетыСКонтрагентамиФильтр.Период ГДЕ ВзаиморасчетыСКонтрагентамиФильтр.Период ЕСТЬ NULL УПОРЯДОЧИТЬ ПО ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента.Владелец.Наименование, ВзаиморасчетыСКонтрагентами.ДоговорКонтрагента.Наименование так я в теме или нет? |
|||
52
ZolotarevAA
09.02.07
✎
15:38
|
(47) Да я понял... :)
(49) Может быть лучше отчет сделать? |
|||
53
EvgeniuXP
09.02.07
✎
15:40
|
(52) отчеты пользователь не любит нажимать... а на интерфейсе им стыдно сразу и стараются его держать аккуратным :)
|
|||
54
ZolotarevAA
09.02.07
✎
15:42
|
(53) Систему нечем нагружать? А насчет "пользователь не любит" - в данном случае ерунда-с.
|
|||
55
EvgeniuXP
09.02.07
✎
15:42
|
просто придерживаюсь режима реального времени...
|
|||
56
Три буквы
09.02.07
✎
15:43
|
(51)идея хорошая, только есть большое подозрение, что
условие ГДЕ ВзаиморасчетыСКонтрагентамиФильтр.Период ЕСТЬ NULL сработает не так, как ожидается. имхо, все же потребуется вложенный |
|||
57
selenat
09.02.07
✎
15:44
|
(51) поясни несколько моментов. Как ты стыкуешь
И ВзаиморасчетыСКонтрагентами.Период < ВзаиморасчетыСКонтрагентамиФильтр.Период с тем, что ГДЕ ВзаиморасчетыСКонтрагентамиФильтр.Период ЕСТЬ NULL Это раз. И как это использовать для списка договоров? |
|||
58
Три буквы
09.02.07
✎
15:45
|
(57)имеется в виду, что отбираются те записи, к которым не присоединилась вторая таблица
|
|||
59
megalodon
09.02.07
✎
15:47
|
(56) нормально отработает все
(57) вот так беру и стыкую. результат получается верный. проблема то в чем? кстати, чтобы наложить условие на договора (только те, что в твоем списке) просто пишешь условие из (30) в ГДЕ. |
|||
60
Три буквы
09.02.07
✎
15:47
|
(59)проверял?
|
|||
61
megalodon
09.02.07
✎
15:48
|
(60) 1000 раз
|
|||
62
ZolotarevAA
09.02.07
✎
15:49
|
(51) Сделал для РС:
ВЫБРАТЬ ОС_ПараметрыЗемельныхУчастков.ОсновноеСредство, ОС_ПараметрыЗемельныхУчастков.Регистратор ИЗ РегистрСведений.ОС_ПараметрыЗемельныхУчастков КАК ОС_ПараметрыЗемельныхУчастков ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОС_ПараметрыЗемельныхУчастков КАК ОС_ПараметрыЗемельныхУчастковФильтр ПО ОС_ПараметрыЗемельныхУчастков.Период < ОС_ПараметрыЗемельныхУчастковФильтр.Период ГДЕ ОС_ПараметрыЗемельныхУчастковФильтр.Период ЕСТЬ NULL УПОРЯДОЧИТЬ ПО ОС_ПараметрыЗемельныхУчастков.ОсновноеСредство.Наименование В ответе получил две записи по неким объектам (чем они отличаются от других, пока не понял). Что делать? |
|||
63
AntonioS
09.02.07
✎
15:49
|
в общем случае решение задачи с "многокомпонентным ключом"
выбрать поле1, поле2, ... полеN, реквизит, показатель из Таблица внутреннее соединение ( выбрать поле1, поле2, ... полеN, МАКСИМУМ(показатель) как показатель из Таблица сгруппировать по поле1, поле2, ... полеN ) Как ПодТаблица по Таблица.поле1 = ПодТаблица.поле1 И Таблица.поле2 = ПодТаблица.поле2 ... И Таблица.полеN = ПодТаблица.полеN И Таблица.показатель = ПодТаблица.показатель для конкретного примера: поле1 - физ.лицо показатель - регистратор реквизит - регистратор.Дата |
|||
64
ZolotarevAA
09.02.07
✎
15:50
|
(62) Пардон, еще одно условие пропустил.
|
|||
65
megalodon
09.02.07
✎
15:51
|
(62) а по равенству основных средств куда условие задевал?
|
|||
66
selenat
09.02.07
✎
15:52
|
(63) именно это и реализовано в (8).
А идею мегалодона пока не понял. Продолжаю смотреть... |
|||
67
ZolotarevAA
09.02.07
✎
15:52
|
Сделал так:
ВЫБРАТЬ ОС_ПараметрыЗемельныхУчастков.ОсновноеСредство, ОС_ПараметрыЗемельныхУчастков.Регистратор ИЗ РегистрСведений.ОС_ПараметрыЗемельныхУчастков КАК ОС_ПараметрыЗемельныхУчастков ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОС_ПараметрыЗемельныхУчастков КАК ОС_ПараметрыЗемельныхУчастковФильтр ПО ОС_ПараметрыЗемельныхУчастков.Период < ОС_ПараметрыЗемельныхУчастковФильтр.Период И ОС_ПараметрыЗемельныхУчастков.ОсновноеСредство = ОС_ПараметрыЗемельныхУчастковФильтр.ОсновноеСредство ГДЕ ОС_ПараметрыЗемельныхУчастковФильтр.Период ЕСТЬ NULL УПОРЯДОЧИТЬ ПО ОС_ПараметрыЗемельныхУчастков.ОсновноеСредство.Наименование Выдает по ключу <ОсновноеСредство> несколько документов на один объект. Т.е. не работает. |
|||
68
ZolotarevAA
09.02.07
✎
15:53
|
(65) Я искренне хочу получить решение, но пока его нет.
|
|||
69
EvgeniuXP
09.02.07
✎
15:54
|
можно проще... регистр сведений который и хранит все документы... и снимать с регистра сведений....
|
|||
70
Три буквы
09.02.07
✎
15:55
|
(61)хорошо, если так.
а то есть такое: когда накладываешь какое-либо условие в ГДЕ на таблицу, участвующую в Левом соединении и стоящую справа, то условие срабатывает только для записей, попавших в результирующую таблицу. если условие на NULL - происходит то же самое - не попавшие в соединение записи игнорируются -- как проверю - сообщу. |
|||
71
megalodon
09.02.07
✎
15:55
|
есть еще условие: поле Период должно быть уникальным в пределах каждого ОС
|
|||
72
ZolotarevAA
09.02.07
✎
15:55
|
(63) В общем случае фигню получишь.
|
|||
73
megalodon
09.02.07
✎
15:56
|
+(71) у тя наверна еще есть измерение этого регистра.
|
|||
74
Три буквы
09.02.07
✎
15:56
|
(66)идея проста - соединяем таблицу с собой же по ключевым полям + по большему периоду. Те записи, для которых не нашлось большего периода, как раз имеют максимальный
|
|||
75
EvgeniuXP
09.02.07
✎
15:57
|
(63) - это решение?
|
|||
76
selenat
09.02.07
✎
15:58
|
(74) ага. Понял.
|
|||
77
ZolotarevAA
09.02.07
✎
15:59
|
(73) Нет, просто у меня (и у selenat) период не уникален. :(
|
|||
78
EvgeniuXP
09.02.07
✎
15:59
|
(74) пример можно? я не такой ас как вы...
|
|||
79
megalodon
09.02.07
✎
16:00
|
(77) такого вроде в РС не бывает, если других измерений нет.
|
|||
80
Три буквы
09.02.07
✎
16:00
|
(78)а уж я-то какой не ас :))
пример в (51), именно его я и объсняла |
|||
81
selenat
09.02.07
✎
16:00
|
(71) так что случай совпадающего периода этим способом тоже не решается. Так?
|
|||
82
ZolotarevAA
09.02.07
✎
16:02
|
(79) Да ладно, Периодичность: По позиции регистратора. И фигачь в один период разные регитраторы до посинения.
|
|||
83
ZolotarevAA
09.02.07
✎
16:03
|
(81) Я просмотрел ветку... об этом впервые косвенно говорит EvgeniuXP в постах 42,43
|
|||
84
AntonioS
09.02.07
✎
16:03
|
(72) это схема для общего случая.
словами - необходимо соединять таблицу саму с собой по определенному принципу. насчет фигни, комментировать не буду. прежде чем написать схему, написал кучу запросов подобного вида. |
|||
85
megalodon
09.02.07
✎
16:04
|
(82) м-дя... параметры земельных участков меняются каждую 0.0001 секунды... куда катится мир...
|
|||
86
ZolotarevAA
09.02.07
✎
16:05
|
(84) Повторяю еще раз, что в общем случае (в частности, когда период не уникален) получаем фигню.
|
|||
87
megalodon
09.02.07
✎
16:07
|
(86) ну справедливости ради стоит отметить, что когда период не уникальный - самый последний документ ты тоже получить не сможешь, потому что их больше одного.
|
|||
88
ZolotarevAA
09.02.07
✎
16:08
|
(87) Угу, а хочется...
|
|||
89
selenat
09.02.07
✎
16:09
|
(87) Спасибо за идею. Структура запроса действительно получается проще...
|
|||
90
megalodon
09.02.07
✎
16:11
|
(89) да пожалуйста, только вот практическая польза от этого весьма мала. Вообще я бы не советовал запускать такие запросы, они запросто кладут систему.
|
|||
91
selenat
09.02.07
✎
16:14
|
(90) с этой точки зрения запрос со структурой (63) лучше? Тестировал?
|
|||
92
ZolotarevAA
09.02.07
✎
16:15
|
(91) Чем же она лучше?
|
|||
93
megalodon
09.02.07
✎
16:16
|
(91) не тестировал. но ежу понятно, что при малой селективности по полю "ДоговорКонтрагента" (это когда договоров мало а документов по ним много) выборка раздуется до небес. К тому же 1С для получения среза последних использует схему (63).
|
|||
94
ZolotarevAA
09.02.07
✎
16:16
|
Кстати, в одном случае я сделал периодический РС с измерениями, содержащими ключ, а ресурсом - документ + Документ-регистратор. Оформление регламентное.
|
|||
95
selenat
09.02.07
✎
16:17
|
(92) я не утверждаю. Я спрашиваю. С ходу не могу сообразить - сколько данных придется обрабатывать системе в том случае...
|
|||
96
AntonioS
09.02.07
✎
16:25
|
(86) я предложил схему для случая, когда и поля и реквизиты принадлежат одной таблице. в случае с регистратором и датой регистратора это не так.
т.е. имеем дело с показателем, лежащим в другой таблице. вид связи нашей таблицы с другой (один к одному или один ко многим) зависит от структуры данных и общей схемы здесь быть не может. не трудно догадаться, что в случае связи один ко многим в верхнем запросе необходимо еще раз получать МАКСИМУМ |
|||
97
megalodon
09.02.07
✎
16:25
|
о, протестировал (63). моя схема работала где то минуту - две, а (63) выдал за полсекунды.
|
|||
98
ZolotarevAA
09.02.07
✎
16:34
|
(97) Кеширование?
|
|||
99
selenat
09.02.07
✎
16:36
|
(98) не думаю. Просто при схеме (51) похоже действительно много чего выбирать и соединять приходжится...
|
|||
100
Ку
09.02.07
✎
16:43
|
сортировать по убыванию даты?
|
|||
101
EvgeniuXP
06.04.07
✎
19:26
|
в версии 8.1 это уже без проблем :)
|
|||
102
Neco
06.04.07
✎
22:33
|
Все классно! Но задачки в (0) проще решать срезом последних к регистру сведений.
Можно еще попробовать через итоги с упорядочиванием и выборке взять последний элемент не перебирая все последующие. |
|||
103
Wladimir_spb
06.04.07
✎
23:16
|
+(102) , тольлко опчатка наверно, т.к. брать нужно первый элемент
|
|||
104
Гений 1С
гуру
07.04.07
✎
23:37
|
(7) типо выбрать контрагент, документ где документ.дата=максимум(выбрать дата из документ где контрагент=контрагент)... ну что то типо такого. ;-)
|
|||
105
Dert
08.04.07
✎
00:37
|
ВЫБРАТЬ
нужные реквизиты ИЗ ТаблицаВнешняя ГДЕ ТаблицаВнешняя.Документ В (ВЫБРАТЬ ПЕРВЫЕ 1 ТаблицаВнутренняя.Документ ИЗ ТаблицаВнутренняя ГДЕ (связи по всем нужным полям типа ТаблицаВнутренняя.Поле1 = ТаблицаВнешняя.Поле1 и т.д.) УПОРЯДОЧИТЬ ПО ТаблицаВнутренняя.Документ.МоментВремени УБЫВ (для самого последнего, для первого оставляем все как есть - т.е. ASC (не помню как на русском пишется) ) например в таблице есть поля Договор, Контрагент, Документ По каждому Договору и Контрагенту надо выбрать последний документ Запрос будет такой ВЫБРАТЬ ТаблицаВнешняя.Договор , ТаблицаВнешняя.Контрагент , ТаблицаВнешняя.Документ ИЗ ТаблицаВнешняя ГДЕ ТаблицаВнешняя.Документ В ( ВЫБРАТЬ ПЕРВЫЕ 1 ТаблицаВнутренняя.Документ ИЗ ТаблицаВнутренняя ГДЕ ТаблицаВнутренняя.Договор = ТаблицаВнешняя.Договор И ТаблицаВнутреняя.Контрагент = ТаблицаВнешняя.Контрагент УПОРЯДОЧИТЬ ПО ТаблицаВнутренняя.Документ.МоментВремени УБЫВ ) т.е. простой коррелированный подзапрос Жалко в простом T-SQL есть возможность условие на связь "В" заменить на связь "=". 1С нас этого лишила :-) |
|||
106
Dert
08.04.07
✎
00:40
|
+ (105)
Кстати, если тупо посмотреть профайлер, то 1с так и реализует функционал виртуальной таблицы СрезПоследних (СрезПервых) |
|||
107
Wladimir_spb
08.04.07
✎
01:08
|
(105) Связь между таблицами обозначается с помощью ключевого слова "ПО"
|
|||
108
Dert
08.04.07
✎
12:43
|
(107) Хм. А если подумать :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |