Как в запросе 1C получить последний по дате документ?
Приветсвую вас, уважаемые читатели блога SoftMaker.kz! Использование запросов в 1С помогает справляться с различными задачами, которые возникают на практике. Мы уже рассматривали примеры запросов, связанных с соединением и объединением, а также пакетные запросы. Еще есть целая статья, которая посвящена теме запросов. А сегодня, с помощью примеров, мы рассмотрим, как получить последние документы в 1С запросе. Давайте начнем!
Для начала отсортируем документы по убыванию момента времени и используем конструкцию «ВЫБРАТЬ ПЕРВЫЕ 1»:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ ПЕРВЫЕ 1 | РеализацияТоваровУслуг.Ссылка |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Контрагент = &Контрагент |УПОРЯДОЧИТЬ ПО | РеализацияТоваровУслуг.МоментВремени УБЫВ"; Запрос.УстановитьПараметр("Контрагент", Контрагент); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Возврат Выборка.Ссылка; КонецЦикла;
В результате запрос вернёт одну строку, с данными последнего документа по одному контрагенту. Мы берем не дату, так как в одну секунду может быть много документов, поэтому нельзя быть уверенным, что будет взят последний из этих документов. Поэтому в запросе нужно сортировать по моменту времени и отбор первого документа. Такой запрос вернет последний документ. Момент времени это сочитание даты документа и ссылки, поэтому можно написать и так:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ ПЕРВЫЕ 1 | РеализацияТоваровУслуг.Ссылка |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Контрагент = &Контрагент |УПОРЯДОЧИТЬ ПО | РеализацияТоваровУслуг.Дата УБЫВ, | РеализацияТоваровУслуг.Ссылка УБЫВ"; Запрос.УстановитьПараметр("Контрагент", Контрагент); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Возврат Выборка.Ссылка; КонецЦикла;
А как сделать запрос, который вернёт последние документы по всем контрагентам, а не по одному конкретному? Используем функцию МАКСИМУМ в запросе для решения данной задачи:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | ПоследниеДокументыКонтрагентов.Ссылка, | ПоследниеДокументыКонтрагентов.Контрагент |ИЗ Документ.РеализацияТоваровУслуг КАК ПоследниеДокументыКонтрагентов |ВНУТРЕННЕЕ СОЕДИНЕНИЕ | (ВЫБРАТЬ | Доки.Контрагент КАК Контрагент, | МАКСИМУМ(Доки.Дата) КАК ДатаПоследнегоДокумента | ИЗ Документ.РеализацияТоваровУслуг КАК Доки |СГРУППИРОВАТЬ ПО Доки.Контрагент) |КАК ДатыПоследнихДокументовКонтрагентов |ПО ПоследниеДокументыКонтрагентов.Контрагент = |ДатыПоследнихДокументовКонтрагентов.Контрагент |И ПоследниеДокументыКонтрагентов.Дата = |ДатыПоследнихДокументовКонтрагентов.ДатаПоследнегоДокумента"; РезультатЗапроса = Запрос.Выполнить();
Этот запрос выбирает последние документы по всем контрагентам.
А как сделать запрос, который вернёт последние документы по всем номенклатурам и их ценам? Вот код:
"ВЫБРАТЬ | ПоследниеДокументыНоменклатуры.Ссылка КАК Ссылка, | ПоследниеДокументыНоменклатуры.Номенклатура КАК Номенклатура, | ПоследниеДокументыНоменклатуры.Цена КАК Цена |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПоследниеДокументыНоменклатуры | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | Доки.Номенклатура КАК Номенклатура, | МАКСИМУМ(Доки.Ссылка.Дата) КАК ДатаПоследнегоДокумента | ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК Доки | | СГРУППИРОВАТЬ ПО | Доки.Номенклатура) КАК ДатыПоследнихДокументовНоменклатуры | ПО ПоследниеДокументыНоменклатуры.Номенклатура = ДатыПоследнихДокументовНоменклатуры.Номенклатура | И ПоследниеДокументыНоменклатуры.Ссылка.Дата = ДатыПоследнихДокументовНоменклатуры.ДатаПоследнегоДокумента"
второй запрос — ерунда. он все документы выбирает а не последние.
Спасибо, проверю.
Запрос исправлен!
Второй запрос вернет даты и контрагентов, но никак не документы :(
Доки, доки вернёт сейчас!
Ага, пасиба :)
Пожалуйста!
Последний запрос не работает. Пишет: "Неверные параметры МАКСИМУМ"
Второй запрос — вообще нерабочий: автор не проверял его.\r\nМАКСИМУМ работает только на \\\"Дата\\\" (и то без детализации, только если выбирать одно поле \\\"Дата\\\"), или \\\"Период\\\"
Ребяты, все работает, проверьте внимательнее…
Последний запрос не совсем верен. Если будет такое что по одному и тому же контрагенту в одно и тоже время завели два одинаковых документа. Получится что они оба будут последний, но это же не правильно
Функция МАКСИМУМ при сравнении доков дает неверные результаты, если у документов различаются поля, как например в моем случае Склады — только что уперся в эту ерунду. Очевидно, что один док 2013 года, а другой — 2014-го, но МАКСИМУМ выбирает док 2013-го года.
Как обойти пока не знаю — это внутренний запрос и возможности сортировать внутреннюю выборку нет.
Здравствуйте, Дмитрий! Попробуйте проиграть в консоли запросов различные варианты, я думаю у вас получится!
Верное замечание.
Что скажет автор?
Я скажу, что нужно изменить запрос…