Отбор записей в регистре

1. dammit666 15 12.03.20 15:48 Сейчас в теме
В ЗУП 2.5 имеется регистр сведений РаботникиОрганизаций (синоним Кадровая история сотрудников (по юрлицам))
Необходимо сделать в нем выборку записей по следующему алгоритму:
если у сотрудника есть документы прием на работу и кадровое перемещение, то отобрать запись с кадровым перемещением, причем, если кадровых перемещений несколько, то берем с более поздней датой.
если у сотрудника есть только прием на работу, то отбираем запись с этим приемом на работу

например,

сотрудник1 прием на работу от 01.01.2020
сотрудник1 перемещение от 01.02.2020
сотрудник1 перемещение от 01.03.2020
сотрудник2 прием на работу от 15.01.2020
сотрудник3 прием на работу от 20.01.2020
сотрудник3 перемещение от 20.02.2020

В итоге должны получить таблицу
сотрудник1 перемещение от 01.03.2020
сотрудник2 прием на работу от 15.01.2020
сотрудник3 перемещение от 20.02.2020

Можно ли это реализовать запросом?
По теме из базы знаний
Найденные решения
4. FetisovAN 12.03.20 15:51 Сейчас в теме
(3) ну например сделать 2 подзапроса - один ищет прием на работы, второй ищет последние кадровое перемещение. соединение по сотруднику.
Или вы хотите готовый текст запроса ?
10. FetisovAN 12.03.20 16:44 Сейчас в теме
(6) теперь соединяем. так как прием на работу всяко есть, то это будет основная таблица. Делаем левое со второй таблицей По сотруднику.

потом делаете вычисляемое поле: Выбор когда "первичный документ из второго запроса" естьNULL тогда "первичный документ из первого запроса" иначе "Первичный документ из второго запроса".

Только мне второй запрос не очень нравится ... Вы уверены что Максимум вам вернет гарантированно последнее перемещение ? я бы лучше сделал сортировку на убывание по Периоду записи регистра и сделал получить Первые 1
14. soft_wind 12.03.20 20:40 Сейчас в теме
(8) ну в СрезПоследних можно же добавить условие: Кроме Уволенных!!!
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FetisovAN 12.03.20 15:49 Сейчас в теме
3. dammit666 15 12.03.20 15:50 Сейчас в теме
(2) Спасибо) а как это сделать, не подскажешь?
4. FetisovAN 12.03.20 15:51 Сейчас в теме
(3) ну например сделать 2 подзапроса - один ищет прием на работы, второй ищет последние кадровое перемещение. соединение по сотруднику.
Или вы хотите готовый текст запроса ?
5. dammit666 15 12.03.20 16:00 Сейчас в теме
6. dammit666 15 12.03.20 16:16 Сейчас в теме
Сделал 2 запроса
1. Приемы на работу

ВЫБРАТЬ
	РаботникиОрганизаций.Сотрудник.Ссылка,
	РаботникиОрганизаций.Сотрудник.Код,
	РаботникиОрганизаций.ПервичныйДокумент,
	РаботникиОрганизаций.ПричинаИзмененияСостояния
ИЗ
	РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
	РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)

УПОРЯДОЧИТЬ ПО
	РаботникиОрганизаций.Сотрудник.Наименование
Показать


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

СГРУППИРОВАТЬ ПО
	РаботникиОрганизаций.Сотрудник.Ссылка

УПОРЯДОЧИТЬ ПО
	РаботникиОрганизаций.Сотрудник.Наименование
Показать


Что теперь с этим делать для получения результата?
10. FetisovAN 12.03.20 16:44 Сейчас в теме
(6) теперь соединяем. так как прием на работу всяко есть, то это будет основная таблица. Делаем левое со второй таблицей По сотруднику.

потом делаете вычисляемое поле: Выбор когда "первичный документ из второго запроса" естьNULL тогда "первичный документ из первого запроса" иначе "Первичный документ из второго запроса".

Только мне второй запрос не очень нравится ... Вы уверены что Максимум вам вернет гарантированно последнее перемещение ? я бы лучше сделал сортировку на убывание по Периоду записи регистра и сделал получить Первые 1
11. dammit666 15 12.03.20 16:48 Сейчас в теме
(10) Максимум последнее перемещение вернул
короче, вот такой зверь получился

ВЫБРАТЬ
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка,
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник КАК Сотрудник,
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник.Код,
	ВложенныйЗапрос.ПервичныйДокумент,
	ЕСТЬNULL(ВложенныйЗапрос1.ПервичныйДокумент, ВложенныйЗапрос.ПервичныйДокумент) КАК ПервичныйДокумент1,
	ВложенныйЗапрос.ПервичныйДокумент.Номер КАК Поле1,
	ВложенныйЗапрос.ПервичныйДокумент.Дата,
	ЕСТЬNULL(ВложенныйЗапрос1.ПервичныйДокумент.Номер, ВложенныйЗапрос.ПервичныйДокумент.Номер) КАК ПервичныйДокументНомер1,
	ЕСТЬNULL(ВложенныйЗапрос1.ПервичныйДокумент.Дата, ВложенныйЗапрос.ПервичныйДокумент.Дата) КАК ПервичныйДокументДата1
ИЗ
	Документ.СведенияОТрудовойДеятельностиРаботниковСЗВ_ТД.Мероприятия КАК СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			РаботникиОрганизаций.Сотрудник.Ссылка КАК СотрудникСсылка,
			РаботникиОрганизаций.Сотрудник.Код КАК СотрудникКод,
			РаботникиОрганизаций.ПервичныйДокумент КАК ПервичныйДокумент,
			РаботникиОрганизаций.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния
		ИЗ
			РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
		ГДЕ
			РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)) КАК ВложенныйЗапрос
		ПО СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник = ВложенныйЗапрос.СотрудникСсылка
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			РаботникиОрганизаций.Сотрудник.Ссылка КАК СотрудникСсылка,
			МАКСИМУМ(РаботникиОрганизаций.Сотрудник.Код) КАК СотрудникКод,
			МАКСИМУМ(РаботникиОрганизаций.ПервичныйДокумент) КАК ПервичныйДокумент,
			МАКСИМУМ(РаботникиОрганизаций.ПричинаИзмененияСостояния) КАК ПричинаИзмененияСостояния
		ИЗ
			РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
		ГДЕ
			РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Перемещение)
		
		СГРУППИРОВАТЬ ПО
			РаботникиОрганизаций.Сотрудник.Ссылка) КАК ВложенныйЗапрос1
		ПО СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник = ВложенныйЗапрос1.СотрудникСсылка
ГДЕ
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка = &Ссылка

УПОРЯДОЧИТЬ ПО
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник.Наименование
Показать
7. soft_wind 12.03.20 16:28 Сейчас в теме
а ваш регистр случайно не периодический? тогда еще проще, берите СрезПоследних()
8. dammit666 15 12.03.20 16:35 Сейчас в теме
(7) периодический, но к сожалению, срез последних не подходит, так как по срезу последних отбираются также увольнения, а они мне не нужны
14. soft_wind 12.03.20 20:40 Сейчас в теме
(8) ну в СрезПоследних можно же добавить условие: Кроме Уволенных!!!
16. dammit666 15 12.03.20 23:21 Сейчас в теме
(14) Да, вы правы, гораздо проще можно сделать, используя срез последних

ВЫБРАТЬ
	РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
	РаботникиОрганизацийСрезПоследних.ПервичныйДокумент,
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка
ИЗ
	Документ.СведенияОТрудовойДеятельностиРаботниковСЗВ_ТД.Мероприятия КАК СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(, ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)) КАК РаботникиОрганизацийСрезПоследних
		ПО СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник = РаботникиОрганизацийСрезПоследних.Сотрудник
ГДЕ
	СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка = &Ссылка

УПОРЯДОЧИТЬ ПО
	Сотрудник
Показать
9. FetisovAN 12.03.20 16:40 Сейчас в теме
(7) товарищ не обозначил цель своего запроса ... а последняя запись в регистре может быть Увольнением например
12. dammit666 15 12.03.20 16:56 Сейчас в теме
(9) да, прошу прощения, что полностью не написал цель
Имеется документ Сведения О Трудовой Деятельности Работников СЗВ-ТД
у него в ТЧ "Мероприятия" заполнены сотрудники с мероприятиями = увольнения
мне нужно было отобрать по этим сотрудникам ближайшие (по дате) к увольнению кадровые документы
13. FetisovAN 12.03.20 17:38 Сейчас в теме
(12) по поводу СЗВ-ТД, 1С на итс в своей статье указывает что нужно при увольнении указывать предыдущее кадровое события, но я не нашел этому подтверждения где-то ещё. А вы чем руководствуетесь ?
15. dammit666 15 12.03.20 23:02 Сейчас в теме
(13) Я не руководствуюсь) Руководствуется кадровик, который попросил сформировать такой отчет.
Но, к примеру, есть вот такое на сайте ИТС:
https://its.1c.ru/db/answersrep/content/3635/hdoc
Прикрепленные файлы:
Оставьте свое сообщение

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