Привет всем

Есть два сотрудника, Иванов и Петров, есть документ, предположим, "Начисление ЗП" с ТЧ "Сотрудники". Необходимо выбрать последние 5 документов по каждому из сотрудников. В голову приходят какие-то костыльные решения
---
ошибся, не заказы а три последних прихода
сразу говорю, код не мой, но автор утверждает, что все работает:

```1c
    ВЫБРАТЬ
    ПоследниеПриходы.Номенклатура КАК НоменклатураПриход,
    ПоследниеПриходы.Контрагент КАК КонтрагентПриход,
    ПоследниеПриходы.Регистратор.Дата КАК РегистраторПриход,
    ВЫБОР
    КОГДА ПоследниеПриходы.КоличествоОборот = 0
    ТОГДА 0
    ИНАЧЕ ВЫРАЗИТЬ(ПоследниеПриходы.СтоимостьОборот / ПоследниеПриходы.КоличествоОборот КАК ЧИСЛО(15, 2))
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ПриходыНоменклатуры
    ИЗ
    Приходы КАК ПоследниеПриходы
    ГДЕ
    ПоследниеПриходы.Регистратор В
    (ВЫБРАТЬ ПЕРВЫЕ 3
    ВложенныеПриходы.Регистратор
    ИЗ
    Приходы КАК ВложенныеПриходы
    ГДЕ
    ВложенныеПриходы.Номенклатура = ПоследниеПриходы.Номенклатура)
```
---
используйте возможности СКД. Там можно ограничить количество детальных записей.
---
Не сложно, вроде.

Пусть у нас есть таблица вида:
Иванов - Документ1
Иванов - Документ3
...
Петров - Документ1
и т.п., см. картинку 1.

Основное - чтобы это было некое уникальное значение в пределах запроса.

Соединяем таблицу саму с собой по условию:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ВсеСотруднки КАК ВТ_ВсеСотруднки1
  ПО ВТ_ВсеСотруднки.Сотрудник = ВТ_ВсеСотруднки1.Сотрудник
   И ВТ_ВсеСотруднки.Документ <= ВТ_ВсеСотруднки1.Документ
и потом группируем по
СГРУППИРОВАТЬ ПО
 ВТ_ВсеСотруднки.Сотрудник,
 ВТ_ВсеСотруднки.Документ

Таким образом мы получим для каждого документа его порядковый номер

Ну а потом получаем все записи с отбором, что номер меньше или равен нашей глубине вложенности.

Для Иванова было всего 6 документов, поэтому выведется 5,а для Петрова всего 4 - выведутся все. См рис. 2

Рабочий запрос без привязки к конфигурации - ниже

```1c
    ВЫБРАТЬ "Иванов" КАК Сотрудник, "Ссылка1" КАК Документ
    ПОМЕСТИТЬ ВТ_ВсеСотруднки
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Иванов", "Ссылка3"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Иванов", "Ссылка5"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Иванов", "Ссылка6"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Иванов", "Ссылка7"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Иванов", "Ссылка9"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Петров", "Ссылка2"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Петров", "Ссылка3"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Петров", "Ссылка5"
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ "Петров", "Ссылка6"
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_ВсеСотруднки.Сотрудник КАК Сотрудник,
    ВТ_ВсеСотруднки.Документ КАК Документ,
    СУММА(1) КАК ПорядковыйНомер
    ПОМЕСТИТЬ ВТ_ДокиСНомерами
    ИЗ
    ВТ_ВсеСотруднки КАК ВТ_ВсеСотруднки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ВсеСотруднки КАК ВТ_ВсеСотруднки1
    ПО ВТ_ВсеСотруднки.Сотрудник = ВТ_ВсеСотруднки1.Сотрудник
    И ВТ_ВсеСотруднки.Документ <= ВТ_ВсеСотруднки1.Документ

    СГРУППИРОВАТЬ ПО
    ВТ_ВсеСотруднки.Сотрудник,
    ВТ_ВсеСотруднки.Документ
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_ДокиСНомерами.Сотрудник,
    ВТ_ДокиСНомерами.Документ,
    ВТ_ДокиСНомерами.ПорядковыйНомер
    ИЗ
    ВТ_ДокиСНомерами КАК ВТ_ДокиСНомерами
    ГДЕ
    ВТ_ДокиСНомерами.ПорядковыйНомер <= 5
```
---
Некорректно сравнивать ссылки на документы в запросе (т.е. использовать сравнение ссылок в условии соединения), т.к. в общем случае ссылки не привязаны к оси времени. Полагаю, что в условии задачи в фразе "последние 5 документов" речь шла как раз о документах с самой поздней датой.

Но Ваше запрос вполне решает задачу, нужно только усложнить условие связи.
---
свяжите по моменту времени
---
Такой вариант Вам подойдет?

```1c
    ВЫБРАТЬ ПЕРВЫЕ 5
    Док.Ссылка
    ИЗ
    Документ.НачислениеЗП КАК Док
    ГДЕ
    Док.Сотрудники.Сотрудник = &Иванов

    УПОРЯДОЧИТЬ ПО
    Док.Дата УБЫВ
    ;

    //////////////////////////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 5
    Док.Ссылка
    ИЗ
    Документ.НачислениеЗП КАК Док
    ГДЕ
    Док.Сотрудники.Сотрудник = &Петров

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

Но я согласен с Вами, скорее всего я не правильно понял постановку задачи.
---
Согласен, предложенный код не решает задачу
---
как то раз видел подобный запрос (выбирались последние три заказа на производство) но мой мозг не смог его осилить :)
---
Сколько раз не сталкивался с подобной задачей, на выходе всегда костыли. На самом деле сотрудников на порядки больше, и документ другой, но смысл не меняется.

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

```1c
    ВЫБРАТЬ
    ПоследниеПриходы.Номенклатура КАК НоменклатураПриход,
    ПоследниеПриходы.Контрагент КАК КонтрагентПриход,
    ПоследниеПриходы.Регистратор.Дата КАК РегистраторПриход,
    ВЫБОР
    КОГДА ПоследниеПриходы.КоличествоОборот = 0
    ТОГДА 0
    ИНАЧЕ ВЫРАЗИТЬ(ПоследниеПриходы.СтоимостьОборот / ПоследниеПриходы.КоличествоОборот КАК ЧИСЛО(15, 2))
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ПриходыНоменклатуры
    ИЗ
    Приходы КАК ПоследниеПриходы
    ГДЕ
    ПоследниеПриходы.Регистратор В
    (ВЫБРАТЬ ПЕРВЫЕ 3
    ВложенныеПриходы.Регистратор
    ИЗ
    Приходы КАК ВложенныеПриходы
    ГДЕ
    ВложенныеПриходы.Номенклатура = ПоследниеПриходы.Номенклатура)
```
---
Да, действительно, такой вариант работает. Вспомнил, что видел подобное решение, если не ошибаюсь на сайте у Гилева, но пометку на полях не оставил.