Вывожу список документов, есть дубли - точнее это не дубли, а несколько созданных документов по одному контрагенту. Как в запросе вывести список, где по контрагенту, в случае наличия у него нескольких доков, выводить последний? Заранее спасибо!
Пытаюсь через максимум, различные.

```1c
    ВЫБРАТЬ
    Максимум(Период.Дата),
    Период.ВидОперации,
    Различные(Период.Контрагент),
    Период.ДатаОкончания
    ИЗ
    Документ.Период КАК Период
    Где Период.Дата > &Дата
    Сгруппировать по Период.ВидОперации,
    Период.Контрагент,
    Период.ДатаОкончания
    Упорядочить по Период.Контрагент
```
---
Адаптировал вот это решение https://forum.infostart.ru/forum9/topic55439/?ysclid=lbnh0x6kz6432343410 (пост№20) для момента времени.

В моем тесте отработало (в т.ч., для документов с одинаковой датой):

ВЫБРАТЬ РАЗЛИЧНЫЕ
 ВашДокумент.Контрагент КАК Контрагент,
 ВашДокумент.Ссылка КАК Ссылка,
 КОЛИЧЕСТВО(ВашДокумент1.Ссылка) КАК Номер
ИЗ
 Документ.ВашДокумент КАК ВашДокумент
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВашДокумент КАК ВашДокумент1
  ПО ВашДокумент.МоментВремени <= ВашДокумент1.МоментВремени
   И ВашДокумент.Контрагент = ВашДокумент1.Контрагент
ГДЕ
 ВашДокумент.Дата МЕЖДУ &НачалоПериода И &КонецПериода
 И ВашДокумент.Контрагент В(&МассивКонтрагентов)
 И ВашДокумент1.Дата МЕЖДУ &НачалоПериода И &КонецПериода
 И ВашДокумент1.Контрагент В(&МассивКонтрагентов)

СГРУППИРОВАТЬ ПО
 ВашДокумент.Контрагент,
 ВашДокумент.Ссылка

ИМЕЮЩИЕ
 КОЛИЧЕСТВО(ВашДокумент1.Ссылка) = 1

УПОРЯДОЧИТЬ ПО
 Контрагент,
 Номер
---
Выбрать
Контрагент
максимум (период.МоментВремени)
поместить вт
;
Выбрать
вт.Контрагент,
Период.Дата
Из
вт
внутрнее соединение
документ.период
по вт.Контрагент = Период.Контрагент
и вт.моментвремени = Период.моментвремени.
---
Спасибо!
---
странно,а у меня выдает ошибку на максимум (период.МоментВремени)!
говорит неправильный параметр....
---
Не проверял. Если действительно так, тогда можно по максимум дате. Но здесь возможна ситуация с одинаковыми датами. ТОгда надо дополнительно максимум по ссылке делать.
---
А Может:
Выбрать ПЕРВЫЕ 1
...
И сортировать по дате убывание.
---
но я же таким образом не получу всех, а только одного контрагента
---
(6) Согласен, можно отсортировать по полю МоментВремени и выбрать Первые 1.
Группировать действительно не дает
---
Сообщение было скрыто модератором.
---
Прошу помочь, так и не разобрался, как сделать с "Первые 1" (с убыванием по дате), ведь в таком случае не выходит список со всеми контрагентами
---
Обязательно только в запросе? мне кажется с моментом времени в запросе не получится
---
Да, необходимо, чтобы запрос выдавал результат без дублей по контрагенту. Можно с датой!
---
Мне приходит на ум только с постобработкой

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

    Выборка = Запрос.Выполнить().Выбрать();
    ШаблонВывода = "Контрагент: "%1". Дата: %2";

    Пока Выборка.СледующийПоЗначениюПоля("Контрагент") Цикл

    Пока Выборка.СледующийПоЗначениюПоля("МоментВремени") Цикл
    Сообщить(СтрШаблон(ШаблонВывода, Выборка.КонтрагентПредставление, Выборка.Дата));
    Прервать;
    КонецЦикла;

    КонецЦикла;
```
---
Вот такой результат, хотелось бы исключить повторы по контрагенту
---
Адаптировал вот это решение https://forum.infostart.ru/forum9/topic55439/?ysclid=lbnh0x6kz6432343410 (пост№20) для момента времени.

В моем тесте отработало (в т.ч., для документов с одинаковой датой):

ВЫБРАТЬ РАЗЛИЧНЫЕ
 ВашДокумент.Контрагент КАК Контрагент,
 ВашДокумент.Ссылка КАК Ссылка,
 КОЛИЧЕСТВО(ВашДокумент1.Ссылка) КАК Номер
ИЗ
 Документ.ВашДокумент КАК ВашДокумент
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВашДокумент КАК ВашДокумент1
  ПО ВашДокумент.МоментВремени <= ВашДокумент1.МоментВремени
   И ВашДокумент.Контрагент = ВашДокумент1.Контрагент
ГДЕ
 ВашДокумент.Дата МЕЖДУ &НачалоПериода И &КонецПериода
 И ВашДокумент.Контрагент В(&МассивКонтрагентов)
 И ВашДокумент1.Дата МЕЖДУ &НачалоПериода И &КонецПериода
 И ВашДокумент1.Контрагент В(&МассивКонтрагентов)

СГРУППИРОВАТЬ ПО
 ВашДокумент.Контрагент,
 ВашДокумент.Ссылка

ИМЕЮЩИЕ
 КОЛИЧЕСТВО(ВашДокумент1.Ссылка) = 1

УПОРЯДОЧИТЬ ПО
 Контрагент,
 Номер
---
О, надо запомнить, вдруг пригодится
---
Зачем, на ВТ быстрее и куда меньше памяти жрёт.
---
Не понял, а как с ВТ получится?
---
Во втором ответе
---
Максимум по моменту времени нельзя получить, к сожалению. Возможно из-за того, что это виртуальное поле
---
Упорядочить то можно по нему?
PS
На худой конец можно еще в одну ВТ всё завернуть, я не встречал таких критических задач с учетом момента времени.
---
Можно, но что нам это даст

Допустим:

    МоментВремени1 Контрагент1
    МоментВремени2 Контрагент1
    МоментВремени3 Контрагент1
    МоментВремени4 Контрагент2

И как здесь получить такой результат:
    МоментВремени3 Контрагент1
    МоментВремени4 Контрагент2
---
Завернуть еще в ВТ
---
Не понимаю как с ВТ и сортировкой тут можно, был бы один контрагент, то да, можно

PS: Момент времени здесь нужен из-за того, что документы могут иметь одинаковую дату и тогда непонятно, какой из них последний
---
А что если вместо МоментаВремени, применить Максимум() к Дата и Ссылка, вроде корректный результат, потом уже левым соединением по ссылке вытащить остальные реквизиты:

```1c
    ВЫБРАТЬ
    Максимум(Период.Ссылка) КАК Ссылка,
    Период.Контрагент КАК Контрагент,
    МАКСИМУМ(Период.Дата) КАК Дата
    ИЗ
    Документ.Период КАК Период
    ГДЕ
    Период.Контрагент В (&СписокКонтрагентов)

    СГРУППИРОВАТЬ ПО
    Период.Контрагент
    УПОРЯДОЧИТЬ ПО
    Период.Контрагент.Наименование
```
---
максимум по ссылке некорректен, насколько я понимаю, потому что GUIDы даются пулом на сеанс, а в каком сеансе создаются документы, кто их знает. Так что я бы не стал ориентироваться на ссылку
---
Спасибо!
---
Например так:

```1c
    ВЫБРАТЬ
    ПоступлениеТоваров.Контрагент КАК Контрагент,
    МАКСИМУМ(ПоступлениеТоваров.Дата) КАК Дата
    ПОМЕСТИТЬ ВТ_МДАТА
    ИЗ
    Документ.ПоступлениеТоваров КАК ПоступлениеТоваров

    СГРУППИРОВАТЬ ПО
    ПоступлениеТоваров.Контрагент
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_МДАТА.Контрагент КАК Контрагент,
    ВТ_МДАТА.Дата КАК Дата,
    ПоступлениеТоваров.МоментВремени КАК МоментВремени
    ИЗ
    ВТ_МДАТА КАК ВТ_МДАТА
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    ПО ВТ_МДАТА.Контрагент = ПоступлениеТоваров.Контрагент
    И ВТ_МДАТА.Дата = ПоступлениеТоваров.Дата
    И (ПоступлениеТоваров.Ссылка В
    (ВЫБРАТЬ ПЕРВЫЕ 1
    ПоступлениеТоваров.Ссылка КАК Ссылка
    ИЗ
    Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    ГДЕ
    ПоступлениеТоваров.Дата = ВТ_МДАТА.Дата
    И ПоступлениеТоваров.Контрагент = ВТ_МДАТА.Контрагент
    УПОРЯДОЧИТЬ ПО
    ПоступлениеТоваров.МоментВремени УБЫВ))
```
---
сильно сомневаюсь, что этот вариант будет быстрее
---
Это уже покажет автору замер производительности, я только хотел предложить использовать вместо запрещенного Максимум(МоментВремени), сочетание Максимум(Дата)+Максимум(Ссылка).
---
и опять же максимум по ссылке некорректен
---
Можете провести тестирование)
---
создание ВТ, соединение 3х таблиц
или же соединение двух таблиц

Даже не знаю, стоит ли тут тестировать ¯\_(ツ)_/¯
---
Вот вам результат, правда я сравнивал без ограничений по периодам и контрагентам:
Запрос на ВТ:
ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма 39 Р = Запрос.Выполнить(); 1 0,225745 100,00

Запрос без ВТ:
ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма 58 Р = Запрос.Выполнить(); 1 52,202957 100,00

Результаты запросов идентичны.
ВТ быстрее в 230 раз.
---
А какие запросы использовались, можно выложить сюда?
---
```1c
    Запрос.Текст =
    "ВЫБРАТЬ
    | ПоступлениеТоваров.Контрагент КАК Контрагент,
    | МАКСИМУМ(ПоступлениеТоваров.Дата) КАК Дата
    |ПОМЕСТИТЬ ВТ_МДАТА
    |ИЗ
    | Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    |
    |СГРУППИРОВАТЬ ПО
    | ПоступлениеТоваров.Контрагент
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_МДАТА.Контрагент КАК Контрагент,
    | ВТ_МДАТА.Дата КАК Дата,
    | ПоступлениеТоваров.МоментВремени КАК МоментВремени,
    | ПоступлениеТоваров.Ссылка КАК Ссылка
    |ИЗ
    | ВТ_МДАТА КАК ВТ_МДАТА
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    | ПО ВТ_МДАТА.Контрагент = ПоступлениеТоваров.Контрагент
    | И ВТ_МДАТА.Дата = ПоступлениеТоваров.Дата
    | И (ПоступлениеТоваров.Ссылка В
    | (ВЫБРАТЬ ПЕРВЫЕ 1
    | ПоступлениеТоваров.Ссылка КАК Ссылка
    | ИЗ
    | Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    | ГДЕ
    | ПоступлениеТоваров.Дата = ВТ_МДАТА.Дата
    | И ПоступлениеТоваров.Контрагент = ВТ_МДАТА.Контрагент
    | УПОРЯДОЧИТЬ ПО
    | ПоступлениеТоваров.МоментВремени УБЫВ))";

    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    | ПоступлениеТоваров.Контрагент КАК Контрагент,
    | ПоступлениеТоваров.Ссылка КАК Ссылка,
    | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваров1.Ссылка) КАК Ссылка1
    |ИЗ
    | Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров1
    | ПО ПоступлениеТоваров.МоментВремени <= ПоступлениеТоваров1.МоментВремени
    | И ПоступлениеТоваров.Контрагент = ПоступлениеТоваров1.Контрагент
    |
    |СГРУППИРОВАТЬ ПО
    | ПоступлениеТоваров.Контрагент,
    | ПоступлениеТоваров.Ссылка
    |
    |ИМЕЮЩИЕ
    | КОЛИЧЕСТВО(ПоступлениеТоваров1.Ссылка) = 1";
```
---
Спасибо
---
Ну а момент времени у нас что - Дата + Ссылка, насколько я понимаю упорядочиваемся сначала по дате, затем по ссылке. На счет "GUIDы даются пулом на сеанс", как я это понимаю, на сеанс дается первоначальный GUID, затем он просто увеличивается по мере создания новых объектов. Таким образом среди созданных в разных сеансах одновременно документов, более поздним будет считаться тот, что создан в более позднем сеансе (получившим GUID позже).
---
ну допустим, есть Сеанс1 ему дан пул GUIDов. Есть Сеанс2 - тоже дан пул GUIDов

Создается документ в Сеансе2, а потом в Сеансе1
и какой из GUIDов последний? (нам нужен GUID из Сеанса1, но пул получен раньше)

насколько я понимаю упорядочиваемся сначала по дате, затем по ссылке

не факт, что по GUID сортируется, не могу точно сказать
---
Последним будет документ того сеанса, который получил GUID позже, как я это понимаю.
Ориентируюсь на статью https://infostart.ru/1c/articles/84177/, комментарий (16). Если меня обманули, то я вас тоже )
---
Если сеанс получил GUID последним, то это не значит, что он создал документ последним

И к тому же, время в GUID есть, если не создан GUID вручную,
еще есть вариант, что документ с GUID загружен из другой базы

А я ориентируюсь на статью https://infostart.ru/1c/articles/635159/
---
Спасибо за статью, думаю просто нужно запустить два сеанса и попробовать создать по паре документов. Предполагать и спорить можно долго, а 1С сделает как им удобно.
---
для себя я понял, что не стоит упорядочивать по ссылке (иногда можно конечно, например, когда идет последовательная выборка по полям запроса)
---
Сеанс2 - создал документ 82 (интерактивно через форму)
Сеанс1 - создал документ 83 (интерактивно через форму)
Сеанс1 - создал документ 84 (вручную кодом)

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

Но это не практичный пример
---
Ваш запрос определенно оптимальнее в данной задаче.

В (15) производительность изначально будет ниже, но этот подход дает интересную возможность нумерации строк внутри запроса, что может пригодится в иных задачах.
---
Вообще честно говоря мне стыдно, я никогда не учитывал момент времени, а есть отчеты где он может оказаться критичным...