работа с периодом

1. 1c_2020 05.03.21 11:03 Сейчас в теме
Добрый день.
проблема с запросом...
формирую список сотрудников для табеля.
Проблема вот в чем,
1* если документ кадрового перевода сформирован, допустим в феврале, а сам перевод будет с 3 марта, то в февральском и мартовском табеле две строки на однго сотрудника 1- с должностью до перевода и 2- с должностью после перевода, но в феврале должна быть 1 строка с предыдущей должностью, а в марте нужно 2 строки 1.03 и 02.03 - старая должность, а с 03.03 - строка с новой должностью., апрель уже идет нормально с 1 строкой и новой должностью
2* если документ кадрового перевода сформирован в марте, допустим 3.03, и в марте же должен быть перевод, например с 10.03, то мне выдает мартовский и все последующие месяцы по две строки 1-я со старой должность , 2-я с новой
Вот запрос:

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

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

СГРУППИРОВАТЬ ПО
	вт.ТабельныйНомер,
	вт.Период

УПОРЯДОЧИТЬ ПО
	ФИО
Показать
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
4. biimmap 1860 05.03.21 20:52 Сейчас в теме +0.1 $m
Когда Вы получили данные, у Вас по сотруднику ессно будет несколько записей при таком запросе.
Вам нужно вычислить максимальный период по ключевым полям (у Вас наверно это сотрудник). А потом первый запрос отфильтровать, оставив в нём только максимальные даты. Именно они будут содержать действующие на текущий момент данные.

Это если Вам нужно на конкретную дату получить срез. Периоды вычисляются сложнее и по другому.
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. MissionOnly 25.03.21 12:07 Сейчас в теме
(1) РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Должность - Изменение скорей всего и по этому СрезПоследних тут не работает. Если бы РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Должность - была Ресурсом, то запрос был бы рабочим.
+
2. SlavaKron 05.03.21 11:42 Сейчас в теме
Что за конфигурация, название метаданных какое-то странное?
+
3. 1c_2020 05.03.21 11:46 Сейчас в теме +0.2 $m
4. biimmap 1860 05.03.21 20:52 Сейчас в теме +0.1 $m
Когда Вы получили данные, у Вас по сотруднику ессно будет несколько записей при таком запросе.
Вам нужно вычислить максимальный период по ключевым полям (у Вас наверно это сотрудник). А потом первый запрос отфильтровать, оставив в нём только максимальные даты. Именно они будут содержать действующие на текущий момент данные.

Это если Вам нужно на конкретную дату получить срез. Периоды вычисляются сложнее и по другому.
+
5. ab_initio 95 06.03.21 07:26 Сейчас в теме
Посмотрите вот эту ветку: https://forum.infostart.ru/forum9/topic252977/#message2559321
Здесь, правда, не про кадры, но смысл примерно тот же, т.е. иллюстрация приёма.
Вам нужно получить по данным регистра сведений интервальную таблицу вида ДатаС - ДатаПО - Должность.., а из этой таблицы уже делать выборку в ваш табель. Тогда ничего лишнего попадать не будет.
+
7. Vix 28 26.03.21 18:37 Сейчас в теме
наверное вам нужно получать максимально последнюю дату, я такое делал когда оперировал с регистром сведений "ценыНоменклатуры", когда нужно было получить цену на дату, но выбирались несколько цен за даты, нужно было из этих дат найти максимально последнюю.
			|       РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.ТабельныйНомер КАК ТабельныйНомер,
    			|		РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.ТабельныйНомер.Владелец.ФИО КАК ТабельныйНомерВладелецФИО,
    			|		РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.ТабельныйНомер.Владелец.Ссылка КАК ТабельныйНомерВладелецСсылка,
    			|		РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Подразделение КАК Подразделение,
    			|		РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Должность КАК Должность,
    			|		РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.ВидЗанятости КАК ВидЗанятости,
    			|		РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.ГрафикРаботы КАК ГрафикРаботы,
    			| ВЫБОР
       			| КОГДА РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Период < &ДатаНачала
           		| ТОГДА НАЧАЛОПЕРИОДА(РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Период, МЕСЯЦ)
        		| ИНАЧЕ РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Период
    			| КОНЕЦ КАК Период
				|       ИЗ РегистрСведений.РСКадроваяИсторияСотрудника.СрезПоследних(ДОБАВИТЬКДАТЕ(&ДатаКон,ДЕНЬ,0), Подразделение = &Отдел И ЮрЛицо = &ЮрЛицо И Приход_Уход = ИСТИНА) КАК РСКадровыйПриемУвольнениеСотрудникаСрезПоследних
				|       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
				|		МАКСИМУМ(КИ.Период) КАК ПЕРИОД,
				|		КИ.ТабельныйНомер  
				//|     -------------------нужные реквизиты------------------------
				|	    ИЗ РегистрСведений.РСКадроваяИсторияСотрудника.СрезПоследних(ДОБАВИТЬКДАТЕ(&ДатаКон,ДЕНЬ,0), Подразделение = &Отдел И ЮрЛицо = &ЮрЛицо И Приход_Уход = ИСТИНА) КАК КИ
				|       СГРУППИРОВАТЬ ПО КИ.ТабельныйНомер) КАК ПослЗаписьКИ
				|       ПО (ПослЗаписьКИ.ТабельныйНомер = РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.ТабельныйНомер)
				|       И  (ПослЗаписьКИ.Период = РСКадровыйПриемУвольнениеСотрудникаСрезПоследних.Период)) КАК Кадры
				|	
Показать

что-то вроде этого
+
Внимание! Тема сдана в архив

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