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

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

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