Как в запросе 1C получить последний по дате документ?

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

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

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

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

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

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

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

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

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

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


ПОДПИСКА

15 ответы
  1. Basilio говорит:

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

  2. Дядя1с говорит:

    Второй запрос вернет даты и контрагентов, но никак не документы :(

  3. Vitaliy говорит:

    Последний запрос не работает. Пишет: "Неверные параметры МАКСИМУМ"

  4. Alex говорит:

    Второй запрос — вообще нерабочий: автор не проверял его.\r\nМАКСИМУМ работает только на \\\"Дата\\\" (и то без детализации, только если выбирать одно поле \\\"Дата\\\"), или \\\"Период\\\"

  5. Виктор говорит:

    Ребяты, все работает, проверьте внимательнее…

  6. Евгений говорит:

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

  7. Дмитрий говорит:

    Функция МАКСИМУМ при сравнении доков дает неверные результаты, если у документов различаются поля, как например в моем случае Склады — только что уперся в эту ерунду. Очевидно, что один док 2013 года, а другой — 2014-го, но МАКСИМУМ выбирает док 2013-го года.
    Как обойти пока не знаю — это внутренний запрос и возможности сортировать внутреннюю выборку нет.

  8. softmaker говорит:

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

  9. jek говорит:

    Верное замечание.
    Что скажет автор?

  10. softmaker говорит:

    Я скажу, что нужно изменить запрос…

Комментарии закрыты.