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