Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм подсчета отработанного времени
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
kosalex
Доброго времени суток! Есть у меня РС в нем, периодичность - секунда, Измерения: Сотрудник,График; Реквизиты:Событие(Вход,Выход), Период1.
Так же есть РС где храниться информация о начале и окончании рабочего дня

Запросом выбираю вот такую вот табличку, а дальше....подскажите алгоритм)) Нужно посчитать количество отработанного времени за 1 день.

Результат запроса:
andr_andrey
Цитата(kosalex @ 17.09.15, 10:55) необходимо зарегистрироваться для просмотра ссылки
Доброго времени суток! Есть у меня РС в нем, периодичность - секунда, Измерения: Сотрудник,График; Реквизиты:Событие(Вход,Выход), Период1.
Так же есть РС где храниться информация о начале и окончании рабочего дня

Запросом выбираю вот такую вот табличку, а дальше....подскажите алгоритм)) Нужно посчитать количество отработанного времени за 1 день.

Результат запроса:

Подсказать, что от времени выхода отнять время входа и сравнить с нормой?
kosalex
Цитата(andr_andrey @ 17.09.15, 11:42) необходимо зарегистрироваться для просмотра ссылки
Подсказать, что от времени выхода отнять время входа и сравнить с нормой?

Конечно же нет :-)


Вот мой алгоритм:

Если НЕ Результат.Пустой() Тогда
        ТЗДанныеСотрудникиКОДОС = Результат.Выгрузить();
        
        Для День = 1 По День(ДатаКон) Цикл  //ЦИКЛ ПО ДНЯМ
            ОбработкаПрерыванияПользователя();
            ОтработаноЗаДень = 0;
            
            
            Для Каждого Строка Из ТЗДанныеСотрудникиКОДОС Цикл //НАЧАЛО Обойдем выборку и посчитаем сколько сотрудник отработал за один определенный день
                ВыходРаньшеВремени = 0;
                ОпозданиеНаРаботу = 0;
                
                ОбработкаПрерыванияПользователя();
                
                //НАЧАЛО Преобразование времени
                СтрВремяВходВъезд = СтрЗаменить(Формат(Строка.ДатаВремяВходВъезд,"ДЛФ=T"),":","");
                Если СтрДлина(СтрВремяВходВъезд) < 6 Тогда
                    СтрВремяВходВъезд = "0" + СтрВремяВходВъезд;    
                КонецЕсли;
                ВремяВходВъезд = Дата("00010101" + СтрВремяВходВъезд);
                

                СтрВремяВремяВыходВыезд = СтрЗаменить(Формат(Строка.ДатаВремяВыходВыезд,"ДЛФ=T"),":","");
                Если СтрДлина(СтрВремяВремяВыходВыезд) < 6 Тогда
                    СтрВремяВремяВыходВыезд = "0" + СтрВремяВремяВыходВыезд;    
                КонецЕсли;
                ВремяВыходВыезд = Дата("00010101" + СтрВремяВремяВыходВыезд);
                //КОНЕЦ Преобразование времени

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


Результат:


Может кто то подскажет как то по другому сделать?
lga_
У меня используется сканер отпечатков пальцев. Я беру график и нахожу ближайшее время перед приходом по графику и после ухода по графику. Если все ок, то ставлю время, отработанное по графику (переработки не оплачиваются, но если есть необходимость в переработке, то HR переделывает график за этот день ). Если опоздал или раньше ушел, тогда разница между первой и последней сканировкой. Вот вкратце как-то так
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.