Задача учета рабочего времени по данным систем контроля и управления доступом (СКУД) является классической для автоматизации кадрового учета. Несмотря на кажущуюся простоту, она скрывает множество подводных камней: от технических сбоев оборудования до человеческого фактора и юридических сложностей. В этой статье мы подробно разберем, как реализовать алгоритм расчета времени в 1С, проанализируем различные методики и выясним, как обрабатывать аномалии в данных.
Обычно данные из турникета поступают в виде линейного списка событий, где зафиксированы сотрудник, время и тип события (Приход или Выход). Рассмотрим два основных подхода к расчету времени, которые обсуждались экспертами.
Метод 1: По крайним точкам (Ранний вход — Поздний выход)
Этот метод заключается в поиске самой ранней отметки «Приход» и самой поздней отметки «Выход» за рабочую смену. Разница между ними за вычетом фиксированного обеденного перерыва принимается за отработанное время. Преимущество: простота реализации. Недостаток: полная незащищенность от «фиктивного» присутствия. Сотрудник может зайти в 9:00, через минуту выйти через тот же турникет (или незаметно для системы), вернуться к 18:00 и снова выйти. Система посчитает, что он был на работе весь день.
Метод 2: Суммирование интервалов (Интервальный метод)
Это наиболее точный и справедливый метод. Мы анализируем все пары «Приход — Выход» внутри дня и суммируем только время фактического нахождения внутри периметра предприятия. Рассмотрим подробнее реализацию именно этого метода, так как он позволяет исключить время отсутствия сотрудника (походы в магазин, личные дела в течение дня).
Для реализации интервального метода нам необходимо преобразовать плоский список событий в таблицу интервалов. Разберем этот процесс по шагам.
1. Сортировка данных. Первым делом отсортируем все события по сотруднику и времени события. Это критически важно для корректного поиска пар.
2. Поиск парных событий. Проанализируем последовательность записей. Идеальная цепочка выглядит так: Вход -> Выход -> Вход -> Выход. В этом случае мы просто вычитаем время входа из времени последующего выхода и суммируем результат.
Рассмотрим пример кода на языке 1С, который демонстрирует логику обхода выборки для расчета чистого времени:
// Предположим, РезультатЗапроса содержит колонки: Сотрудник, ВремяСобытия, ТипСобытия
ЧистоеВремя = 0;
ВремяВхода = '00010101';
Для Каждого Строка Из РезультатЗапроса Цикл
Если Строка.ТипСобытия = Перечисления.ТипыСобытийСКУД.Вход Тогда
// Запоминаем время входа для последующей пары
ВремяВхода = Строка.ВремяСобытия;
ИначеЕсли Строка.ТипСобытия = Перечисления.ТипыСобытийСКУД.Выход И ЗначениеЗаполнено(ВремяВхода) Тогда
// Нашли пару, считаем интервал в секундах
Интервал = Строка.ВремяСобытия - ВремяВхода;
ЧистоеВремя = ЧистоеВремя + Интервал;
// Сбрасываем время входа, чтобы не использовать его повторно
ВремяВхода = '00010101';
КонецЕсли;
КонецЦикла;
3. Обработка непарных отметок. Это самая сложная часть задачи. Что делать, если зафиксирован Вход, а затем снова Вход? Или если первым событием в середине дня идет Выход? Такие ситуации возникают, когда сотрудники проходят турникет «паровозиком», прикладывают карту, но не проходят, или используют запасные выходы. Проанализируем ситуацию: если мы видим два входа подряд, первый следует считать ошибочным или использовать логику «виртуального выхода» по графику работы, но лучше всего помечать такие данные как «требующие проверки».
Для эффективного расчета в 1С часто используют механизм соединения таблицы самой с собой. Мы можем соединить таблицу событий СКУД с ней же самой по условию Т1.Время < Т2.Время и найти для каждого входа минимальное время выхода. В 1С это удобно делать через временные таблицы в языке запросов.
Также полезно использовать методику «Среза последних на каждую дату». Если мы храним события в регистре сведений, мы можем получить состояние сотрудника («Внутри» или «Снаружи») на любой момент времени. Это позволяет строить отчеты не только по сумме часов, но и визуализировать график присутствия.
Если на предприятии есть ночные смены, расчет времени «внутри суток» перестает работать. В этом случае интервал может начаться в 22:00 одного дня и закончиться в 06:00 следующего. Разберем, как это решить: при расчете мы не должны жестко ограничиваться выборкой за календарные сутки. Мы берем интервал времени с запасом (например, +/- 12 часов от границ смены) и ищем пары событий Вход и Выход, игнорируя смену календарной даты. Итоговое время следует относить на ту дату, в которую началась смена согласно графику работы сотрудника.
Проанализируем важный момент: можно ли на основании данных турникета автоматически лишать премии или увольнять за прогул? Юридическая практика показывает, что сами по себе данные СКУД не являются бесспорным доказательством в суде, если система не сертифицирована как средство измерения рабочего времени. Выясним причину: судья может заявить, что таймер в турникете не прошел поверку, или что данные могли быть изменены администратором базы данных.
Чтобы данные из 1С имели вес, необходимо придерживаться следующей схемы:
Рассмотрим распространенную ситуацию: сотрудники обмениваются карточками, чтобы один «пропикал» за всех. Для решения этой проблемы рекомендуется:
Для создания качественной системы учета времени в 1С недостаточно просто вычесть время прихода из времени ухода. Мы должны реализовать интервальный расчет, предусмотреть обработку технических ошибок (непарных событий), учесть ночные смены и, самое главное, интегрировать этот процесс в правовое поле компании. СКУД в 1С — это мощный инструмент дисциплины, но он работает эффективно только в связке с грамотным управлением и правильной настройкой бизнес-логики программы.