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