Имя: Пароль:
1C
1С v8
как в запросе выбрать самый последний документ
,
0 AugustBlack
 
23.11.12
08:38
привет, подскажите в запросе есть ссылка на документ и дата, как выбрать самый последний док из кучи строк регистра бухгалтерии, функция МАКСИМУМ?
1 Нуф-Нуф
 
23.11.12
08:43
В поиск епта. Через день такое спрашивают
2 AugustBlack
 
23.11.12
10:00
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Промежуточная_ТЗ.Контрагент,
   Промежуточная_ТЗ.Счет,
   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор) КАК Документ,
   СУММА(Промежуточная_ТЗ.Дебет) КАК Дебет,
   СУММА(Промежуточная_ТЗ.Кредит) КАК Кредит
ИЗ
   Промежуточная_ТЗ КАК Промежуточная_ТЗ,
   РегистрБухгалтерии.Хозрасчетный.Обороты(, &ДатаКон, Регистратор, Счет В ИЕРАРХИИ (&СписокСчетов), , Организация = &Организация, КорСчет В ИЕРАРХИИ (&СписокСчетов), ) КАК ХозрасчетныйОбороты
ГДЕ
   (Промежуточная_ТЗ.Документ ЕСТЬ NULL
           ИЛИ Промежуточная_ТЗ.Документ = НЕОПРЕДЕЛЕНО)
   И Промежуточная_ТЗ.Счет = ХозрасчетныйОбороты.Счет
   И Промежуточная_ТЗ.Контрагент = ХозрасчетныйОбороты.Субконто1

СГРУППИРОВАТЬ ПО
   Промежуточная_ТЗ.Контрагент,
   Промежуточная_ТЗ.Счет

УПОРЯДОЧИТЬ ПО
   Документ УБЫВ
3 AugustBlack
 
23.11.12
10:01
(2) в этом запросе,не понимаю почему на выходе получаю не последний документ а последний документ января, хотя последний в октябре должен быть
4 mikecool
 
23.11.12
10:02
(3) ну ты по дате попробуй упорядочить чтоле
5 Cube
 
23.11.12
10:06
(0) Нажми большую красную букву "Я" справа от заголовка темы...
6 AugustBlack
 
23.11.12
10:07
(4) упорядочил:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Промежуточная_ТЗ.Контрагент,
   Промежуточная_ТЗ.Счет,
   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор.Дата) КАК ДокументДата,
   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор) КАК Документ,
   СУММА(Промежуточная_ТЗ.Дебет) КАК Дебет,
   СУММА(Промежуточная_ТЗ.Кредит) КАК Кредит
ИЗ
   Промежуточная_ТЗ КАК Промежуточная_ТЗ,
   РегистрБухгалтерии.Хозрасчетный.Обороты(, &ДатаКон, Регистратор, Счет В ИЕРАРХИИ (&СписокСчетов), , Организация = &Организация, КорСчет В ИЕРАРХИИ (&СписокСчетов), ) КАК ХозрасчетныйОбороты
ГДЕ
   (Промежуточная_ТЗ.Документ ЕСТЬ NULL
           ИЛИ Промежуточная_ТЗ.Документ = НЕОПРЕДЕЛЕНО)
   И Промежуточная_ТЗ.Счет = ХозрасчетныйОбороты.Счет
   И Промежуточная_ТЗ.Контрагент = ХозрасчетныйОбороты.Субконто1

СГРУППИРОВАТЬ ПО
   Промежуточная_ТЗ.Контрагент,
   Промежуточная_ТЗ.Счет

УПОРЯДОЧИТЬ ПО
   ДокументДата УБЫВ

поля:
датадокумента         документ
31.10.2012 23:59:59  операция 00001 от 31.01.2012:23 59 59
7 Reset
 
23.11.12
10:09
(6) Регистратор в Сгруппировать
8 Cube
 
23.11.12
10:09
(6) И что тебя удивляет? Смотри (5)
9 Reset
 
23.11.12
10:09
(7) Не читать, не проснулся еще
10 dk
 
23.11.12
10:10
МАКСИМУМ(ХозрасчетныйОбороты.Регистратор.Дата)
и
МАКСИМУМ(ХозрасчетныйОбороты.Регистратор)
вообще-то не связаны др/др
11 salvator
 
23.11.12
10:10
(6) ДатаКон чему равно?
12 Irbis
 
23.11.12
10:10
Выбрать первый с конца
13 Serg_1960
 
23.11.12
10:15
ТС хотел получить последний документ? Он его и получил - последний по дате создания(!)
14 AugustBlack
 
23.11.12
10:16
(11) 01.11.2012
15 Нуф-Нуф
 
23.11.12
10:17
Максимум по ссылке - это не последний документ.
16 zippygrill
 
23.11.12
10:21
(15) а если сначала выбрать макс(дата) и потом макс(Ссылка)?
17 Irbis
 
23.11.12
10:23
(16) Фигня получится, МАКС(ПоСсылке)<> МАКС(ПоДате)
18 Serg_1960
 
23.11.12
10:27
Имхо, ссылка сама по себе - рандомно созданная абракадабра. Использование её для сортировки - "Абсурд"(с)
19 Нуф-Нуф
 
23.11.12
10:27
сначала получаются максимальные даты и уже для этих дат находятся документы
20 Diose
 
23.11.12
10:28
может так
ВЫБРАТЬ ПЕРВЫЕ 1
ИЗ
   
ГДЕ
   

УПОРЯДОЧИТЬ ПО
   Дата УБЫВ
21 zippygrill
 
23.11.12
10:29
(17) я ж говорю сначала получает документы по максимальной даты и потом из этой даты выбирает макс(Ссылка). почему фигня?
22 Serg_1960
 
23.11.12
10:30
Вот интересно: до ста постов тема будет? Тогда я на "сотке" подброшу вариант - сортировать по дате и номеру документы :))
23 Нуф-Нуф
 
23.11.12
10:31
(22) а номер то причем?
24 zippygrill
 
23.11.12
10:31
(22) моя ветка дошла до 100 постов точно по этому вопросу :)
25 Serg_1960
 
23.11.12
10:32
(23) Да ни при чём в приципе. Я потом, на "две" уточню про момент времени :)
26 Нуф-Нуф
 
23.11.12
10:34
(25) помент времени? в запросе?
27 Serg_1960
 
23.11.12
10:37
Думаешь до двести не дотянет тогда?
28 Serg_1960
 
23.11.12
10:42
Ладно уж, сорри тс, - потрите мои посты - это тяпница виновата :)

Если "без шуток", то в запросе "скрытая" ошибка. Желая получить дату и ссылку на последний документ - нельзя использовать максимум по дате и максимум по ссылке. Вы можете получить дату из одного документа и ссылку на другой документ.
29 Нуф-Нуф
 
23.11.12
10:52
ВЫБРАТЬ
   ТоварыНаСкладах.Номенклатура КАК Номенклатура,
   ТоварыНаСкладах.Регистратор КАК Регистратор,
   ТоварыНаСкладах.Регистратор.Дата КАК Дата
ПОМЕСТИТЬ ТаблицаДвижений
ИЗ
   РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
   ТоварыНаСкладах.Номенклатура = &Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаДвижений.Номенклатура,
   МАКСИМУМ(ТаблицаДвижений.Дата) КАК Дата
ПОМЕСТИТЬ ТаблицаДат
ИЗ
   ТаблицаДвижений КАК ТаблицаДвижений

СГРУППИРОВАТЬ ПО
   ТаблицаДвижений.Номенклатура
;

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

СГРУППИРОВАТЬ ПО
   ТаблицаДат.Номенклатура
30 zippygrill
 
23.11.12
11:06
(29) это ответ на (28) что так можно? :)
31 Serg_1960
 
23.11.12
11:13
(29) Грац - у меня мозг взорвался от просветления при чтении поста.

PS: я говорил про конкретный запрос, а не "в общем виде".
32 AugustBlack
 
23.11.12
11:51
(19)(29) вы гений,спасибо!:) переделал под свой запрос все получилось!!
33 Нуф-Нуф
 
23.11.12
12:12
хотя на самом деле в (29) все равно используется максимум по ссылке. что не дает гарантию, что из двух документов с одинаковой датой выберется самый последний.

имхо самый правильный вариант:
получить в запросе  отсортированную по Номенклатуре и МоментуВремени (убыв) таблицу ТАБЛ1
Номенклатура Регистратор МоментВремени
Пронумеровать строки в запросе.

Полученную ТАБЛ1 сгруппировать по Номенклатуре и Максимум по НомеруСтроки и сунуть в ТАБЛ2

Соединить ТАБЛ2 и ТАБЛ1 по номеру строки и получить регистратор (напримере соединения в (29))
34 Нуф-Нуф
 
23.11.12
12:18
хотя гоню. вариант в (33) ничем не отличается от (29) :)
35 Serg_1960
 
23.11.12
12:39
Нуф-Нуф, не парься. Регистратором в регистре накопления могут быть документы различного вида и тогда сортировка или максимум по ссылке  - информация "не об чём" в контексте поиска последнего документа.
36 AugustBlack
 
23.11.12
13:05
(33) да нашлась строка результата запроса в которой некорректно вывелся последний документ, в осв это документ не последний а предпоследний т.е даты у 2х документов совпадают 31.10.2012 23 59 59
37 Serg_1960
 
23.11.12
13:14
(между прочим)

Момент времени - это дата документа + номер таблицы вида документа + уникальный идентификатор документа. Ссылка - это номер таблицы + идентификатор. Так?

Имхо: сортировки по дате и ссылке с отбором первых/последних (от сортировки зависит) - достаточно.

Я не прав?
38 AugustBlack
 
13.12.12
10:05
(37) получилось так
ВЫБРАТЬ
   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор.Дата) КАК РегистраторДата,
   ХозрасчетныйОбороты.Счет,
   ХозрасчетныйОбороты.Субконто1
ПОМЕСТИТЬ ПоследниеДокументыНаДату
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Обороты(, &КонДата, Регистратор, Счет = &Счет, , , , ) КАК ХозрасчетныйОбороты

СГРУППИРОВАТЬ ПО
   ХозрасчетныйОбороты.Счет,
   ХозрасчетныйОбороты.Субконто1
;

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

СГРУППИРОВАТЬ ПО
   ХозрасчетныйОбороты.Счет,
   ХозрасчетныйОбороты.Субконто1

УПОРЯДОЧИТЬ ПО
   Субконто1,
   Регистратор









но почему-то этот запрос медленее отрабатывает по сравнению с тем если получить все документы по оборотам 60.01(в случае с программной обработкой результата запроса)

ВЫБРАТЬ
   ХозрасчетныйОбороты.Регистратор КАК Регистратор,
   ХозрасчетныйОбороты.Счет,
   ХозрасчетныйОбороты.Субконто1 КАК Субконто1
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Обороты(, &КонДата, Регистратор, , , , , ) КАК ХозрасчетныйОбороты
ГДЕ
   ХозрасчетныйОбороты.Счет = &Счет

СГРУППИРОВАТЬ ПО
   ХозрасчетныйОбороты.Счет,
   ХозрасчетныйОбороты.Субконто1,
   ХозрасчетныйОбороты.Регистратор

УПОРЯДОЧИТЬ ПО
   Субконто1,
   Регистратор



на моих тестовых базах разница в 3-5 сек.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.