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

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

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

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

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

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

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

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

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

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


Хочу обратить ваше внимание на бесплатный курс по «Языку запросов 1С» от Сотникова Анатолия. Этот опытный преподаватель наглядно покажет вам, как строить запросы в 1С. Вот некоторые вопросы, которые будут обсуждаться:
  • Что такое запросы?
  • Для чего нужны параметры запроса?
  • Какие есть параметры у виртуальной таблицы?
  • Как писать условия в запросах?
  • Что такое псевдонимы?
  • Как сделать запрос к справочнику?
  • Как работать с результатом запроса во встроенном языке 1С?
  • Далее увидите сами...
Материал подобран весьма великолепный! Поэтому не стоит тратить время на его поиски во всемирной сети! Не теряйте драгоценное время! Все подробности о том, что есть в бесплатных видеоуроках на странице автора.

Вот один из уроков о консоле запросов:


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

15 ответы
  1. Alex says:

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

    Ответить
  2. Евгений says:

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

    Ответить
  3. Дмитрий says:

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

    Ответить
    • softmaker
      softmaker says:

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

      Ответить

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

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