Выбрать последний перевод сотрудника запросом

1. user1816391 14.11.22 09:53 Сейчас в теме
Здравствуйте, есть вот такой запрос, как сделать, чтобы он выводил только последний кадровый перевод сотрудника?

ВЫБРАТЬ
	ТекущиеКадровыеДанныеСотрудников.ТекущееПодразделение КАК ТекущееПодразделение,
	Сотрудники.Наименование КАК Наименование,
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность КАК ТекущаяДолжность,
	ВЫБОР КОГДА СЭ_ДоговорыМОЛ.Период есть NULL ТОГДА "НЕ ЗАКЛЮЧЕН" ИНАЧЕ СЭ_ДоговорыМОЛ.Период КОНЕЦ  КАК Период,
	Увольнение.Дата КАК ДатаУвольнения,
	КадровыйПеревод.Дата КАК ДатаПеревода,
	СЭ_ДоговорыМОЛ.ВидМатериальнойОтветственности КАК ВидМатериальнойОтветственности,
	ТекущиеКадровыеДанныеСотрудников.ТекущееПодразделение.Код КАК ТекущееПодразделениеКод,
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код КАК ТекущаяДолжностьКод
ИЗ
	Справочник.Сотрудники КАК Сотрудники
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
	ПО (ТекущиеКадровыеДанныеСотрудников.Сотрудник = Сотрудники.Ссылка)
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СЭ_ДоговорыМОЛ КАК СЭ_ДоговорыМОЛ
	ПО (СЭ_ДоговорыМОЛ.Сотрудник = Сотрудники.Ссылка)
	ЛЕВОЕ СОЕДИНЕНИЕ Документ.КадровыйПеревод КАК КадровыйПеревод
	ПО (КадровыйПеревод.Сотрудник = Сотрудники.Ссылка)
	ЛЕВОЕ СОЕДИНЕНИЕ Документ.Увольнение КАК Увольнение
	ПО (Увольнение.Сотрудник = Сотрудники.Ссылка)
ГДЕ
	СЭ_ДоговорыМОЛ.Период <=&Дата и (
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1411-003-02-0-00" или
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1415-005-02-0-00" или	
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1219-020-02-0-03" или  	
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1321-116-02-0-00" или	
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1321-063-02-0-00" или	
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1219-016-02-0-00" или
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1324-128-02-0-00" или
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1211-009-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1221-010-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2423-003-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1345-037-02-0-06" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1311-045-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2113-005-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2149-022-02-0-05" или    
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2144-040-02-0-05" или   
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1321-044-02-0-06" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2151-033-02-0-05" или
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2631-021-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2412-010-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "8322-001-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2359-025-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "4411-001-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "3331-003-01-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "4322-014-01-0-00" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2433-003-02-0-00" или   
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2622-004-02-0-00" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "5230-001-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "8156-005-01-0-00" или   
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1420-026-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "5120-003-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "7512-013-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "4321-002-01-0-00" или      
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "7543-017-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "5223-001-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1420-012-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1420-015-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "7543-029-01-0-00" или    
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1221-003-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1221-003-02-0-00")     
    или СЭ_ДоговорыМОЛ.Период есть NULL и (
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1411-003-02-0-00" или
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1415-005-02-0-00" или	
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1219-020-02-0-03" или  
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1321-116-02-0-00" или
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1321-063-02-0-00" или
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1219-016-02-0-00" или	
	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1324-128-02-0-00" или
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1211-009-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1221-010-02-0-00" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2423-003-02-0-00" или      
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1345-037-02-0-06" или    
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1311-045-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2113-005-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2149-022-02-0-05" или    
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2144-040-02-0-05" или   
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1321-044-02-0-06" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2151-033-02-0-05" или
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2631-021-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2412-010-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "8322-001-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2359-025-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "4411-001-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "3331-003-01-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "4322-014-01-0-00" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2433-003-02-0-00" или   
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "2622-004-02-0-00" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "5230-001-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "8156-005-01-0-00" или   
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1420-026-02-0-00" или     
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "5120-003-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "7512-013-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "4321-002-01-0-00" или      
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "7543-017-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "5223-001-01-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1420-012-02-0-00" или  
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1420-015-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "7543-029-01-0-00" или    
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1221-003-02-0-00" или 
    ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность.Код = "1221-003-02-0-00") 
Показать
По теме из базы знаний
Найденные решения
6. WasiliyMay 8 14.11.22 10:27 Сейчас в теме
(3)У должности должен быть какой то признак в виде реквизита или доп. реквизита (ну или связанный с должностью какой-нибудь регистр сведений, если это периодическое значение). и по этому признаку она должна отбираться в запрос.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. WasiliyMay 8 14.11.22 10:15 Сейчас в теме
Нужно весь запрос переделать. Кадровые данные нужно брать из регистров кадровая история и кадровая история интервальный. И переделайте эти условия на код должности. Так запросы не пишут.
user1816391; user1847230; SlavaKron; +3 Ответить
3. user1847230 14.11.22 10:19 Сейчас в теме
(2)
И переделайте эти условия на код должности. Так запросы не пишут.
что вы имеете ввиду?
user1816391; +1 Ответить
4. Westonline82 14.11.22 10:21 Сейчас в теме
(3)ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность В (&СписокДолжностей)
5. user1816391 14.11.22 10:25 Сейчас в теме
(4)дело в том, что тут нужны только статические должности
7. WasiliyMay 8 14.11.22 10:29 Сейчас в теме
(5) из регистра ТекущиеКадровыеДанныеСотрудников вы не сможете получить последний кадровый перевод.
6. WasiliyMay 8 14.11.22 10:27 Сейчас в теме
(3)У должности должен быть какой то признак в виде реквизита или доп. реквизита (ну или связанный с должностью какой-нибудь регистр сведений, если это периодическое значение). и по этому признаку она должна отбираться в запрос.
9. WasiliyMay 8 14.11.22 10:37 Сейчас в теме
(3)Можно еще сделать отдельный Регистр сведений, заполнить его нужными должностями и использовать его в вашем запросе
10. user1816391 14.11.22 11:14 Сейчас в теме
(9)есть документ НазначениеДолжностейМОЛ, в нем прописываются все должности, которые имеют МОЛ.

Как мне сейчас лучше поступить?
11. Prikum 3 14.11.22 11:19 Сейчас в теме
(10)Написали же что лучше использовать РС "Кадровая история сотрудников интервальный".
12. WasiliyMay 8 14.11.22 12:11 Сейчас в теме
(10)Если должности в документе соответствуют тем, что у вас в условии, то, конечно, лучше их брать из документа. Также использовать РС "Кадровая история сотрудников интервальный" (как написали в (11)) для получения последнего кадрового перевода.
13. Prikum 3 14.11.22 12:14 Сейчас в теме
(12)
Если должности в документе соответствуют тем, что у вас в условии, то, конечно, лучше их брать из документа.
Должности есть и в регистре, так что лучше использовать 1 запрос
14. WasiliyMay 8 14.11.22 12:19 Сейчас в теме
(13)Про документ, это я написал к тому, что нужно еще избавиться от этого условия с проверкой на код должности, а для этого нужно эти должности как то получить по другому(без проверки на код). user1816391 написал, что вроде как эти должности есть в документе "НазначениеДолжностейМОЛ"
15. Prikum 3 14.11.22 12:20 Сейчас в теме
(14)Список долностей лучше вынести в параметр, тогда читать запрос будет гораздо легче, чем вот эту портянку
16. WasiliyMay 8 14.11.22 12:22 Сейчас в теме
(15)Но параметр тоже нужно откуда то заполнять. Хранить эти должности в коде плохо, т.к. при изменении списка придется править код. Чтобы не писать отдельную процедуру заполнения параметра, лучше сделать все в одном запросе.
17. Prikum 3 14.11.22 12:26 Сейчас в теме
(16)всей задачи не знаю, поэтому и не могу сказать. А так конечно проще создать дополнительный реквизит для должности и отбирать уже по нему в запросе. Правда тут еще вопрос возникает не путает ли автор справочники должности и штатное расписание.
18. WasiliyMay 8 14.11.22 12:31 Сейчас в теме
(17)Сложно сказать. Скорей всего все-таки именно должности, т.к. взяли уже существующий запрос, который в другой задаче, видимо, всех устраивал.
19. Prikum 3 14.11.22 12:35 Сейчас в теме
(18)
т.к. взяли уже существующий запрос, который в другой задаче, видимо, всех устраивал.
Да нет, скорее всего писали, судя по тому, что этот запрос выберет все что угодно, только не нужные данные. Потому как приведенные связи совершенно не отражают ситуацию, когда у сотрудника множество переводов, множество договоров о МОЛ и т.д.
20. user1816391 14.11.22 15:00 Сейчас в теме
(19)по итогу сделал так

ВЫБРАТЬ
	ВЫБОР
		КОГДА СЭ_ДоговорыМОЛ.Период ЕСТЬ NULL
			ТОГДА "НЕ ЗАКЛЮЧЕН"
		ИНАЧЕ СЭ_ДоговорыМОЛ.Период
	КОНЕЦ КАК Период,
	СЭ_ДоговорыМОЛ.ВидМатериальнойОтветственности КАК ВидМатериальнойОтветственности,
	КадроваяИсторияСотрудниковСрезПоследних.Сотрудник КАК Сотрудник,
	КадроваяИсторияСотрудниковСрезПоследних.Подразделение КАК Подразделение,
	КадроваяИсторияСотрудниковСрезПоследних.Должность КАК Должность,
	ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения КАК ДатаУвольнения,
	КадровыйПеревод.ДатаНачала КАК ДатаНачала
ИЗ
	РегистрСведений.СЭ_ДолжностиМОЛ.СрезПоследних КАК СЭ_ДолжностиМОЛСрезПоследних
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних КАК КадроваяИсторияСотрудниковСрезПоследних
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СЭ_ДоговорыМОЛ КАК СЭ_ДоговорыМОЛ
			ПО (СЭ_ДоговорыМОЛ.Сотрудник = КадроваяИсторияСотрудниковСрезПоследних.Сотрудник)
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
			ПО КадроваяИсторияСотрудниковСрезПоследних.Сотрудник = ТекущиеКадровыеДанныеСотрудников.Сотрудник
			ЛЕВОЕ СОЕДИНЕНИЕ Документ.КадровыйПеревод КАК КадровыйПеревод
			ПО КадроваяИсторияСотрудниковСрезПоследних.Регистратор = КадровыйПеревод.Ссылка
		ПО СЭ_ДолжностиМОЛСрезПоследних.Должность = КадроваяИсторияСотрудниковСрезПоследних.Должность
			И СЭ_ДолжностиМОЛСрезПоследних.Подразделение = КадроваяИсторияСотрудниковСрезПоследних.Подразделение
ГДЕ
	(СЭ_ДоговорыМОЛ.Период <= &Дата 
			ИЛИ СЭ_ДоговорыМОЛ.Период ЕСТЬ NULL) и не КадроваяИсторияСотрудниковСрезПоследних.Сотрудник есть NULL
Показать
21. laperuz 47 14.11.22 17:21 Сейчас в теме
(20)А теперь сделайте на сотрудника временный кадровый перевод(с датой окончания) и удивитесь должности и подразделению, которые возвратит ваш запрос на дату после этой даты окончания)
22. user1816391 16.11.22 08:44 Сейчас в теме
(21) как тогда корректнее написать этот запрос?
23. laperuz 47 16.11.22 10:01 Сейчас в теме
(22)
1. Получить список сотрудников из регистра СЭ_ДоговорыМОЛ.
2. Создать ВТ с кадровыми данными с помощью

КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеСотрудников()

В качестве параметра КадровыеДанные передать строку "Подразделение,Должность,РабочееМестоПериодРегистрации,ДатаУвольнения"

Использовать полученную ВТ вместо таблиц ТекущиеКадровыеДанныеСотрудников, ТекущиеКадровыеДанныеСотрудников и КадровыйПеревод
8. laperuz 47 14.11.22 10:36 Сейчас в теме
Смотрите в сторону КадровыйУчет.КадровыеДанныеСотрудников()
А вообще почитайте https://infostart.ru/1c/articles/942569/ очень и очень полезная инфа для тех, кто работает с ЗУПовским функционалом
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот