Как правильно рассчитать рабочее время сотрудников на основе данных СКУД в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Автоматизация учета рабочего времени — задача, с которой сталкивается большинство разработчиков при интеграции 1С с системами контроля доступа. Основная сложность заключается не в самой арифметике, а в специфике «сырых» данных, которые поступают из СКУД. В данной статье мы разберем по шагам, как построить надежный алгоритм расчета, который минимизирует ошибки из-за человеческого фактора.

Анализ проблемы «грязных» данных

Прежде чем приступать к коду, важно понять природу данных. В реальности события Вход и Выход редко идут строго парами. Сотрудники могут забыть приложить карту, приложить её дважды или выйти через «неофициальный» выход. Поэтому простое вычисление РАЗНОСТЬДАТ между соседними записями часто приводит к мистическим и неверным результатам.

Алгоритмический подход к расчету времени

Для решения задачи мы рекомендуем использовать метод обработки через таблицу значений, что позволит нам отсортировать события и отсеять аномалии.

Рассмотрим пошаговый алгоритм реализации:

  1. Создайте вспомогательную ТаблицаЗначений для хранения очищенных данных.
  2. Отсортируйте полученные данные из СКУД по сотруднику и дате/времени.
  3. В цикле обхода данных применяйте логику «состояний». Если текущая запись — Вход, фиксируйте время начала. Если Выход — закрывайте период.

Пример реализации сбора интервалов в 1С:


// Предположим, у нас есть выборка из запроса с полями Сотрудник, ДатаВремя, ЭтоВход
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ДатаВхода", Новый ОписаниеТипов("Дата"));
ТЗ.Колонки.Добавить("ДатаВыхода", Новый ОписаниеТипов("Дата"));
ТЗ.Колонки.Добавить("РазницаВЧасах", Новый ОписаниеТипов("Число"));

ТекущееСостояниеВхода = Неопределено;

Для Каждого Стр Из ВыборкаДанных Цикл
    Если Стр.ЭтоВход И ТекущееСостояниеВхода = Неопределено Тогда
        ТекущееСостояниеВхода = Стр.ДатаВремя;
    ИначеЕсли НЕ Стр.ЭтоВход И ТекущееСостояниеВхода <> Неопределено Тогда
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.ДатаВхода = ТекущееСостояниеВхода;
        НоваяСтрока.ДатаВыхода = Стр.ДатаВремя;
        НоваяСтрока.РазницаВЧасах = (Стр.ДатаВремя - ТекущееСостояниеВхода) / 3600;
        ТекущееСостояниеВхода = Неопределено;
    КонецЕсли;
КонецЦикла;

Методы обработки нестандартных ситуаций

Для более продвинутых сценариев учитывайте следующие рекомендации:

Связь с табельным учетом

Важно помнить: данные СКУД — это лишь сырые данные. Они никогда не должны стать единственным источником для автоматического формирования табеля Т-13. Рассчитанное фактическое время следует использовать как инструмент для проверки:

Мы рекомендуем выводить результат сравнения фактического времени СКУД с плановым графиком работы в отдельный отчет. Все расхождения (опоздания, ранние уходы, отсутствие событий) должны передаваться кадровику или руководителю для ручной корректировки.

Заключение

Попытки написать идеальный код, который сам «угадает» пропущенные проходы, обычно приводят к чрезмерному усложнению системы. Лучшая стратегия — это очистка данных, расчет фактического времени методом парных событий и последующая верификация сотрудниками отдела кадров. Если же точность данных крайне важна, решайте проблему административными мерами: установкой камер или введением ответственности за передачу пропусков.

← На главную