Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Алгоритм подсчета отработанного времени          
kosalex Подменю пользователя
сообщение 17.09.15, 9:55
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

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

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

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

andr_andrey Подменю пользователя
сообщение 17.09.15, 10:42
Сообщение #2

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 626
Спасибо сказали: 166 раз
Рейтинг: 130.8

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

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

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

Подсказать, что от времени выхода отнять время входа и сравнить с нормой?


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

kosalex Подменю пользователя
сообщение 17.09.15, 11:01
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(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_ Подменю пользователя
сообщение 19.02.16, 17:12
Сообщение #4

Общительный
**
Группа: Пользователи
Сообщений: 15
Спасибо сказали: 5 раз
Рейтинг: 0

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 19.04.24, 3:19
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!