1с запрос как найти последний документ

 0 

   

Распечатать

1С 8.2 УП : Как запросом получить последний по дате документ?

Сортируем документы по убыванию даты и используем конструкцию «ВЫБРАТЬ ПЕРВЫЕ 1»:

Код 1C v 8.х

 Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Контрагент = &Контрагент
|УПОРЯДОЧИТЬ ПО
| РеализацияТоваровУслуг.Дата УБЫВ";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Возврат Выборка.Ссылка;
КонецЦикла;

В результате запрос вернёт одну строку, с данными последнего документа по одному контрагенту.

А как сделать запрос, который вернёт последние документы по всем контрагентам, а не по одному конкретному?

Используем функцию МАКСИМУМ в запросе для решения данной задачи.

Код 1C v 8.х

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

Этот запрос выбирает последние документы по всем контрагентам.

Содержание:

1.       Получение последних документов в 1С

2.       Запрос с временной таблицей

Приветствую, коллеги! В данной статье будет описано, как получать последние документы в 1С из некоторой выборки из регистра двумя способами.  

1.      Получение последних документов в 1С

У многих разработчиков в 1С часто возникает вопрос: как получать последние (либо первые) документы из конкретной выборки? Данную задачу можно решить не одним, но несколькими способами.

Рассмотрим пример. Пусть есть некоторая первоначальная база 1С:Управление торговлей, редакция 11, из которой необходимо получить последнюю документацию по номенклатурному приходу по специальному регистру «ТоварыНаСкладе». Последним документом в этом контексте имеется ввиду тот документ, который имеет максимальную дату, а именно: последний документ, в котором работал пользователь системы 1С.

Далее приведены запросы для формировки корректного результата. В первом запросе результат – это демонстрационный документ. Если у нас есть только одна номенклатура, то необходимо лишь провести сортировку внутри регистра и избрать первоначальный документ.

Далее представлены примеры запросов:

Рис. 1 Запрос для поиска последнего документа в 1С

Результат будет выведен в виде следующей таблицы с последними сохраненными документами – номенклатурой по регистраторам:

Рис. 2 Таблица с последними сохраненными документами – номенклатура по регистраторам

В таком случае сортировка по умолчанию будет происходить без учета даты документации – учитывается только персональный идентификатор. Таким образом документация, которая была зарегистрирована позже некоторого времени в приходной ордер ЦУ-33, будет в самом начале нашей выборки. Рассмотрим вариант, когда сортировки по порядку не будет:

Рис. 3 Таблица без сортировки по порядку последних документов в 1С

Если необходимо выбрать последние открытые документы в списке с номенклатурой, «ВЫБРАТЬ ПЕРВЫЕ» работать не будет. В таком случае воспользуемся функцией «МАКСИМУМ», как показано в примере запроса ниже:

Рис. 4 Запрос для поиска последних открытых документов

А результат данного запроса будет следующим:

Рис. 5 Результат поиска последних открытых документов

В данном случае конструкция «МАКСИМУМ» разбивает избранную выборку по «GUID» объекта. Данным способом можно воспользоваться в 1С 8 УТ 11 в случае, когда необходимо получить последний сохраненный документ, опираясь на его дату. Так мы получаем список с номенклатурой и, при помощи цикла для всех позиций по отдельности, последний документ в 1С 8 «Управление торговлей» 11. Но данный способ занимает довольно много времени и уменьшает производительность.  

2. Запрос с временной таблицей

Сделаем запрос с временной таблицей, при помощи которой будет происходить проверка выборки по большей дате. Эта дата и будет соединять временную выборку с основной. В запросе упорядочим выборки по максимальному регистратору. В таком варианте дата последнего документа будет учитываться. Этот пример показан на демонстрационном примере скриншота ниже:

Рис. 6 Запрос с временной таблицей

Результат будет следующим:

Рис. 7 Результат запроса с временной таблицей

Специалист компании «Кодерлайн»

Айдар Фархутдинов

Приветсвую вас, уважаемые читатели блога SoftMaker.kz! Использование запросов в 1С помогает справляться с различными задачами, которые возникают на практике. Мы уже рассматривали примеры запросов, связанных с соединением и объединением, а также пакетные запросы. Еще есть целая статья, которая посвящена теме запросов. А сегодня, с помощью примеров, мы рассмотрим, как получить последние документы в 1С запросе. Давайте начнем!

Для начала отсортируем документы по убыванию момента времени и используем конструкцию «ВЫБРАТЬ ПЕРВЫЕ 1»:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
|	РеализацияТоваровУслуг.Ссылка
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
|	РеализацияТоваровУслуг.Контрагент = &Контрагент
|УПОРЯДОЧИТЬ ПО
|	РеализацияТоваровУслуг.МоментВремени УБЫВ";
Запрос.УстановитьПараметр("Контрагент",	Контрагент);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
	Возврат Выборка.Ссылка;
КонецЦикла;

В результате запрос вернёт одну строку, с данными последнего документа по одному контрагенту. Мы берем не дату, так как в одну секунду может быть много документов, поэтому нельзя быть уверенным, что будет взят последний из этих документов. Поэтому в запросе нужно сортировать по моменту времени и отбор первого документа. Такой запрос вернет последний документ. Момент времени это сочитание даты документа и ссылки, поэтому можно написать и так:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 1
|	РеализацияТоваровУслуг.Ссылка
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
|	РеализацияТоваровУслуг.Контрагент = &Контрагент
|УПОРЯДОЧИТЬ ПО
|	РеализацияТоваровУслуг.Дата УБЫВ,
|	РеализацияТоваровУслуг.Ссылка УБЫВ";
Запрос.УстановитьПараметр("Контрагент",	Контрагент);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
	Возврат Выборка.Ссылка;
КонецЦикла;

А как сделать запрос, который вернёт последние документы по всем контрагентам, а не по одному конкретному? Используем функцию МАКСИМУМ в запросе для решения данной задачи:

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

Этот запрос выбирает последние документы по всем контрагентам.

А как сделать запрос, который вернёт последние документы по всем номенклатурам и их ценам? Вот код:

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

ПОДПИСКА

Наверняка многие коллеги сталкивались с такой задачей, как получение первых/последних документов в выборке. В зависимости от необходимого результата к реализации решения можно подойти различными способами.

Разберем на примере демо-базы УТ11, найдем последние документы прихода номенклатуры по регистру «ТоварыНаСкладе». Под последним документом в контексте данной задачи может пониматься как документ с наибольшей датой документа, так и последний документ, введенный пользователем.

В ниже приведенных пакетных запросах первый запрос пакета нужен для демонстрации картины в целом, последующие запросы формируют результат.
Для одной номенклатуры все просто, нужно сделать упорядочивание по регистратору и выбрать первый документ.

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

УПОРЯДОЧИТЬ ПО
 Регистратор УБЫВ
 АВТОУПОРЯДОЧИВАНИЕ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
 ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,      
 ТоварыНаСкладахОбороты.Регистратор КАК Регистратор,
 ТоварыНаСкладахОбороты.ВНаличииПриход КАК ВНаличииПриход
ИЗ
 РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
ГДЕ
 ТоварыНаСкладахОбороты.ВНаличииПриход > 0

УПОРЯДОЧИТЬ ПО
 Регистратор УБЫВ
 АВТОУПОРЯДОЧИВАНИЕ 

Без автоупорядочивания сортировка произойдет без учета даты документа, по уникальному идентификатору. В этом случае, документы введенные позже приходного ордера ЦУ-33 задним числом встанут в начало выборки. Уберем «АВТОУПОРЯДОЧИВАНИЕ» из запроса и посмотрим результат.

Если воспользоваться методом получения даты создания объекта из GUID, то в первом случае 3339428b-6656-11e0-af2a-0015e9b8c48d создан 14.04.2011, во втором b2c7cfa2-6ca9-11e0-af30-0015e9b8c48d — 22.04.2011. То есть второй способ можно применять, если нужно определить последний документ прихода, введенный пользователем.

В случае, когда нужно определить последние документы для перечня номенклатуры конструкция «ВЫБРАТЬ ПЕРВЫЕ» нам уже не подходит. Поэтому, чтобы свернуть выборку по регистратору, будем использовать функцию МАКСИМУМ.

ВЫБРАТЬ
 ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
 ТоварыНаСкладахОбороты.Регистратор КАК Регистратор

ИЗ
 РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
 ТоварыНаСкладахОбороты.ВНаличииПриход > 0

УПОРЯДОЧИТЬ ПО
 Номенклатура,
 Регистратор УБЫВ
 АВТОУПОРЯДОЧИВАНИЕ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
 МАКСИМУМ(ТоварыНаСкладахОбороты.Регистратор) КАК Регистратор

ИЗ
 РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
 ТоварыНаСкладахОбороты.ВНаличииПриход > 0

СГРУППИРОВАТЬ ПО
 ТоварыНаСкладахОбороты.Номенклатура

УПОРЯДОЧИТЬ ПО
 Номенклатура,
 Регистратор УБЫВ
 АВТОУПОРЯДОЧИВАНИЕ
;

Как видно из результата, функция МАКСИМУМ сворачивает выборку по GUID объекта. То есть, этот способ не подходит для случая, когда нам нужно получить последний документ, исходя из даты документа. Получать перечень номенклатуры и потом в цикле для каждой позиции получать последний документ тоже не наш вариант, замедляется быстродействие. Поэтому перепишем запрос, добавим временную таблицу, в которой свернем выборку по максимуму даты регистратора. Эту дату и будем использовать для соединения с основной выборкой. В последнем запросе так же сворачиваем выборку по максимуму регистратора, но теперь мы получим последний введенный документ с учетом последней даты документа.

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

УПОРЯДОЧИТЬ ПО
 Номенклатура,
 Регистратор УБЫВ
 АВТОУПОРЯДОЧИВАНИЕ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
 МАКСИМУМ(ТоварыНаСкладахОбороты.Регистратор.Дата) КАК Дата
ПОМЕСТИТЬ времДата
ИЗ
 РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
 ТоварыНаСкладахОбороты.ВНаличииПриход > 0

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

СГРУППИРОВАТЬ ПО
 ТоварыНаСкладахОбороты.Номенклатура

УПОРЯДОЧИТЬ ПО
 Номенклатура
 АВТОУПОРЯДОЧИВАНИЕ 

UPD: как правильно заметили в комментариях, механизм генерации ГУИД обеспечивает только уникальность, но не возрастающую последовательность. На момент написания статьи проведенные тесты давали необходимый результат. Но гарантии, что выявленная закономерность сохранится в последующих версиях платформы, нет. Поэтому, если необходимо фиксировать момент создания документов, то лучше реализовать свой механизм. Например, с использованием регистра сведений.

как в запросе выбрать самый последний документ

Я
   AugustBlack

23.11.12 — 08:38

привет, подскажите в запросе есть ссылка на документ и дата, как выбрать самый последний док из кучи строк регистра бухгалтерии, функция МАКСИМУМ?

   Нуф-Нуф

1 — 23.11.12 — 08:43

В поиск епта. Через день такое спрашивают

   AugustBlack

2 — 23.11.12 — 10:00

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

   Промежуточная_ТЗ.Контрагент,

   Промежуточная_ТЗ.Счет,

   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор) КАК Документ,

   СУММА(Промежуточная_ТЗ.Дебет) КАК Дебет,

   СУММА(Промежуточная_ТЗ.Кредит) КАК Кредит

ИЗ

   Промежуточная_ТЗ КАК Промежуточная_ТЗ,

   РегистрБухгалтерии.Хозрасчетный.Обороты(, &ДатаКон, Регистратор, Счет В ИЕРАРХИИ (&СписокСчетов), , Организация = &Организация, КорСчет В ИЕРАРХИИ (&СписокСчетов), ) КАК ХозрасчетныйОбороты

ГДЕ

   (Промежуточная_ТЗ.Документ ЕСТЬ NULL

           ИЛИ Промежуточная_ТЗ.Документ = НЕОПРЕДЕЛЕНО)

   И Промежуточная_ТЗ.Счет = ХозрасчетныйОбороты.Счет

   И Промежуточная_ТЗ.Контрагент = ХозрасчетныйОбороты.Субконто1

СГРУППИРОВАТЬ ПО

   Промежуточная_ТЗ.Контрагент,

   Промежуточная_ТЗ.Счет

УПОРЯДОЧИТЬ ПО

   Документ УБЫВ

   AugustBlack

3 — 23.11.12 — 10:01

(2) в этом запросе,не понимаю почему на выходе получаю не последний документ а последний документ января, хотя последний в октябре должен быть

   mikecool

4 — 23.11.12 — 10:02

(3) ну ты по дате попробуй упорядочить чтоле

   Cube

5 — 23.11.12 — 10:06

(0) Нажми большую красную букву «Я» справа от заголовка темы…

   AugustBlack

6 — 23.11.12 — 10:07

(4) упорядочил:

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

   Промежуточная_ТЗ.Контрагент,

   Промежуточная_ТЗ.Счет,

   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор.Дата) КАК ДокументДата,

   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор) КАК Документ,

   СУММА(Промежуточная_ТЗ.Дебет) КАК Дебет,

   СУММА(Промежуточная_ТЗ.Кредит) КАК Кредит

ИЗ

   Промежуточная_ТЗ КАК Промежуточная_ТЗ,

   РегистрБухгалтерии.Хозрасчетный.Обороты(, &ДатаКон, Регистратор, Счет В ИЕРАРХИИ (&СписокСчетов), , Организация = &Организация, КорСчет В ИЕРАРХИИ (&СписокСчетов), ) КАК ХозрасчетныйОбороты

ГДЕ

   (Промежуточная_ТЗ.Документ ЕСТЬ NULL

           ИЛИ Промежуточная_ТЗ.Документ = НЕОПРЕДЕЛЕНО)

   И Промежуточная_ТЗ.Счет = ХозрасчетныйОбороты.Счет

   И Промежуточная_ТЗ.Контрагент = ХозрасчетныйОбороты.Субконто1

СГРУППИРОВАТЬ ПО

   Промежуточная_ТЗ.Контрагент,

   Промежуточная_ТЗ.Счет

УПОРЯДОЧИТЬ ПО

   ДокументДата УБЫВ

поля:

датадокумента         документ

31.10.2012 23:59:59  операция 00001 от 31.01.2012:23 59 59

   Reset

7 — 23.11.12 — 10:09

(6) Регистратор в Сгруппировать

   Cube

8 — 23.11.12 — 10:09

(6) И что тебя удивляет? Смотри (5)

   Reset

9 — 23.11.12 — 10:09

(7) Не читать, не проснулся еще

   dk

10 — 23.11.12 — 10:10

МАКСИМУМ(ХозрасчетныйОбороты.Регистратор.Дата)

и

МАКСИМУМ(ХозрасчетныйОбороты.Регистратор)

вообще-то не связаны др/др

   salvator

11 — 23.11.12 — 10:10

(6) ДатаКон чему равно?

   Irbis

12 — 23.11.12 — 10:10

Выбрать первый с конца

   Serg_1960

13 — 23.11.12 — 10:15

»    AugustBlack

14 — 23.11.12 — 10:16

(11) 01.11.2012

   Нуф-Нуф

15 — 23.11.12 — 10:17

Максимум по ссылке — это не последний документ.

   zippygrill

16 — 23.11.12 — 10:21

(15) а если сначала выбрать макс(дата) и потом макс(Ссылка)?

   Irbis

17 — 23.11.12 — 10:23

(16) Фигня получится, МАКС(ПоСсылке)<> МАКС(ПоДате)

   Serg_1960

18 — 23.11.12 — 10:27

»    Нуф-Нуф

19 — 23.11.12 — 10:27

сначала получаются максимальные даты и уже для этих дат находятся документы

   Diose

20 — 23.11.12 — 10:28

может так

ВЫБРАТЬ ПЕРВЫЕ 1

ИЗ

   
ГДЕ

   

УПОРЯДОЧИТЬ ПО

   Дата УБЫВ

   zippygrill

21 — 23.11.12 — 10:29

(17) я ж говорю сначала получает документы по максимальной даты и потом из этой даты выбирает макс(Ссылка). почему фигня?

   Serg_1960

22 — 23.11.12 — 10:30

»    Нуф-Нуф

23 — 23.11.12 — 10:31

(22) а номер то причем?

   zippygrill

24 — 23.11.12 — 10:31

(22) моя ветка дошла до 100 постов точно по этому вопросу :)

   Serg_1960

25 — 23.11.12 — 10:32

»    Нуф-Нуф

26 — 23.11.12 — 10:34

(25) помент времени? в запросе?

   Serg_1960

27 — 23.11.12 — 10:37

»    Serg_1960

28 — 23.11.12 — 10:42

Ладно уж, сорри тс, — потрите мои посты — это тяпница виновата :)

Если «без шуток», то в запросе «скрытая» ошибка. Желая получить дату и ссылку на последний документ — нельзя использовать максимум по дате и максимум по ссылке. Вы можете получить дату из одного документа и ссылку на другой документ.

   Нуф-Нуф

29 — 23.11.12 — 10:52

ВЫБРАТЬ

   ТоварыНаСкладах.Номенклатура КАК Номенклатура,

   ТоварыНаСкладах.Регистратор КАК Регистратор,

   ТоварыНаСкладах.Регистратор.Дата КАК Дата

ПОМЕСТИТЬ ТаблицаДвижений

ИЗ

   РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

ГДЕ

   ТоварыНаСкладах.Номенклатура = &Номенклатура

;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

   ТаблицаДвижений.Номенклатура,

   МАКСИМУМ(ТаблицаДвижений.Дата) КАК Дата

ПОМЕСТИТЬ ТаблицаДат

ИЗ

   ТаблицаДвижений КАК ТаблицаДвижений

СГРУППИРОВАТЬ ПО

   ТаблицаДвижений.Номенклатура

;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

   ТаблицаДат.Номенклатура,

   МАКСИМУМ(ТаблицаДвижений.Регистратор) КАК Регистратор

ИЗ

   ТаблицаДат КАК ТаблицаДат

       ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаДвижений КАК ТаблицаДвижений

       ПО ТаблицаДат.Дата = ТаблицаДвижений.Дата

СГРУППИРОВАТЬ ПО

   ТаблицаДат.Номенклатура

   zippygrill

30 — 23.11.12 — 11:06

(29) это ответ на (28) что так можно? :)

   Serg_1960

31 — 23.11.12 — 11:13

(29) Грац — у меня мозг взорвался от просветления при чтении поста.

PS: я говорил про конкретный запрос, а не «в общем виде».

   AugustBlack

32 — 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) :)

   Serg_1960

35 — 23.11.12 — 12:39

Нуф-Нуф, не парься. Регистратором в регистре накопления могут быть документы различного вида и тогда сортировка или максимум по ссылке  — информация «не об чём» в контексте поиска последнего документа.

   AugustBlack

36 — 23.11.12 — 13:05

(33) да нашлась строка результата запроса в которой некорректно вывелся последний документ, в осв это документ не последний а предпоследний т.е даты у 2х документов совпадают 31.10.2012 23 59 59

   Serg_1960

37 — 23.11.12 — 13:14

(между прочим)

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

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

Я не прав?

  

AugustBlack

38 — 13.12.12 — 10:05

(37) получилось так

ВЫБРАТЬ

   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор.Дата) КАК РегистраторДата,

   ХозрасчетныйОбороты.Счет,

   ХозрасчетныйОбороты.Субконто1

ПОМЕСТИТЬ ПоследниеДокументыНаДату

ИЗ

   РегистрБухгалтерии.Хозрасчетный.Обороты(, &КонДата, Регистратор, Счет = &Счет, , , , ) КАК ХозрасчетныйОбороты

СГРУППИРОВАТЬ ПО

   ХозрасчетныйОбороты.Счет,

   ХозрасчетныйОбороты.Субконто1

;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

   МАКСИМУМ(ХозрасчетныйОбороты.Регистратор) КАК Регистратор,

   ХозрасчетныйОбороты.Счет,

   ХозрасчетныйОбороты.Субконто1 КАК Субконто1

ИЗ

   РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, , , , , ) КАК ХозрасчетныйОбороты

       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПоследниеДокументыНаДату КАК ПоследниеДокументыНаДату

       ПО ХозрасчетныйОбороты.Счет = ПоследниеДокументыНаДату.Счет

           И ХозрасчетныйОбороты.Субконто1 = ПоследниеДокументыНаДату.Субконто1

           И ХозрасчетныйОбороты.Регистратор.Дата = ПоследниеДокументыНаДату.РегистраторДата

СГРУППИРОВАТЬ ПО

   ХозрасчетныйОбороты.Счет,

   ХозрасчетныйОбороты.Субконто1

УПОРЯДОЧИТЬ ПО

   Субконто1,

   Регистратор

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

ВЫБРАТЬ

   ХозрасчетныйОбороты.Регистратор КАК Регистратор,

   ХозрасчетныйОбороты.Счет,

   ХозрасчетныйОбороты.Субконто1 КАК Субконто1

ИЗ

   РегистрБухгалтерии.Хозрасчетный.Обороты(, &КонДата, Регистратор, , , , , ) КАК ХозрасчетныйОбороты

ГДЕ

   ХозрасчетныйОбороты.Счет = &Счет

СГРУППИРОВАТЬ ПО

   ХозрасчетныйОбороты.Счет,

   ХозрасчетныйОбороты.Субконто1,

   ХозрасчетныйОбороты.Регистратор

УПОРЯДОЧИТЬ ПО

   Субконто1,

   Регистратор

на моих тестовых базах разница в 3-5 сек.

Понравилась статья? Поделить с друзьями:
  • Как найти медиану ряда чисел четное число
  • Как можно найти тсж
  • Как правильно составить список литературы для проекта
  • Как правильно составить исковой документ
  • Как в отсканированном документе исправить текст онлайн