Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Выбор последней записи из непериодического регистра сведений

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

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

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


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

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

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

Выбрать 
ВТИсходныеДанные.Сотрудник,
     Максимум(ВТИсходныеДанные.Окончание) как МаксимальнаяДата
Поместить ВТМаксимальныеДаты
из ВТИсходныеДанные как ВТИсходныеДанные
сгруппировать по ВТИсходныеДанные.Сотрудник
;
//////////////////////////

Выбрать 
ВТИсходныеДанные.*
из ВТИсходныеДанные как ВТИсходныеДанные
внутреннее соединение МаксимальнаяДата как МаксимальнаяДата
по МаксимальнаяДата.Сотрудник = ВТИсходныеДанные.Сотрудник
и МаксимальнаяДата.МаксимальнаяДата = ВТИсходныеДанные.Окончание
   VladZ
 
15 - 24.04.18 - 04:26
Опечатка:

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

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

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

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

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

)

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

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

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


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

////////////////////////////////////////////////////////////////////////////////

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

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

////////////////////////////////////////////////////////////////////////////////

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует