Имя: Пароль:
1C
 
Как получить последний документ через запрос без применения функции МАКСИМУ
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) Хм. А если подумать :-)