Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

учет рабочего времени по данным пропускной системы

учет рабочего времени по данным пропускной системы
Я
   Abba
 
28.01.20 - 15:57
TimeVal                  HozOrgan              Remar                                       Mode
09.12.2019 9:26:38    58    6: Выход   4-й этаж служебный,   Считыватель 2, Пр    2
09.01.2020 9:06:40    103    2: Вход   дверь 2-й этаж служебный,   Считыватель    1
20.01.2020 16:10:50    77    2: Вход   дверь 2-й этаж служебный,   Считыватель    1
21.01.2020 10:32:51    47    3: Выход   3-й этаж главный вход,   Считыватель 2,    2
02.12.2019 17:00:41    56    6: Вход   4-й этаж служебный,   Считыватель 1, При    1
23.01.2020 9:32:52    16    3: Вход   3-й этаж главный вход,   Считыватель 1,    1
24.01.2020 14:24:22    54    4: Вход   3-й этаж служебный,   Считыватель 1, При    1
17.01.2020 10:41:14    37    2: Выход   дверь 2-й этаж служебный,   Считыватель    2
27.01.2020 9:53:30    69    6: Выход   4-й этаж служебный,   Считыватель 2, Пр    2
27.12.2019 13:47:58    64    2: Выход   дверь 2-й этаж служебный,   Считыватель    2
16.01.2020 8:07:03    89    6: Вход   4-й этаж служебный,   Считыватель 1, При    1
30.12.2019 14:26:43    58    6: Выход   4-й этаж служебный,   Считыватель 2, Пр    2
14.01.2020 8:56:27    36    1: Вход   2-й этаж гл.вход,   Считыватель 1, Прибо    1
16.12.2019 17:34:00    4    5: Выход   4-й этаж главный вход,   Считыватель 2,    2
23.12.2019 18:19:25    26    3: Выход   3-й этаж главный вход,   Считыватель 2,    2
03.12.2019 16:22:59    48    2: Вход   дверь 2-й этаж служебный,   Считыватель    1

HozOrgan - ID сотрудника
Mode - 1-вход
       2- выход

есть такая таблица,как по ней написать отчет о том,какие сотрудники в течении  рабочего дня отлучались больше чем на 20 минут
 
 
   olegves
 
1 - 28.01.20 - 15:58
(0) запросом
   Solitar
 
2 - 28.01.20 - 15:58
Интеграция с Орионом ?)
   XLife
 
3 - 28.01.20 - 16:00
кто таких на работу берёт...
   shuhard
 
4 - 28.01.20 - 16:00
(2) +100500
и как всегда вышел 3 раза, а зашёл 1
   Дмитрий
 
5 - 28.01.20 - 16:09
опубликуй ссылку на этот форум в чате предприятия и иди к директору за премией по случаю резкого скачка дисциплины )
   Йохохо
 
6 - 28.01.20 - 16:09
(4) а некурящие 2/2
   Deon
 
7 - 28.01.20 - 16:10
(0) Время работы каждого сотрудника есть где брать? А то вот я работаю до 18:00, а ушел в 17:35. Это отсутствие в 25 минуто тоже должно попасть в отчет )
   Йохохо
 
8 - 28.01.20 - 16:11
и по этому отчету никак, нет Зоны, надо раб зону и внешний мир
   ZDenis
 
9 - 28.01.20 - 16:13
(0) А если он вышел через 1 дверь, а вошел через другую (при этом дверь была открыта кем-то ранее и он не прикладывал карточку к считывателю). А так тут перец #58 два раза вышел. Первый раз в канун нового года, а второй уже девятого числа))
   Deon
 
10 - 28.01.20 - 16:16
(9) Я в таких случаях считал, что если первая запись в дне Выход, то он пришел на работу точно вовремя. Хорошо, что все были 5-дневщиками
   Garikk
 
11 - 28.01.20 - 16:19
(9) это быстро лечится - включением контроля прохода в помещение, что нельзя выйти из помещения не войдя туда, моментально все научатся карточки прикладывать, даже штрафовать никого не придется
   Йохохо
 
12 - 28.01.20 - 16:21
(11) а проходная типа тамбур и денег стоит и место занимает. и 100 носов на смену за час пройдут еле еле)
   8 bit
 
13 - 28.01.20 - 16:21
(0) пиши вручную
   olegves
 
14 - 28.01.20 - 16:25
(8) есть событие вход и выход
   Garikk
 
15 - 28.01.20 - 16:25
(12) нормально пройдут, я работал в двух конторах где уровень безопасности обязывает держать тамбур-шлюз...за 15 минут 400 человек в здание заходят без огромных очередей
   Йохохо
 
16 - 28.01.20 - 16:28
(14) это не события покинул рабочее место
   rphosts
 
17 - 28.01.20 - 16:29
(0) не перко случаем?

Собирали в 1С по регламенту минут в 5 раз, со всех филиалов (на самом деле с 1 сервера перко), были допформочки где челы регили причину отсутствия(заблаговременно, ну кроме выйти покурить но покурить это только менее 5 мин отсутствия)... ну и отчёты были (по недоработке/переработке, оператиынеы сведения о присутствии/отсутствии/командировках/...)
   Garikk
 
18 - 28.01.20 - 16:31
<челы регили причину отсутствия>

господи как я счастлив что в ит работаю... такое впечатление что в других профессиях какойто ужас и эксплуатация крепостных крестьян
   olegves
 
19 - 28.01.20 - 16:32
(17) имхо, считать жопочасы - последнее дело, и показывает "качество" среднего менеджерского звена
   Abba
 
20 - 29.01.20 - 13:49
(1) каким? как найти интервал между выходом и входом более 20 минут?
   Abba
 
21 - 29.01.20 - 13:50
почти все замечания не по делу,просто потрындеть зашли?
   TopProger
 
22 - 29.01.20 - 13:55
(21) ну просто готовое решение долго набирать, а свои наработки вы не представили
   TopProger
 
23 - 29.01.20 - 13:56
(20) Ну наверно надо как то подобрать чтобы в одной строке таблицы был выход и ближайший вход, скорее всего путем соединения таблицы с собой. А затем заюзать РазностьДат и по результату наложить отбор.
   Abba
 
24 - 29.01.20 - 14:05
(23) вот ближайший вход как организовать?
   TopProger
 
25 - 29.01.20 - 14:05
(24) путем соединения в запросе таблицы данных с собой и наложение условий на поля этой таблицы
   Масянька
 
26 - 29.01.20 - 14:09
(19) Мечта любого безопасника.
   Abba
 
27 - 29.01.20 - 14:09
(25) это понятно,какие условия поставить?
   Йохохо
 
28 - 29.01.20 - 14:10
(21) вообще то а) в болиде есть готовый отчет б) задача для десятиклассника
   TopProger
 
29 - 29.01.20 - 14:13
(27) а какие условия вы пробовали? Готовое решение никто не даст, уже понятно по постав выше. Надо пробовать самому
   Abba
 
30 - 29.01.20 - 14:15
(29) ВЫБРАТЬ ПЕРВЫЕ 100
    dbo_pList.ID КАК ID,
    dbo_pList.Name КАК Name,
    dbo_pList.FirstName КАК FirstName,
    dbo_pList.MidName КАК MidName,
    dbo_pLogData.TimeVal КАК TimeVal,
    dbo_pLogData.Mode КАК Mode
ИЗ
    ВнешнийИсточникДанных.ПроходнаяSQL.Таблица.dbo_pList КАК dbo_pList
        ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ПроходнаяSQL.Таблица.dbo_pLogData КАК dbo_pLogData
        ПО (dbo_pList.ID = dbo_pLogData.HozOrgan)

СГРУППИРОВАТЬ ПО
    dbo_pList.ID,
    dbo_pList.Name,
    dbo_pList.FirstName,
    dbo_pList.MidName,
    dbo_pLogData.TimeVal,
    dbo_pLogData.Mode
 
 
   Abba
 
31 - 29.01.20 - 14:16
(28) ну дак опишите решение?или вы в 9 классе?
   TopProger
 
32 - 29.01.20 - 14:19
(30) ну очевидно, что вы ничего не пробовали
   Abba
 
33 - 29.01.20 - 14:24
(32) вон же написано выше,мой запрос.но там еще другие таблицы привязаны,на них не обращайте внимание
   VladZ
 
34 - 29.01.20 - 14:25
(7) Это другая задача. :)
   Abba
 
35 - 29.01.20 - 14:28
(32) не то скопировала.вот
ВЫБРАТЬ
    dbo_pLogData.HozOrgan КАК HozOrgan,
    dbo_pLogData.TimeVal КАК времяВхода
ПОМЕСТИТЬ ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблица
ИЗ
    ВнешнийИсточникДанных.ПроходнаяSQL.Таблица.dbo_pLogData КАК dbo_pLogData
ГДЕ
    dbo_pLogData.Mode = 1

СГРУППИРОВАТЬ ПО
    dbo_pLogData.HozOrgan,
    dbo_pLogData.TimeVal
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    dbo_pLogData.HozOrgan КАК HozOrgan,
    dbo_pLogData.TimeVal КАК времявыхода
ПОМЕСТИТЬ ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблицаВыход
ИЗ
    ВнешнийИсточникДанных.ПроходнаяSQL.Таблица.dbo_pLogData КАК dbo_pLogData
ГДЕ
    dbo_pLogData.Mode = 2

СГРУППИРОВАТЬ ПО
    dbo_pLogData.HozOrgan,
    dbo_pLogData.TimeVal
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.HozOrgan КАК HozOrgan,
    ВЫБОР
        КОГДА РАЗНОСТЬДАТ(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, МИНУТА) > 20
                И РАЗНОСТЬДАТ(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, МИНУТА) < 900
            ТОГДА РАЗНОСТЬДАТ(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, МИНУТА)
    КОНЕЦ КАК Поле1,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода КАК времяВхода,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода КАК времявыхода
ПОМЕСТИТЬ ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблицаИнтервал
ИЗ
    ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблица КАК ПроходнаяSQLВременнаяТаблицаВременнаяТаблица
        ПОЛНОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблицаВыход КАК ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход
        ПО ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.HozOrgan = ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.HozOrgan
            И (НАЧАЛОПЕРИОДА(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ДЕНЬ) = НАЧАЛОПЕРИОДА(ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, ДЕНЬ))
            И (ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода < ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода)

СГРУППИРОВАТЬ ПО
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.HozOrgan,
    ВЫБОР
        КОГДА РАЗНОСТЬДАТ(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, МИНУТА) > 20
                И РАЗНОСТЬДАТ(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, МИНУТА) < 900
            ТОГДА РАЗНОСТЬДАТ(ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода, ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода, МИНУТА)
    КОНЕЦ,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица.времяВхода,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаВыход.времявыхода
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    dbo_pList.ID КАК ID,
    dbo_pList.FirstName КАК FirstName,
    dbo_pList.MidName КАК MidName,
    dbo_pList.Name КАК Name
ПОМЕСТИТЬ ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблица_ФИО
ИЗ
    ВнешнийИсточникДанных.ПроходнаяSQL.Таблица.dbo_pList КАК dbo_pList

СГРУППИРОВАТЬ ПО
    dbo_pList.ID,
    dbo_pList.FirstName,
    dbo_pList.MidName,
    dbo_pList.Name
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ ПЕРВЫЕ 100
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.FirstName КАК FirstName,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.MidName КАК MidName,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.Name КАК Name,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.Поле1 КАК ВремяОтсутствия,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.времявыхода КАК времявыхода,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.времяВхода КАК времяВхода,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.ID КАК ID1
ИЗ
    ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблицаИнтервал КАК ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал
        ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблица_ФИО КАК ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО
        ПО (ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.HozOrgan = ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.ID)
ГДЕ
    НЕ ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.Поле1 = ""
    И НЕ ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.ID = ""
    И НЕ ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.FirstName = "-123"
    И НЕ ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.MidName = "-"
    И НЕ ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.Name = "-"
    И ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.времяВхода МЕЖДУ &времяВхода И &времяВыхода
    И ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.времявыхода МЕЖДУ &времяВхода И &времяВыхода

СГРУППИРОВАТЬ ПО
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.FirstName,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.MidName,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.Name,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.Поле1,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.времявыхода,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблицаИнтервал.времяВхода,
    ПроходнаяSQLВременнаяТаблицаВременнаяТаблица_ФИО.ID
   TopProger
 
36 - 29.01.20 - 14:34
всеже в рамках задачи можно было и обрезать все лишнее и обратить внимание на нужные таблицы. Зачем полное соединение оно должно быть левым. А может даже изначально сделать две выборки, в одной будут входы в другой выходы.
   Abba
 
37 - 29.01.20 - 14:40
(36) там только фио лишнее.оно не влияет на суть. если даже две выборки,как найти интервал (более 20мин) в течении дня? мой запрос работает,но некорректно(
   Homer
 
38 - 29.01.20 - 14:50
предлагаю тебе ВнешнийИсточникДанных.ПроходнаяSQL.ВременнаяТаблица.ВременнаяТаблицаИнтервал сгруппировать по Минимум(времявыхода)
   TopProger
 
39 - 29.01.20 - 14:53
Получаешь таблицу входов, затем получаешь таблицу выходов, затем соединяешь таблицу входов с таблицей выходов, там чтобы дата выхода была меньше даты входа, Затем для каждого сотрудника получаешь минимальные значения для даты входа, далее считаешь разницу между входом и выходом
   3achem
 
40 - 29.01.20 - 14:58
(39) Сейчас тебя попросят код написать
   Abba
 
41 - 29.01.20 - 15:24
(39) спасибо.так и делала. я поняла почему некорректно работает.просто сам регистр некорректен, то несколько выходов подряд,то несколько входов((
придется в коде писать
   MyNick
 
42 - 29.01.20 - 15:27
(0) надо начать с того, что реализация данной задачи НИКАК не повысит мотивацию сотрудников и не увеличит прибыль компании.
   MyNick
 
43 - 29.01.20 - 15:30
Я бы даже сказал, что у более-менее ответственных мотивация только пострадает, а у расп..яев нововведения вызовут улыбку.
   Abba
 
44 - 29.01.20 - 15:49
(43) это отношение к делу не имеет
   Xapac
 
45 - 29.01.20 - 15:58
а системы распознавания лиц (вход/выход) интересно ставят уже где либо.
   fisher
 
46 - 29.01.20 - 16:08
Тех, кто советует запросом - гони ссаными тряпками. Замучаешься краевые случаи обрабатывать.
Сортируешь и проходишься конечным автоматом.
   fisher
 
47 - 29.01.20 - 16:11
Хотя оно и так должно быть по времени отсортировано. Этого достаточно.
   El_Duke
 
48 - 29.01.20 - 16:13
(45) Знаю один франч где внедрено такое
   Xapac
 
49 - 29.01.20 - 16:25
(46)+
   almar
 
50 - 29.01.20 - 16:27
Еще перед подсчетом времени нужно определять ошибки - первое событие дня выход, два подряд входа, два подряд выхода, последнее событие дня вход
   Abba
 
51 - 29.01.20 - 16:28
(45) у нас только по пальцу было)) и то замучались
   Abba
 
52 - 29.01.20 - 16:29
(46) это как? по выборке пройтись? я просто новичек совсем,уж извините))
   fisher
 
53 - 29.01.20 - 16:30
(50) Естественно. Только почему "перед", а не "при"? Сразу при подсчете принимать решение по проблемным ситуациям, просто помечать этот отрезок как проблемный и даже ставить категорию проблемы для последующего анализа.
   Abba
 
54 - 29.01.20 - 16:33
(50) в запросе так не сделаешь
   fisher
 
55 - 29.01.20 - 16:52
(52) Да. Смотри. У тебя задача из потока событий получить таблицу посещений вида "сотр / вход / выход / время пребывания". Плюс еще категорию проблемы при определении времени пребывания можно добавить. Потом уже делай с ней что хочешь в зависимости от задачи. Для сабжевой задачи отсортируешь по убыванию времени пребывания и возьмешь верхние записи за пределами 20 минут.
Теперь как получить таблицу посещений. Делаешь машину состояний. Ну, т.е. для каждого сотрудника надо где-то хранить, какое его текущее состояние анализа. Вошедший он на текущий момент или вышедший. Плюс время последнего события запоминаем. Для скорости, лучше всего это в соответствие пихать где ключами сотрудники, а значения - структуры с нужными полями.
Т.е. начинаем анализировать таблицу событий, берем строку. Берем состояние сотра из соответствия. Нету - создаем. Есть - сравниваем состояние сотрудника с текущим событием.
Был вышедший, а событие вход? Ага - добавляем строку в таблицу посещений, проставляем там время входа и запоминаем ссылку на строку в структуре состояния сотрудника.
Был вошедший, а событие выход? Ага - берем ссылку на строку из структуры состояний где уже проставлен вход, пишем туда время выхода и рассчитываем время пребывания.
Был никакой, а событие выход? Хм... Я бы добавил строку в таблицу посещений со временем, равным началу анализа и поставил признак, что была такая-то проблема при расчете этого отрезка.
Был вошедший, а событие вход? Хм... Можно проанализировать время предыдущего входа и если оно рядом, то принять первое срабатывание как ложное (изменить время входа на второе событие). Стоит ли отдельно анализировать ложные срабатывания - вопрос. Если два входа разнесены по времени, а выхода между ними нет (либо пикнул и ушел, либо вышел по чужой карточке либо еще что) - то нужно принять решение каким временем закрыть прошлый вход и обязательно пометить эту проблему отдельной категорией. Если такие инциденты по сотруднику будут регулярными - значит он мухлюет.
Ну и так далее.
Еще нужно будет решить, что делать если вошел вечером, а вышел утром и т.п. Но это уже дело техники. Новые правила внедряются несложно.
   fisher
 
56 - 29.01.20 - 16:57
А, стоп. У тебя время отсутствия надо считать, а не время пребывания. Тогда можно отсортировать полученную таблицу посещений по сотрам и за один проход собрать тех, у которых время начала очередного рабочего отрезка отличается от времени завершения предыдущего более чем на 20 минут в рабочее время. А таблица посещений все равно пригодится для очередных анализов.
   ManyakRus
 
57 - 29.01.20 - 17:01
я как раз то же самое делал недавно в 1С Документооборот :)
Интеграция с Орионом :)
   Йохохо
 
58 - 29.01.20 - 17:02
(56) 16:52 - 16:57 =)
   fisher
 
59 - 29.01.20 - 17:04
(58) Не понял шутки юмора. Но в конце дня я могу тормозить больше обычного :)
   Йохохо
 
60 - 29.01.20 - 17:05
(59) решение за 5 минут если вчитаться
   fisher
 
61 - 29.01.20 - 17:11
(60) Не-не-не. У меня уже вышел дневной лимит распознавания намеков. Выдай мысль полным связным предложением :)
   rphosts
 
62 - 29.01.20 - 17:13
(19) я от туточки ушёл
   Abba
 
63 - 31.01.20 - 14:43
(2)да
   Abba
 
64 - 31.01.20 - 14:44
(13) как?


Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно задать вопрос "Как сделать?" и получить кучу ответов, что тебе это делать не надо. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.