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

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

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

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

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

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

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

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

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


Ниже вы можете посмотреть короткое видео (3 минуты), которое поможет в решении похожих на рассмотренную нами задачу:



 


Этот блог читают уже более 3000 человек
- читай и ТЫ!

15 ответы
  1. Дядя1с
    Дядя1с говорит:

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

    Ответить
  2. Alex
    Alex говорит:

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

    Ответить
  3. Евгений
    Евгений говорит:

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

    Ответить
  4. Дмитрий
    Дмитрий говорит:

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

    Ответить
    • softmaker
      softmaker говорит:

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

      Ответить

Ответить

Хотите присоединиться к обсуждению?
Не стесняйтесь вносить свой вклад!

Добавить комментарий для Softmaker Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *