оптимизация решения условия по поиску даты вступления в должность

1. rinik88 31 17.05.18 09:41 Сейчас в теме
добрый день.
конфа зуп 2.5
стояла задача вывести дату вступления в последнюю новую должность у сотрудников от текущей даты, т.е. сотрудник Иванов И.И. 29.08.16 был принят на работу в должность Механик 4 разряда,
далее 30.11.16 его перевели на 3 разряд, после 18.01.17 становится начальником участка к примеру, 03.05.17 перемещение на другой участок с той же должностью. получается отчет показывает 18.01.17.
задачу решил так, сформировал запрос по сотрудникам и второй запрос уже с отбором по каждому рс РаботникиОрганизации, т.е. получился запрос в цикле, что не есть хорошо, как еще можно решить эту задачу?
+
По теме из базы знаний
Найденные решения
8. catena 110 18.05.18 08:37 Сейчас в теме
Примерно так:

Выбрать Период, Должность, физлицо 
поместить тзТекДолжность 
из РегистрСведений.РаботникиОрганизаций.СрезПоследних();
Выбрать тз.Период, тз.Должность, тз.физлицо, Максимум( ЕстьNULL( тз2.Период,ДатаВремя(1,1,1) ) ) как ПериодПредДолжности 
поместить тзПредДолжность из тзТекДолжность как тз
левое соединение РегистрСведений.РаботникиОрганизаций как тз2 по тз2.Физлицо=тз.Физлицо и тз2.Должность<>тз.Должность
Сгруппировать по тз.Период, тз.Должность, тз.физлицо;
Выбрать Минимум(тз.Период) как НачалоТекДолжности, тз.Физлицо, тз2.ПериодПредДолжности из РегистрСведений.РаботникиОрганизаций как тз
левое соединение тзПредДолжность тз2 по тз.Физлицо=тз2.Физлицо где тз.Период>тз2.ПериодПредДолжности
Сгруппировать по тз.Физлицо,тз2.ПериодПредДолжности
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Isonic 235 18.05.18 08:29 Сейчас в теме
(1) получить эту дату перед циклом. В запросе скорее всего
+
2. rinik88 31 18.05.18 07:56 Сейчас в теме
3. Неопределено 90 18.05.18 08:27 Сейчас в теме
(2)Не совсем понял что происходит после
ЗапросПоСутрудникам.Выполнить().Выбрать()
+
5. rinik88 31 18.05.18 08:34 Сейчас в теме
запрос = новый запрос;
	запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	РаботникиОрганизацийСрезПоследних.Сотрудник
	               |ИЗ
	               |	РегистрСведений.РаботникиОрганизаций.СрезПоследних КАК РаботникиОрганизацийСрезПоследних
	               |ГДЕ
	               |	РаботникиОрганизацийСрезПоследних.Сотрудник.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
	               |	И РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации = &ПодразделениеОрганизации
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	РаботникиОрганизацийСрезПоследних.Сотрудник.ПодразделениеОрганизации";
	запрос.Параметры.Вставить("ПодразделениеОрганизации",ПодразделениеОрганизации);
	выборка = запрос.Выполнить().Выгрузить();
	
	
	табдок = новый табличныйдокумент;
	
	МакетОбработки = ПолучитьМакет("макет"); 
	ОблС = МакетОбработки.ПолучитьОбласть("строка");

	н=0;
	к=0;
	номер=0;
	элементыформы.Индикатор1.МаксимальноеЗначение = выборка.Количество();
	для каждого стр из выборка цикл
		элементыформы.Индикатор1.Значение = элементыформы.Индикатор1.Значение + 1;
		
	номер=номер+1;	
		
		
	запрос = новый запрос;
	запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	РаботникиОрганизаций.Период КАК Период,
	               |	РаботникиОрганизаций.Сотрудник КАК Сотрудник,
	               |	РаботникиОрганизаций.Должность,
	               |	РаботникиОрганизаций.ПодразделениеОрганизации,
	               |	РаботникиОрганизаций.Сотрудник.Физлицо.ДатаРождения как ДатаРождения,
	               |	КатегорииОбъектов.Категория,
	               |	КлассыУсловийТрудаПоДолжностямСрезПоследних.КлассУсловийТруда
	               |ИЗ
	               |	РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
	               |		ПО РаботникиОрганизаций.Сотрудник.Физлицо = КатегорииОбъектов.Объект.Ссылка
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлассыУсловийТрудаПоДолжностям.СрезПоследних КАК КлассыУсловийТрудаПоДолжностямСрезПоследних
	               |		ПО РаботникиОрганизаций.Сотрудник.Должность = КлассыУсловийТрудаПоДолжностямСрезПоследних.Должность
	               |ГДЕ
	               |	РаботникиОрганизаций.Сотрудник = &сотрудник
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Период УБЫВ";
	запрос.Параметры.Вставить("сотрудник",стр.сотрудник);	
	результат = запрос.Выполнить().Выгрузить();	
		
	д = результат.Количество()-1;
	
	//элементыформы.Индикатор2.МаксимальноеЗначение = результат.Количество();
	
	пока н < результат.Количество()-1 цикл
		//элементыформы.Индикатор2.Значение = элементыформы.Индикатор2.Значение + 1;
		если результат[н+1].должность.КодПоОКПДТР <> результат[н].должность.КодПоОКПДТР тогда	
		ОблС.Параметры.фио = результат[н].сотрудник;
		ОблС.Параметры.Должность = результат[н].должность;
		ОблС.Параметры.дата = результат[н].период;
		ОблС.Параметры.подразделение = результат[н].ПодразделениеОрганизации;
		ОблС.Параметры.год = результат[н].ДатаРождения;
		ОблС.Параметры.класс = результат[н].КлассУсловийТруда;
		ОблС.Параметры.Категория = результат[н].Категория;
		ОблС.Параметры.номер = номер;
		ТабДок.Вывести(ОблС);		
		сообщить(н);
		к=к+1;
		Прервать;
		конецесли;
		н=н+1;
	конеццикла;
	если к=0 тогда
		ОблС.Параметры.фио = результат[0].сотрудник;
		ОблС.Параметры.Должность = результат[0].должность;
		ОблС.Параметры.дата = результат[д].период;
		ОблС.Параметры.подразделение = результат[0].ПодразделениеОрганизации;
		ОблС.Параметры.год = результат[0].ДатаРождения;
		ОблС.Параметры.класс = результат[0].КлассУсловийТруда;
		ОблС.Параметры.Категория = результат[0].Категория;
		ОблС.Параметры.номер = номер;
		ТабДок.Вывести(ОблС);
	конецесли;
	н=0;
	к=0;
	конеццикла;

	табдок.Показать();
Показать
+
6. Isonic 235 18.05.18 08:36 Сейчас в теме
(5) объедини два запроса в один, и будет тебе счатье
+
7. Неопределено 90 18.05.18 08:36 Сейчас в теме
(5) Жесть. Почитайте про соединения, там ничего сложного. Текст для поиска
1С, левое соединение
+
10. Isonic 235 18.05.18 08:40 Сейчас в теме
(5)

д = результат.Количество()-1;


Что это? А если "результат.Количество()" будет равно 0 ?? что тогда? все сломается же!
Изучите формирование табличного документа!
+
8. catena 110 18.05.18 08:37 Сейчас в теме
Примерно так:

Выбрать Период, Должность, физлицо 
поместить тзТекДолжность 
из РегистрСведений.РаботникиОрганизаций.СрезПоследних();
Выбрать тз.Период, тз.Должность, тз.физлицо, Максимум( ЕстьNULL( тз2.Период,ДатаВремя(1,1,1) ) ) как ПериодПредДолжности 
поместить тзПредДолжность из тзТекДолжность как тз
левое соединение РегистрСведений.РаботникиОрганизаций как тз2 по тз2.Физлицо=тз.Физлицо и тз2.Должность<>тз.Должность
Сгруппировать по тз.Период, тз.Должность, тз.физлицо;
Выбрать Минимум(тз.Период) как НачалоТекДолжности, тз.Физлицо, тз2.ПериодПредДолжности из РегистрСведений.РаботникиОрганизаций как тз
левое соединение тзПредДолжность тз2 по тз.Физлицо=тз2.Физлицо где тз.Период>тз2.ПериодПредДолжности
Сгруппировать по тз.Физлицо,тз2.ПериодПредДолжности
Показать
+
12. rinik88 31 18.05.18 09:04 Сейчас в теме
(8) все ок, спасибо.
+
9. catena 110 18.05.18 08:37 Сейчас в теме
Только физлиц на сторудников поменяйте
+
11. rinik88 31 18.05.18 08:57 Сейчас в теме
спасибо добрые люди, будем пробывать
+
Внимание! Тема сдана в архив

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