Автоматизация учета рабочего времени — задача, с которой сталкивается большинство разработчиков при интеграции 1С с системами контроля доступа. Основная сложность заключается не в самой арифметике, а в специфике «сырых» данных, которые поступают из СКУД. В данной статье мы разберем по шагам, как построить надежный алгоритм расчета, который минимизирует ошибки из-за человеческого фактора.
Прежде чем приступать к коду, важно понять природу данных. В реальности события Вход и Выход редко идут строго парами. Сотрудники могут забыть приложить карту, приложить её дважды или выйти через «неофициальный» выход. Поэтому простое вычисление РАЗНОСТЬДАТ между соседними записями часто приводит к мистическим и неверным результатам.
Для решения задачи мы рекомендуем использовать метод обработки через таблицу значений, что позволит нам отсортировать события и отсеять аномалии.
Рассмотрим пошаговый алгоритм реализации:
ТаблицаЗначений для хранения очищенных данных.Вход, фиксируйте время начала. Если Выход — закрывайте период.Пример реализации сбора интервалов в 1С:
// Предположим, у нас есть выборка из запроса с полями Сотрудник, ДатаВремя, ЭтоВход
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ДатаВхода", Новый ОписаниеТипов("Дата"));
ТЗ.Колонки.Добавить("ДатаВыхода", Новый ОписаниеТипов("Дата"));
ТЗ.Колонки.Добавить("РазницаВЧасах", Новый ОписаниеТипов("Число"));
ТекущееСостояниеВхода = Неопределено;
Для Каждого Стр Из ВыборкаДанных Цикл
Если Стр.ЭтоВход И ТекущееСостояниеВхода = Неопределено Тогда
ТекущееСостояниеВхода = Стр.ДатаВремя;
ИначеЕсли НЕ Стр.ЭтоВход И ТекущееСостояниеВхода <> Неопределено Тогда
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.ДатаВхода = ТекущееСостояниеВхода;
НоваяСтрока.ДатаВыхода = Стр.ДатаВремя;
НоваяСтрока.РазницаВЧасах = (Стр.ДатаВремя - ТекущееСостояниеВхода) / 3600;
ТекущееСостояниеВхода = Неопределено;
КонецЕсли;
КонецЦикла;
Для более продвинутых сценариев учитывайте следующие рекомендации:
Вход, игнорируйте второе. Сотрудник не может войти, уже находясь в офисе.Выход, используйте жесткое время окончания смены из графика сотрудника. Это поможет избежать «конских» периодов, когда время считается до следующего утра.Важно помнить: данные СКУД — это лишь сырые данные. Они никогда не должны стать единственным источником для автоматического формирования табеля Т-13. Рассчитанное фактическое время следует использовать как инструмент для проверки:
Мы рекомендуем выводить результат сравнения фактического времени СКУД с плановым графиком работы в отдельный отчет. Все расхождения (опоздания, ранние уходы, отсутствие событий) должны передаваться кадровику или руководителю для ручной корректировки.
Попытки написать идеальный код, который сам «угадает» пропущенные проходы, обычно приводят к чрезмерному усложнению системы. Лучшая стратегия — это очистка данных, расчет фактического времени методом парных событий и последующая верификация сотрудниками отдела кадров. Если же точность данных крайне важна, решайте проблему административными мерами: установкой камер или введением ответственности за передачу пропусков.