Здравствуйте!
Подскажите пожалуйста как решить след задачу:
Из запроса получаю таблицу типа:

сотрудник видОклада дата
иванов тариф 01.2012
иванов оклад 01.2015
иванов тариф 01.2016

пупкин тариф 01.2015
пупкин оклад 01.2016

петров тариф 01.2010
петров оклад 01.2013
петров оклад 01.2016

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

сотрудник старыйоклад стараядата новОклад новДата
иванов оклад 01.2015 тариф 01.2016
пупкин тариф 01.2015 оклад 01.2016
петров оклад 01.2013 оклад 01.2016

т.е. новОклад выбиралась последняя запись по этому сотруднику, а в старыйОклад писалась предыдущая!!

пс: я недавно в 1С, но кажется в скд надо делать, там наверное сразу по колонкам можно было бы разнести это все (теоретически) или в самом запросе м.б. даже..
---
```1c
    ВЫБРАТЬ
    "Иванов" КАК Сотрудник,
    "Оклад" КАК Тариф,
    ДАТАВРЕМЯ(2015, 1, 1) КАК Дата
    ПОМЕСТИТЬ ВТ_Основная

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Иванов",
    "Оклад",
    ДАТАВРЕМЯ(2015, 2, 1)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Петров",
    "оклад2",
    ДАТАВРЕМЯ(2015, 5, 5)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Иванов",
    "Оклад4",
    ДАТАВРЕМЯ(2015, 7, 1)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_Основная.Сотрудник
    ПОМЕСТИТЬ ВТ_СписокСотрудников
    ИЗ
    ВТ_Основная КАК ВТ_Основная
    ;

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

    СГРУППИРОВАТЬ ПО
    ВТ_Основная.Сотрудник
    ;

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

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

    СГРУППИРОВАТЬ ПО
    ВТ_Основная.Сотрудник
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_Основная.Сотрудник,
    ВТ_Основная.Тариф,
    ВТ_Основная.Дата
    ПОМЕСТИТЬ ВТ_ПредпоследниеТарифы
    ИЗ
    ВТ_Основная КАК ВТ_Основная
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПредпоследниеДаты КАК ВТ_ПредпоследниеДаты
    ПО ВТ_Основная.Сотрудник = ВТ_ПредпоследниеДаты.Сотрудник
    И ВТ_Основная.Дата = ВТ_ПредпоследниеДаты.Дата
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_СписокСотрудников.Сотрудник,
    ЕСТЬNULL(ВТ_ПредпоследниеТарифы.Тариф, "Нет") КАК СтарыйТариф,
    ЕСТЬNULL(ВТ_ПредпоследниеТарифы.Дата, "Нет") КАК СтараяДата,
    ВТ_ПоследниеТарифы.Тариф КАК НовыйТариф,
    ВТ_ПоследниеТарифы.Дата КАК НоваяДата
    ИЗ
    ВТ_СписокСотрудников КАК ВТ_СписокСотрудников
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПредпоследниеТарифы КАК ВТ_ПредпоследниеТарифы
    ПО ВТ_СписокСотрудников.Сотрудник = ВТ_ПредпоследниеТарифы.Сотрудник
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследниеТарифы КАК ВТ_ПоследниеТарифы
    ПО ВТ_СписокСотрудников.Сотрудник = ВТ_ПоследниеТарифы.Сотрудник
```
---
```1c
    ВЫБРАТЬ
    "Иванов" КАК Сотрудник,
    "Оклад" КАК Тариф,
    ДАТАВРЕМЯ(2015, 1, 1) КАК Дата
    ПОМЕСТИТЬ ВТ_Основная

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Иванов",
    "Оклад",
    ДАТАВРЕМЯ(2015, 2, 1)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Петров",
    "оклад2",
    ДАТАВРЕМЯ(2015, 5, 5)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    "Иванов",
    "Оклад4",
    ДАТАВРЕМЯ(2015, 7, 1)
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_Основная.Сотрудник
    ПОМЕСТИТЬ ВТ_СписокСотрудников
    ИЗ
    ВТ_Основная КАК ВТ_Основная
    ;

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

    СГРУППИРОВАТЬ ПО
    ВТ_Основная.Сотрудник
    ;

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

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

    СГРУППИРОВАТЬ ПО
    ВТ_Основная.Сотрудник
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_Основная.Сотрудник,
    ВТ_Основная.Тариф,
    ВТ_Основная.Дата
    ПОМЕСТИТЬ ВТ_ПредпоследниеТарифы
    ИЗ
    ВТ_Основная КАК ВТ_Основная
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПредпоследниеДаты КАК ВТ_ПредпоследниеДаты
    ПО ВТ_Основная.Сотрудник = ВТ_ПредпоследниеДаты.Сотрудник
    И ВТ_Основная.Дата = ВТ_ПредпоследниеДаты.Дата
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_СписокСотрудников.Сотрудник,
    ЕСТЬNULL(ВТ_ПредпоследниеТарифы.Тариф, "Нет") КАК СтарыйТариф,
    ЕСТЬNULL(ВТ_ПредпоследниеТарифы.Дата, "Нет") КАК СтараяДата,
    ВТ_ПоследниеТарифы.Тариф КАК НовыйТариф,
    ВТ_ПоследниеТарифы.Дата КАК НоваяДата
    ИЗ
    ВТ_СписокСотрудников КАК ВТ_СписокСотрудников
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПредпоследниеТарифы КАК ВТ_ПредпоследниеТарифы
    ПО ВТ_СписокСотрудников.Сотрудник = ВТ_ПредпоследниеТарифы.Сотрудник
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследниеТарифы КАК ВТ_ПоследниеТарифы
    ПО ВТ_СписокСотрудников.Сотрудник = ВТ_ПоследниеТарифы.Сотрудник
```
---
если сотрудников 3 тысячи? (ивановы и пупкины для примера)
---
Пофиг. Первая таблица для примера, чтоб данные для отображения были
---
Спасибо!!! Сейчас попробую разобраться
---
стыдно спрашивать, НО как вы получаете ВТ_ПРЕДпоследниеДаты??
---
Из всех записей исключаю последние, из них последние это и есть предпоследние. Если в терминах запроса - ко всем записи присоединяю только последние. Там где такое соединение происходит в поле "ВТ_ПоследниеТарифы.Тариф" - есть какое-то значение, а там где нет - "NULL", значения с NULL остаются, в итоге остается изначальная таблица с исключенными последними записями, в них последние по дате фактически будут предпоследними в исходной таблице
---
Работает! получилось-таки наконец. (правда ум за разум зашел пока делала)
Спасибо вам огромное! Теперь понятен и принцип соединений.
---
Посмотрите функцию ВычислитьВыражение для СКД (Справка, Функции языка выражений системы компоновки данных).
Там можно в параметрах указать какие брать записи для расчета поля (первая, последняя и т.п.).
---
Предложу все же свое решение через СКД, может кому пригодится.
Выбираем последний и предыдущий курс валют.
1. в запросе определяем макс период для каждой валюты.
2. добавляем вычисляемые поля: ПредыдущийКурс и ПредыдущийПериод.
3. на детальные записи накладываем отбор по Периоду = макс Период.
Прилагаю схему отчета.
---
Спасибо!