Имя: Пароль:
1C
1С v8
Выбор последней записи из непериодического регистра сведений
0 Dmitriy_
Kolesnikov
 
23.04.18
07:20
В ЗУПе есть непериодический ОС ДанныеДляПодбораСотрудников
Измерение Сотрудник
Ресурс Подразделение
Ресурс Окончание (типа Дата)
Мне надо выбрать последнее подразделение сотрудника запросом, то есть такую строку, у которой значение Окончание максимальное.
Без кода, только запросом.
Как это сделать?
1 Сти
 
23.04.18
07:32
псевдокод:

выбрать первые 1
Подразделение
из РС
где Сотрудник = &Сотрудник
упорядочить по Окончание УБЫВ
2 Dmitriy_
Kolesnikov
 
23.04.18
15:45
А теперь экстраполируем на всех сотрудников.
Я серьезно.
3 karagach
 
23.04.18
15:57
может по наименованию подразделения ? сделать это
4 Philix
 
23.04.18
16:08
1. Выбрать Сотрудник, Максимум(Окончание) поместить ВТ1
2. Выбрать спр.Сотрудник, спр.подразделение, спр.Окончание как СПР внутреннее соединение ВТ1 как ВТ1 по Спр.Сотрудник = ВТ1.Сотрудник и Спр.Окончание = ВТ1.Окончание

Написано на глаз :)
5 George Wheels
 
23.04.18
16:33
Измерение только Сотрудник.
По каждому сотруднику только одна запись.
6 Вафель
 
23.04.18
16:37
ну уж руками написать срез последних должен каждый 1сник уметь написать
7 unregistered
 
23.04.18
17:16
(6) Наивный....
Я тоже когда-то так думал.
8 exwill
 
23.04.18
17:19
(2) Если соединить таблицу с самой собой, тогда все получится.
9 lEvGl
 
гуру
23.04.18
17:22
(7) а что там
Выбрать
Сотр,
Максимум(Дата)
Сгруппировать
10 lEvGl
 
гуру
23.04.18
17:22
подразделение добавить если надо
11 Сти
 
23.04.18
17:23
(2) ВЫБРАТЬ
    РегСотрудников.Сотрудник КАК Сотрудник,
    РегСотрудников.Подразделение КАК Подразделение,
    РегСотрудников.Окончание КАК Окончание
ИЗ
    РегистрСведений.РегСотрудников КАК РегСотрудников
ГДЕ
    РегСотрудников.Окончание В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                РегСотрудников1.Окончание КАК Окончание
            ИЗ
                РегистрСведений.РегСотрудников КАК РегСотрудников1
            ГДЕ
                РегСотрудников1.Сотрудник = РегСотрудников.Сотрудник
            УПОРЯДОЧИТЬ ПО
                Период УБЫВ)


Только очень желательно, чтобы Окончание было проиндексировано.
12 Dmitriy_
Kolesnikov
 
24.04.18
02:53
(11) медленно, но работает. Благодарю.
13 rphosts
 
24.04.18
03:32
(0) адекватный одинэснег привел-бы структуру регистра и спросил: "может ещё и индексы нужны?"
14 VladZ
 
24.04.18
04:25
(0) Разбиваем задачу по шагам:
1. Получаем все данные по указанным сотрудникам.
2. Получаем максимальные даты по этим сотрудникам.
3. Получаем все нужные данные для сотрудника по максимальной дате.

Теперь пишем "на языке программы" то же самое:

ВЫБРАТЬ
    РегСотрудников.Сотрудник КАК Сотрудник,
    РегСотрудников.Подразделение КАК Подразделение,
    РегСотрудников.Окончание КАК Окончание
Поместить ВТИсходныеДанные
ИЗ
    РегистрСведений.РегСотрудников КАК РегСотрудников
ГДЕ
    РегСотрудников.Сотрудник В (&СписокСотрудников)
;
/////////////////////////
Выбрать
ВТИсходныеДанные.Сотрудник,
     Максимум(ВТИсходныеДанные.Окончание) как МаксимальнаяДата
Поместить ВТМаксимальныеДаты
из ВТИсходныеДанные как ВТИсходныеДанные
сгруппировать по ВТИсходныеДанные.Сотрудник
;
//////////////////////////
Выбрать
ВТИсходныеДанные.*
из ВТИсходныеДанные как ВТИсходныеДанные
внутреннее соединение МаксимальнаяДата как МаксимальнаяДата
по МаксимальнаяДата.Сотрудник = ВТИсходныеДанные.Сотрудник
и МаксимальнаяДата.МаксимальнаяДата = ВТИсходныеДанные.Окончание
15 VladZ
 
24.04.18
04:26
Опечатка:

внутреннее соединение МаксимальнаяДата как МаксимальнаяДата -> внутреннее соединение ВТМаксимальнаыеДаты как ВТМаксимальнаыеДаты
16 catena
 
24.04.18
05:11
Интересно, почему проигнорировано (5)?
17 VladZ
 
24.04.18
05:26
(16) Хм. Однако!

Тогда вообще не понял, в чем проблема.
18 mistеr
 
24.04.18
07:40
(16) +1
19 George Wheels
 
24.04.18
08:06
(17) Ну кинулись решать задачу. В этом РС есть ещё куча других измерений, а также ИдентификаторЗаписи с типом УникальныйИдентификатор. Можно поработать как со справочником.
20 George Wheels
 
24.04.18
08:50
(19) к (16)

И да, у этого РС есть поле ФизическоеЛицо. Отбирать нужно по нему, т.к. у нескольких сотрудников может быть (и даже однозначно будет) одно физлицо.
21 catena
 
24.04.18
09:02
(19)Не, ну я ж говорю в рамках условий, озвученных в (0). А там ничего не говорится про прочие измерения.
22 George Wheels
 
24.04.18
09:04
(21) Да.
23 Dmitriy_
Kolesnikov
 
26.04.18
02:59
(11) проверено - не работает :( По большинству сотрудников выдает по нескольку записей.
(16) потому что (5) - неверно. Измерений - несколько. Записей с одним сотрудником - тоже несколько. Если бы была одна - не было бы никакого вопроса.
(19) что мне даст измерение ИдентификаторЗаписи? Как с ним поработать?
(20) У нас есть один человек с внутренним совмещением. Для одного физлица - два сотрудника, у каждого - своя должность. Поэтому нужно работать именно с измерением Сотрудник, а не Физическое лицо.
24 Dmitriy_
Kolesnikov
 
26.04.18
03:23
(20) а всё-таки вы правы - отбирать в промежуточную таблицу (с группировкой по максимуму даты Окончание) нужно по Физическому лицу, а не по сотруднику.
Бухи их по 5 раз увольняют и потом снова принимают. При этом в справочнике Сотрудник заводятся новые сотрудники. Это приводит к дублированию записей в промежуточной таблице с максимумом даты окончания.

Но, к сожалению, для внутреннего совместителя результат  работы запроса получится теперь неверный.
25 SleepyHead
 
гуру
26.04.18
06:54
(0) Какую задачу решаете, выбирая именно из этого регистра?
26 один я дАртаньян
 
26.04.18
07:05
(11)

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

)

СГРУППИРОВАТЬ ПО
РегСотрудников.Сотрудник,
РегСотрудников.Окончание
27 Dmitriy_
Kolesnikov
 
26.04.18
07:35
(25) есть какой-то отчет по сотрудникам, неважно какой. Надо добавить аналитику по текущему подразделению и должности каждого сотрудника, если уволен - то последняя должность и подразделение до увольнения.

По физлицам - фигня получается, вернулся к сотрудникам.

Идеально работает такой вариант.


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ДанныеДляПодбораСотрудников.Начало КАК Начало,
    ВЫБОР
        КОГДА ДанныеДляПодбораСотрудников.Окончание <= ДАТАВРЕМЯ(1930, 1, 1)
            ТОГДА ДАТАВРЕМЯ(3999, 12, 31)
        ИНАЧЕ ДанныеДляПодбораСотрудников.Окончание
    КОНЕЦ КАК Окончание,
    ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник,
    ДанныеДляПодбораСотрудников.ФизическоеЛицо КАК ФизическоеЛицо,
    ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
    ДанныеДляПодбораСотрудников.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию,
    ДанныеДляПодбораСотрудников.ВидСобытия КАК ВидСобытия,
    ДанныеДляПодбораСотрудников.Должность КАК Должность,
    ДанныеДляПодбораСотрудников.Организация КАК Организация
ПОМЕСТИТЬ вт_ИзРН
ИЗ
    РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    вт_ИзРН.Сотрудник КАК Сотрудник,
    вт_ИзРН.Окончание КАК Окончание,
    вт_ИзРН.Организация КАК Организация,
    вт_ИзРН.Подразделение КАК Подразделение,
    вт_ИзРН.Должность КАК Должность,
    вт_ИзРН.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию
ИЗ
    вт_ИзРН КАК вт_ИзРН
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_МаксимальныеДаты КАК вт_МаксимальныеДаты
        ПО (вт_МаксимальныеДаты.Окончание = вт_ИзРН.Окончание)
            И вт_ИзРН.Сотрудник = вт_МаксимальныеДаты.Сотрудник
28 mistеr
 
26.04.18
14:52
(27) Для правильного результата нужно выбирать из регистра. Навороченным запросом, как в типовых документах/отчетах.
29 George Wheels
 
26.04.18
15:14
Может подсмотреть запрос для динамического списка в Справочники.Сотрудники.Формы.ФормаВыбора?