В ЗУП 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
(3) ну например сделать 2 подзапроса - один ищет прием на работы, второй ищет последние кадровое перемещение. соединение по сотруднику.
Или вы хотите готовый текст запроса ?
(6) теперь соединяем. так как прием на работу всяко есть, то это будет основная таблица. Делаем левое со второй таблицей По сотруднику.
потом делаете вычисляемое поле: Выбор когда "первичный документ из второго запроса" естьNULL тогда "первичный документ из первого запроса" иначе "Первичный документ из второго запроса".
Только мне второй запрос не очень нравится ... Вы уверены что Максимум вам вернет гарантированно последнее перемещение ? я бы лучше сделал сортировку на убывание по Периоду записи регистра и сделал получить Первые 1
(3) ну например сделать 2 подзапроса - один ищет прием на работы, второй ищет последние кадровое перемещение. соединение по сотруднику.
Или вы хотите готовый текст запроса ?
ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник.Ссылка,
РаботникиОрганизаций.Сотрудник.Код,
РаботникиОрганизаций.ПервичныйДокумент,
РаботникиОрганизаций.ПричинаИзмененияСостояния
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)
УПОРЯДОЧИТЬ ПО
РаботникиОрганизаций.Сотрудник.Наименование
Показать
2. Перемещения
ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник.Ссылка КАК СотрудникСсылка,
МАКСИМУМ(РаботникиОрганизаций.Сотрудник.Код) КАК СотрудникКод,
МАКСИМУМ(РаботникиОрганизаций.ПервичныйДокумент) КАК ПервичныйДокумент,
МАКСИМУМ(РаботникиОрганизаций.ПричинаИзмененияСостояния) КАК ПричинаИзмененияСостояния
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Перемещение)
СГРУППИРОВАТЬ ПО
РаботникиОрганизаций.Сотрудник.Ссылка
УПОРЯДОЧИТЬ ПО
РаботникиОрганизаций.Сотрудник.Наименование
Показать
Что теперь с этим делать для получения результата?
(6) теперь соединяем. так как прием на работу всяко есть, то это будет основная таблица. Делаем левое со второй таблицей По сотруднику.
потом делаете вычисляемое поле: Выбор когда "первичный документ из второго запроса" естьNULL тогда "первичный документ из первого запроса" иначе "Первичный документ из второго запроса".
Только мне второй запрос не очень нравится ... Вы уверены что Максимум вам вернет гарантированно последнее перемещение ? я бы лучше сделал сортировку на убывание по Периоду записи регистра и сделал получить Первые 1
(10) Максимум последнее перемещение вернул
короче, вот такой зверь получился
ВЫБРАТЬ
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка,
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник КАК Сотрудник,
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник.Код,
ВложенныйЗапрос.ПервичныйДокумент,
ЕСТЬNULL(ВложенныйЗапрос1.ПервичныйДокумент, ВложенныйЗапрос.ПервичныйДокумент) КАК ПервичныйДокумент1,
ВложенныйЗапрос.ПервичныйДокумент.Номер КАК Поле1,
ВложенныйЗапрос.ПервичныйДокумент.Дата,
ЕСТЬNULL(ВложенныйЗапрос1.ПервичныйДокумент.Номер, ВложенныйЗапрос.ПервичныйДокумент.Номер) КАК ПервичныйДокументНомер1,
ЕСТЬNULL(ВложенныйЗапрос1.ПервичныйДокумент.Дата, ВложенныйЗапрос.ПервичныйДокумент.Дата) КАК ПервичныйДокументДата1
ИЗ
Документ.СведенияОТрудовойДеятельностиРаботниковСЗВ_ТД.Мероприятия КАК СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник.Ссылка КАК СотрудникСсылка,
РаботникиОрганизаций.Сотрудник.Код КАК СотрудникКод,
РаботникиОрганизаций.ПервичныйДокумент КАК ПервичныйДокумент,
РаботникиОрганизаций.ПричинаИзмененияСостояния КАК ПричинаИзмененияСостояния
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)) КАК ВложенныйЗапрос
ПО СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник = ВложенныйЗапрос.СотрудникСсылка
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РаботникиОрганизаций.Сотрудник.Ссылка КАК СотрудникСсылка,
МАКСИМУМ(РаботникиОрганизаций.Сотрудник.Код) КАК СотрудникКод,
МАКСИМУМ(РаботникиОрганизаций.ПервичныйДокумент) КАК ПервичныйДокумент,
МАКСИМУМ(РаботникиОрганизаций.ПричинаИзмененияСостояния) КАК ПричинаИзмененияСостояния
ИЗ
РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Перемещение)
СГРУППИРОВАТЬ ПО
РаботникиОрганизаций.Сотрудник.Ссылка) КАК ВложенныйЗапрос1
ПО СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник = ВложенныйЗапрос1.СотрудникСсылка
ГДЕ
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка = &Ссылка
УПОРЯДОЧИТЬ ПО
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник.Наименование
(14) Да, вы правы, гораздо проще можно сделать, используя срез последних
ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
РаботникиОрганизацийСрезПоследних.ПервичныйДокумент,
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка
ИЗ
Документ.СведенияОТрудовойДеятельностиРаботниковСЗВ_ТД.Мероприятия КАК СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(, ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)) КАК РаботникиОрганизацийСрезПоследних
ПО СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Сотрудник = РаботникиОрганизацийСрезПоследних.Сотрудник
ГДЕ
СведенияОТрудовойДеятельностиРаботниковСЗВ_ТДМероприятия.Ссылка = &Ссылка
УПОРЯДОЧИТЬ ПО
Сотрудник
(9) да, прошу прощения, что полностью не написал цель
Имеется документ Сведения О Трудовой Деятельности Работников СЗВ-ТД
у него в ТЧ "Мероприятия" заполнены сотрудники с мероприятиями = увольнения
мне нужно было отобрать по этим сотрудникам ближайшие (по дате) к увольнению кадровые документы
(12) по поводу СЗВ-ТД, 1С на итс в своей статье указывает что нужно при увольнении указывать предыдущее кадровое события, но я не нашел этому подтверждения где-то ещё. А вы чем руководствуетесь ?