Как настроить время начала и окончания смены сотрудника по дням недели в 1С:ЗУП и 1С:ERP?

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

При работе с системами 1С:Зарплата и Управление Персоналом (ЗУП) и 1С:ERP Управление предприятием часто возникает потребность в детализированном учете рабочего времени сотрудников, включая точное время начала и окончания смены по дням недели. Это особенно актуально для организаций с почасовой оплатой труда, сменными графиками или непрерывным производством, а также при интеграции с системами контроля и управления доступом (СКУД). Однако, как показывает практика, типовой функционал 1С:ЗУП и 1С:ERP не предоставляет прямого инструмента для установки конкретного времени начала и окончания смены в стандартных графиках работы. Это означает, что для решения подобной задачи нам потребуется прибегнуть к кастомизации системы.

Ограничения стандартного функционала 1С:ЗУП и 1С:ERP

Прежде чем мы перейдем к решениям, давайте кратко рассмотрим, какой функционал для учета рабочего времени доступен в типовых конфигурациях и почему его недостаточно для нашей задачи.

  1. Графики работы сотрудников: В 1С:ЗУП и 1С:ERP основным инструментом для планирования рабочего времени является справочник «Графики работы сотрудников». Здесь мы можем создать различные типы графиков: пятидневка, шестидневка, сменный, сокращенный, неполное рабочее время, графики с суммированным учетом. Мы можем указать общую продолжительность явки, ночных и вечерних часов для каждого дня цикла графика. Однако, в стандартном графике невозможно указать конкретное время, например, что смена начинается ровно в 08:00 и заканчивается в 17:00. Система оперирует только длительностью видов времени.
  2. Виды времени: Система позволяет настроить несколько видов времени (явка, ночные часы, вечерние часы, перерыв и т.д.) и оплачивать их по разным тарифным ставкам. В графике можно задать количество часов для каждого вида времени. Это полезно для расчета оплаты, но не для определения точного момента начала и конца смены.
  3. Индивидуальные графики: Документ «Индивидуальный график» позволяет оперативно изменить график работы конкретного сотрудника на определенный месяц, имея приоритет над общим графиком. Но и здесь мы сталкиваемся с тем же ограничением – невозможно указать точное время начала и окончания смены.
  4. Методы учета времени: Программа поддерживает две основные методики учета фактического времени:
    • Метод отклонений: Фактическое отработанное время определяется на основании планового графика и зарегистрированных отклонений (больничные, отпуска, прогулы, командировки).
    • Метод сплошной регистрации: Регистрируется фактически использованное время, например, через документ «Табель учета рабочего времени».

    Ни один из этих методов в типовом виде не предусматривает автоматического определения точного времени начала/окончания смены на основе внешних данных или жесткой привязки к графику.

Таким образом, для реализации задачи по учету конкретного времени начала и окончания смены, особенно в связке со СКУД, нам потребуется доработка системы.

Подходы к решению: Кастомизация и доработка системы

Поскольку типового функционала для прямого указания времени начала и окончания смены нет, мы будем рассматривать варианты доработки системы, используя механизмы платформы 1С:Предприятие.

Решение 1: Добавление реквизитов в существующие справочники

Одним из относительно простых способов расширить функционал является добавление новых реквизитов в существующие объекты конфигурации. Рассмотрим два похожих подхода:

  1. Добавление реквизита в табличную часть "Виды времени" справочника "Графики работы сотрудников":

    Мы можем модифицировать справочник Графики работы сотрудников, добавив в его табличную часть, отвечающую за виды времени по дням, новые колонки для указания времени начала и окончания. Например, можно добавить реквизиты:

    • ВремяНачалаСмены (тип данных: Время)
    • ВремяОкончанияСмены (тип данных: Время)

    Таким образом, для каждого дня цикла графика и для каждого вида времени (основная работа, вечерняя, ночная) мы сможем явно установить это время. Это позволяет задавать не только общую продолжительность, но и конкретные временные рамки. Например, для «Основной работы» в понедельник – с 08:00 до 17:00, для «Вечерней» – с 17:00 до 22:00.

    Преимущества: Универсальность, позволяет гибко задавать время для разных видов работ. Интуитивно понятно, так как привязано к существующим графикам.

    Недостатки: Требует изменения типовой конфигурации, что может усложнить обновления. Лучше реализовывать через расширения.

  2. Использование дополнительных реквизитов или дополнительных сведений:

    Платформа 1С предоставляет механизм для добавления дополнительных реквизитов (для справочников и документов) и дополнительных сведений (для объектов, не являющихся справочниками или документами, или для хранения более сложных структур). Мы можем добавить такие реквизиты к объекту Сотрудник или к элементу справочника ГрафикиРаботыСотрудников.

    Например, можно создать дополнительные реквизиты для справочника ГрафикиРаботыСотрудников:

    • ВремяНачалаСменыПонедельник (тип: Время)
    • ВремяОкончанияСменыПонедельник (тип: Время)
    • ... и так далее для каждого дня недели.

    Или же использовать механизм дополнительных сведений, который более гибок и позволяет хранить данные в отдельном регистре, не модифицируя структуру основного объекта напрямую.

    Преимущества: Механизм дополнительных реквизитов/сведений менее инвазивен, чем прямое изменение метаданных, и поддерживается типовой конфигурацией, что упрощает обновления. Позволяет хранить информацию о начале/окончании смены для различных сущностей (для компании в целом, для отделов, для отдельных сотрудников).

    Недостатки: Может быть менее удобно для ввода, если графики сильно меняются и нужно задавать время для каждого дня цикла, а не только для общего графика.

Решение 2: Создание собственных регистров сведений для учета СКД и рабочего времени

Этот подход является наиболее универсальным и мощным, особенно при интеграции со СКУД. Он предполагает создание нескольких собственных регистров сведений и настройку логики их заполнения и обработки.

Рассмотрим по шагам, как это можно реализовать:

  1. Создание регистра сведений для хранения учетных данных СКУД:

    Нам потребуется регистр, который будет принимать все данные из системы контроля доступа. Назовем его, например, ДанныеСистемыКонтроляДоступа. Мы рекомендуем следующие параметры:

    • Периодичность: В пределах секунды. Это позволит точно фиксировать каждое сканирование.
    • Измерения:
      • Сотрудник (тип: СправочникСсылка.Сотрудники).
      • ДатаВремяСобытия (тип: ДатаВремя).
    • Ресурсы:
      • ТипСобытия (тип: ПеречислениеСсылка.ТипыСобытийСКУД или СправочникСсылка.СобытияСКУД). Это позволит фиксировать, является ли сканирование входом, выходом, входом в определенную зону, выходом на обед и т.д. Если это справочник, мы можем добавить к его элементам дополнительный реквизит, например, ЯвляетсяРабочимВременем (тип: Булево).

    Таким образом, каждая запись в этом регистре будет представлять собой факт сканирования карты доступа сотрудником в определенный момент времени с указанием типа события.

  2. Создание регистра сведений для хранения фактически отработанного времени:

    Этот регистр будет хранить уже рассчитанные данные, что значительно упростит построение отчетов и заполнение табелей. Назовем его, например, ФактическиОтработанноеВремя.

    • Периодичность: В пределах дня.
    • Измерения:
      • Период (тип: Дата). Будет представлять собой день, за который рассчитано время.
      • Сотрудник (тип: СправочникСсылка.Сотрудники).
    • Ресурсы:
      • ОтработанноеВремя (тип: Число, в секундах). Это будет автоматически рассчитанное время на основе данных СКУД.
      • УтвержденноеВремя (тип: Число, в секундах). Этот ресурс будет использоваться для ручной корректировки. Если он заполнен, мы будем использовать его, игнорируя ОтработанноеВремя. Это позволит учесть ситуации, когда сотрудник работал удаленно, забыл пропуск или есть другие договоренности.
      • ВремяНачалаСменыФакт (тип: ДатаВремя). Фактическое время начала смены, определенное по СКУД.
      • ВремяОкончанияСменыФакт (тип: ДатаВремя). Фактическое время окончания смены, определенное по СКУД.
  3. Настройка механизма расчета времени:

    Основные вычисления будут происходить при изменении (записи) регистра ДанныеСистемыКонтроляДоступа. Для этого мы можем использовать подписку на событие ПриЗаписи для данного регистра. В этой подписке будем выполнять следующие действия:

    • Определение времени начала и окончания смены по СКУД:
      • Если есть одно сканирование на вход до начала плановой смены и нет сканирования на выход: Считаем, что сотрудник отработал часов: ВремяОкончанияПлановойСмены - ФактическоеВремяСканированияНаВход. Время начала смены будет равно ФактическоеВремяСканированияНаВход.
      • Если есть одно сканирование на выход (и нет на вход): Считаем, что сотрудник начал работать с НачалаПлановойСмены и до момента ФактическогоУходаСРаботы. То есть: ВремяСканированияНаВыход - ВремяНачалаПлановойСмены. Время окончания смены будет равно ВремяСканированияНаВыход.
      • Если есть сканирование и на вход, и на выход: Просто отнимаем от времени выхода время входа: ВремяСканированияНаВыход - ВремяСканированияНаВход. Время начала и окончания смены будет соответствовать фактическим сканированиям.
      • Учитываем плановое время: Важно иметь доступ к плановому времени начала и окончания смены. Это можно реализовать путем сохранения этих данных в дополнительном регистре сведений, привязанном к сотруднику и дню, или используя механизм ДополнительныхРеквизитов/Сведений для графика, как мы обсуждали ранее.
    • Запись рассчитанных данных в РС.ФактическиОтработанноеВремя: После определения отработанного времени и фактического начала/окончания смены, эти данные записываются в соответствующий регистр.

    Пример псевдокода для обработки данных СКУД (для одного дня и сотрудника):

    
    // Предположим, у нас есть список событий СКУД за день для сотрудника, отсортированный по времени
    // И есть ПлановоеВремяНачалаСмены, ПлановоеВремяОкончанияСмены для этого дня
    
    ВремяВхода = Неопределено;
    ВремяВыхода = Неопределено;
    
    Для Каждого СобытиеСКУД Из СписокСобытийСКУД Цикл
        Если СобытиеСКУД.ТипСобытия = Перечисления.ТипыСобытийСКУД.Вход Тогда
            Если ВремяВхода = Неопределено Или СобытиеСКУД.ДатаВремя < ВремяВхода Тогда
                ВремяВхода = СобытиеСКУД.ДатаВремя;
            КонецЕсли;
        ИначеЕсли СобытиеСКУД.ТипСобытия = Перечисления.ТипыСобытийСКУД.Выход Тогда
            Если ВремяВыхода = Неопределено Или СобытиеСКУД.ДатаВремя > ВремяВыхода Тогда
                ВремяВыхода = СобытиеСКУД.ДатаВремя;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Если ВремяВхода <> Неопределено И ВремяВыхода <> Неопределено Тогда
        // Есть и вход, и выход
        ОтработаноСекунд = ВремяВыхода - ВремяВхода;
        НачалоФактическое = ВремяВхода;
        ОкончаниеФактическое = ВремяВыхода;
    ИначеЕсли ВремяВхода <> Неопределено Тогда
        // Есть только вход (считаем, что работал до конца плановой смены)
        ОтработаноСекунд = КонецДня(ПлановоеВремяОкончанияСмены) - НачалоДня(ВремяВхода); // Или просто ПлановоеВремяОкончанияСмены - ВремяВхода
        НачалоФактическое = ВремяВхода;
        ОкончаниеФактическое = КонецДня(ПлановоеВремяОкончанияСмены);
    ИначеЕсли ВремяВыхода <> Неопределено Тогда
        // Есть только выход (считаем, что начал с начала плановой смены)
        ОтработаноСекунд = КонецДня(ВремяВыхода) - НачалоДня(ПлановоеВремяНачалаСмены);
        НачалоФактическое = НачалоДня(ПлановоеВремяНачалаСмены);
        ОкончаниеФактическое = ВремяВыхода;
    Иначе
        // Нет сканирований
        ОтработаноСекунд = 0;
        НачалоФактическое = Неопределено;
        ОкончаниеФактическое = Неопределено;
    КонецЕсли;
    
    // Записать ОтработаноСекунд, НачалоФактическое, ОкончаниеФактическое в РС.ФактическиОтработанноеВремя
    
  4. Механизм для окладников:

    Для сотрудников с окладной оплатой труда, где достаточно одного сканирования в день (вход или выход), можно использовать более простой подход:

    1. Генерируем типовой табель: Создаем плановый табель на основании установленных графиков.
    2. Сохраняем данные СКУД: Все сканирования записываем в отдельный регистр (как РС.ДанныеСистемыКонтроляДоступа, но можно с меньшей детализацией, например, просто факт присутствия за день).
    3. Сверка и контроль: Создаем обработку или отчет, который будет сверять данные планового табеля с фактическими данными СКУД. В случае расхождений (например, сотрудник не зафиксировал вход/выход, но по графику должен был быть на работе), система сигнализирует табельщицам, которые должны вручную разобраться и при необходимости скорректировать табель.

Решение 3: Использование готовых расширений и специализированных решений

На рынке существуют готовые программные продукты и расширения для 1С, предназначенные для более гибкого учета рабочего времени и интеграции со СКУД. Эти решения могут предоставлять богатый функционал:

Такие решения поставляются как расширения для 1С и не изменяют типовые механизмы, что значительно упрощает поддержку и обновления системы.

Интеграция со СКУД и обработка данных

Независимо от выбранного подхода, интеграция с системой контроля и управления доступом (СКУД) является ключевым элементом для автоматизации учета времени. Она позволяет:

Способы обмена данными:

  1. Импорт файлов: Самый простой способ – выгрузка данных из СКУД в файлы (CSV, Excel) и последующий импорт этих файлов в 1С с помощью специально разработанных обработок.
  2. Автоматическая передача данных через API: Более продвинутый вариант, при котором 1С напрямую обменивается данными со СКУД через программный интерфейс. Это обеспечивает максимальную автоматизацию и оперативность.

После получения данных из СКУД, необходимо настроить обработку, которая будет:

Нюансы и продвинутые возможности

При реализации сложного учета рабочего времени стоит обратить внимание на следующие аспекты:

  1. Суммированный учет рабочего времени: Для сменных графиков, особенно в условиях непрерывного производства, крайне актуален суммированный учет рабочего времени. Он позволяет учитывать отработанные часы за определенный период (месяц, квартал, год) и правильно рассчитывать переработки. Типовые механизмы 1С:ЗУП поддерживают этот вид учета, но для точной привязки к СКУД все равно потребуется доработка.
  2. Гибкий график работы (1С:ЗУП 3.1): В 1С:ЗУП версии 3.1 и выше поддерживается настройка гибких графиков. Это позволяет сотрудникам начинать и заканчивать рабочий день в различное время, при этом сохраняя норму рабочего времени за день, неделю или период. Хотя это не решает проблему точного задания времени в графике, оно может упростить учет для некоторых категорий сотрудников, которым предоставляется свобода в выборе рабочего интервала.
  3. Возможности 1С:ЗУП КОРП: Упомянутая в обсуждении константа ИспользоватьЗарплатаКадрыКорпоративнаяПодсистемы относится к активации функционала версии 1С:ЗУП КОРП. Эта версия предлагает более широкие возможности для управления персоналом, включая расширенную аналитику, функции подбора, оценки, мотивации, обучения, учет охраны труда и соцпакетов. Хотя сама по себе эта версия не дает прямого инструмента для задания времени начала/окончания смены в графике, она может предоставить более гибкие настройки прав доступа и интеграции, которые будут полезны при реализации сложных схем учета рабочего времени. Однако для полноценного использования возможностей КОРП-версии обычно требуется переход на саму КОРП-версию, а не просто активация константы в ПРОФ-версии.

В итоге, хотя типовые конфигурации 1С:ЗУП и 1С:ERP не содержат прямого механизма для указания конкретного времени начала и окончания смены по дням недели, платформа предоставляет широкие возможности для доработки. Мы рассмотрели несколько подходов – от добавления простых реквизитов до создания полноценной подсистемы с регистрами сведений и подписками на события. Выбор конкретного решения будет зависеть от сложности требований, бюджета на доработку и квалификации команды разработчиков.

← На главную