Проверка индивидуального графика на пустоту ячеек(времени)

1. user1921444 13.03.23 21:00 Сейчас в теме
Приветствую, можете пожалуйста подсказать? задача такая: надо в графике проверять на отсутствие сотрудника и на заполненность времени, с учетом кадрового перемещения и увольнение сотрудника. есть документ называется "БС_ВводИндивидуальныхГрафиковРаботыОрганизации", в модуле объекта в процедуре ОбработкаПроверкиЗаполнения написал код:
ВыборкаТекущегоТабеля = СформироватьЗапросПоГрафикРаботы(ВыборкаПоШапкеДокумента).Выгрузить();
		ВыборкаОбщегоТабеля = АвтозаполнениеГрафика();
		
		
		Если ВыборкаТекущегоТабеля.Количество()>0 Тогда
				//проверка на отсутствие сотрудника в табеле
				Для каждого тСтрока из ВыборкаОбщегоТабеля цикл
					НайденныйСотрудник = ВыборкаТекущегоТабеля.НайтиСтроки(Новый Структура("Сотрудник,Должность", тСтрока.Сотрудник, тСтрока.Сотрудник.ТекущаяДолжностьОрганизации));
					Если НайденныйСотрудник.Количество() > 0 Тогда
						Для Каждого ЭлМассива из НайденныйСотрудник Цикл
								//проверка на отсутствие пустых ячеек(часов)
								ДатаАктуальности = ПолучитьИсториюСотрудника(ЭлМассива.Сотрудник);
								счет = 0;
								счет = ?(Месяц(ДатаАктуальности.КП) = Месяц(ЭтотОбъект.ПериодРегистрации), День(ДатаАктуальности.КП), 0);
								
								Пока счет < день(ТекущаяДата()) Цикл
									счет = счет + 1;
									Если (ЭлМассива["Часов"+счет] = 0 И ЭлМассива["ВидВремени"+счет] = Справочники.КлассификаторИспользованияРабочегоВремени.ПустаяСсылка()) Тогда
										Сообщить("У сотрудника "+ЭлМассива.Сотрудник.Наименование+" не введены данные о времени за "+счет+" число"+Символы.ПС);
											Отказ = Истина;
									КонецЕсли;	
								КонецЦикла;		
						КонецЦикла;
					Иначе
						Сообщить("Отсутствует сотрудник "+тСтрока.Сотрудник.Наименование+" по должности "+тСтрока.Должность.Наименование+Символы.ПС);
						Отказ = Истина;
					КонецЕсли;
				КонецЦикла;
		КонецЕсли;
Показать

из функции "ПолучитьИсториюСотрудника", получаю запросом дату начала и дату окончания(когда у него было перемещение, увольнение), вызываю эту функцию, здесь сложности в сравнении дат, по идее надо проверять два периода
-с даты смены должности, если дата в тек месяце
-с начала месяца, в случае если дата за прошлые периоды
-и до даты завершения (если не пустая)(увольнение)
Функция ПолучитьИсториюСотрудника(Сотрудник)

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

	Результат = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = Результат.Выбрать();
	Если ВыборкаДетальныеЗаписи.Следующий() тогда
		Возврат Новый Структура("КП, УВ", ВыборкаДетальныеЗаписи.ДатаНачалаАктуальности, ВыборкаДетальныеЗаписи.ДатаОкончанияАктуальности);
	КонецЕсли;

КонецФункции
Показать

алгоритм такой: если в графике есть такой сотрудник(найден), то проверяем у него ячейки на заполнение смены, а если не найден, то высылаем оповещение, что такой то сотрудник отсутствует в графике
проверка на отсутствие работает корректно, а на пустоту не корректно, мне сейчас придумать как обходить такую ситуацию, например есть сотрудник Пупкин, он сначала работает до 17 февраля в одной организации(по должности официант), а 18 февраля перевели в другую организацию(кадровое перемещение)(на должность менеджер зала), он у меня выдает что с 1-17 ячейки пустые и необходимо заполнить, по идее никакой проверки не должно быть, потому что работает с 18 числа,
в переменной ВыборкаОбщегоТабеля сейчас две строки с пупкиным, это как бы правильно наверно, так как на начало месяца он работал офиком.
по идее надо проверять два периода
-с даты смены должности, если дата в тек месяце
-с начала месяца, в случае если дата за прошлые периоды
-и до даты завершения (если не пустая)(увольнение)
но надо еще учесть, что надо проверять в графике до текущей даты, например могут 1 по 18 число заполнить, с 19 и 31 не заполнить(не знают какие смены ставить)
как это сделать корректно?
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

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