При работе с системами 1С:Зарплата и Управление Персоналом (ЗУП) и 1С:ERP Управление предприятием часто возникает потребность в детализированном учете рабочего времени сотрудников, включая точное время начала и окончания смены по дням недели. Это особенно актуально для организаций с почасовой оплатой труда, сменными графиками или непрерывным производством, а также при интеграции с системами контроля и управления доступом (СКУД). Однако, как показывает практика, типовой функционал 1С:ЗУП и 1С:ERP не предоставляет прямого инструмента для установки конкретного времени начала и окончания смены в стандартных графиках работы. Это означает, что для решения подобной задачи нам потребуется прибегнуть к кастомизации системы.
Прежде чем мы перейдем к решениям, давайте кратко рассмотрим, какой функционал для учета рабочего времени доступен в типовых конфигурациях и почему его недостаточно для нашей задачи.
Ни один из этих методов в типовом виде не предусматривает автоматического определения точного времени начала/окончания смены на основе внешних данных или жесткой привязки к графику.
Таким образом, для реализации задачи по учету конкретного времени начала и окончания смены, особенно в связке со СКУД, нам потребуется доработка системы.
Поскольку типового функционала для прямого указания времени начала и окончания смены нет, мы будем рассматривать варианты доработки системы, используя механизмы платформы 1С:Предприятие.
Одним из относительно простых способов расширить функционал является добавление новых реквизитов в существующие объекты конфигурации. Рассмотрим два похожих подхода:
Добавление реквизита в табличную часть "Виды времени" справочника "Графики работы сотрудников":
Мы можем модифицировать справочник Графики работы сотрудников, добавив в его табличную часть, отвечающую за виды времени по дням, новые колонки для указания времени начала и окончания. Например, можно добавить реквизиты:
ВремяНачалаСмены (тип данных: Время)ВремяОкончанияСмены (тип данных: Время)Таким образом, для каждого дня цикла графика и для каждого вида времени (основная работа, вечерняя, ночная) мы сможем явно установить это время. Это позволяет задавать не только общую продолжительность, но и конкретные временные рамки. Например, для «Основной работы» в понедельник – с 08:00 до 17:00, для «Вечерней» – с 17:00 до 22:00.
Преимущества: Универсальность, позволяет гибко задавать время для разных видов работ. Интуитивно понятно, так как привязано к существующим графикам.
Недостатки: Требует изменения типовой конфигурации, что может усложнить обновления. Лучше реализовывать через расширения.
Использование дополнительных реквизитов или дополнительных сведений:
Платформа 1С предоставляет механизм для добавления дополнительных реквизитов (для справочников и документов) и дополнительных сведений (для объектов, не являющихся справочниками или документами, или для хранения более сложных структур). Мы можем добавить такие реквизиты к объекту Сотрудник или к элементу справочника ГрафикиРаботыСотрудников.
Например, можно создать дополнительные реквизиты для справочника ГрафикиРаботыСотрудников:
ВремяНачалаСменыПонедельник (тип: Время)ВремяОкончанияСменыПонедельник (тип: Время)Или же использовать механизм дополнительных сведений, который более гибок и позволяет хранить данные в отдельном регистре, не модифицируя структуру основного объекта напрямую.
Преимущества: Механизм дополнительных реквизитов/сведений менее инвазивен, чем прямое изменение метаданных, и поддерживается типовой конфигурацией, что упрощает обновления. Позволяет хранить информацию о начале/окончании смены для различных сущностей (для компании в целом, для отделов, для отдельных сотрудников).
Недостатки: Может быть менее удобно для ввода, если графики сильно меняются и нужно задавать время для каждого дня цикла, а не только для общего графика.
Этот подход является наиболее универсальным и мощным, особенно при интеграции со СКУД. Он предполагает создание нескольких собственных регистров сведений и настройку логики их заполнения и обработки.
Рассмотрим по шагам, как это можно реализовать:
Создание регистра сведений для хранения учетных данных СКУД:
Нам потребуется регистр, который будет принимать все данные из системы контроля доступа. Назовем его, например, ДанныеСистемыКонтроляДоступа. Мы рекомендуем следующие параметры:
Сотрудник (тип: СправочникСсылка.Сотрудники).ДатаВремяСобытия (тип: ДатаВремя).ТипСобытия (тип: ПеречислениеСсылка.ТипыСобытийСКУД или СправочникСсылка.СобытияСКУД). Это позволит фиксировать, является ли сканирование входом, выходом, входом в определенную зону, выходом на обед и т.д. Если это справочник, мы можем добавить к его элементам дополнительный реквизит, например, ЯвляетсяРабочимВременем (тип: Булево).Таким образом, каждая запись в этом регистре будет представлять собой факт сканирования карты доступа сотрудником в определенный момент времени с указанием типа события.
Создание регистра сведений для хранения фактически отработанного времени:
Этот регистр будет хранить уже рассчитанные данные, что значительно упростит построение отчетов и заполнение табелей. Назовем его, например, ФактическиОтработанноеВремя.
Период (тип: Дата). Будет представлять собой день, за который рассчитано время.Сотрудник (тип: СправочникСсылка.Сотрудники).ОтработанноеВремя (тип: Число, в секундах). Это будет автоматически рассчитанное время на основе данных СКУД.УтвержденноеВремя (тип: Число, в секундах). Этот ресурс будет использоваться для ручной корректировки. Если он заполнен, мы будем использовать его, игнорируя ОтработанноеВремя. Это позволит учесть ситуации, когда сотрудник работал удаленно, забыл пропуск или есть другие договоренности.ВремяНачалаСменыФакт (тип: ДатаВремя). Фактическое время начала смены, определенное по СКУД.ВремяОкончанияСменыФакт (тип: ДатаВремя). Фактическое время окончания смены, определенное по СКУД.Настройка механизма расчета времени:
Основные вычисления будут происходить при изменении (записи) регистра ДанныеСистемыКонтроляДоступа. Для этого мы можем использовать подписку на событие ПриЗаписи для данного регистра. В этой подписке будем выполнять следующие действия:
ВремяОкончанияПлановойСмены - ФактическоеВремяСканированияНаВход. Время начала смены будет равно ФактическоеВремяСканированияНаВход.НачалаПлановойСмены и до момента ФактическогоУходаСРаботы. То есть: ВремяСканированияНаВыход - ВремяНачалаПлановойСмены. Время окончания смены будет равно ВремяСканированияНаВыход.ВремяСканированияНаВыход - ВремяСканированияНаВход. Время начала и окончания смены будет соответствовать фактическим сканированиям.ДополнительныхРеквизитов/Сведений для графика, как мы обсуждали ранее.РС.ФактическиОтработанноеВремя: После определения отработанного времени и фактического начала/окончания смены, эти данные записываются в соответствующий регистр.Пример псевдокода для обработки данных СКУД (для одного дня и сотрудника):
// Предположим, у нас есть список событий СКУД за день для сотрудника, отсортированный по времени
// И есть ПлановоеВремяНачалаСмены, ПлановоеВремяОкончанияСмены для этого дня
ВремяВхода = Неопределено;
ВремяВыхода = Неопределено;
Для Каждого СобытиеСКУД Из СписокСобытийСКУД Цикл
Если СобытиеСКУД.ТипСобытия = Перечисления.ТипыСобытийСКУД.Вход Тогда
Если ВремяВхода = Неопределено Или СобытиеСКУД.ДатаВремя < ВремяВхода Тогда
ВремяВхода = СобытиеСКУД.ДатаВремя;
КонецЕсли;
ИначеЕсли СобытиеСКУД.ТипСобытия = Перечисления.ТипыСобытийСКУД.Выход Тогда
Если ВремяВыхода = Неопределено Или СобытиеСКУД.ДатаВремя > ВремяВыхода Тогда
ВремяВыхода = СобытиеСКУД.ДатаВремя;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ВремяВхода <> Неопределено И ВремяВыхода <> Неопределено Тогда
// Есть и вход, и выход
ОтработаноСекунд = ВремяВыхода - ВремяВхода;
НачалоФактическое = ВремяВхода;
ОкончаниеФактическое = ВремяВыхода;
ИначеЕсли ВремяВхода <> Неопределено Тогда
// Есть только вход (считаем, что работал до конца плановой смены)
ОтработаноСекунд = КонецДня(ПлановоеВремяОкончанияСмены) - НачалоДня(ВремяВхода); // Или просто ПлановоеВремяОкончанияСмены - ВремяВхода
НачалоФактическое = ВремяВхода;
ОкончаниеФактическое = КонецДня(ПлановоеВремяОкончанияСмены);
ИначеЕсли ВремяВыхода <> Неопределено Тогда
// Есть только выход (считаем, что начал с начала плановой смены)
ОтработаноСекунд = КонецДня(ВремяВыхода) - НачалоДня(ПлановоеВремяНачалаСмены);
НачалоФактическое = НачалоДня(ПлановоеВремяНачалаСмены);
ОкончаниеФактическое = ВремяВыхода;
Иначе
// Нет сканирований
ОтработаноСекунд = 0;
НачалоФактическое = Неопределено;
ОкончаниеФактическое = Неопределено;
КонецЕсли;
// Записать ОтработаноСекунд, НачалоФактическое, ОкончаниеФактическое в РС.ФактическиОтработанноеВремя
Механизм для окладников:
Для сотрудников с окладной оплатой труда, где достаточно одного сканирования в день (вход или выход), можно использовать более простой подход:
РС.ДанныеСистемыКонтроляДоступа, но можно с меньшей детализацией, например, просто факт присутствия за день).На рынке существуют готовые программные продукты и расширения для 1С, предназначенные для более гибкого учета рабочего времени и интеграции со СКУД. Эти решения могут предоставлять богатый функционал:
Такие решения поставляются как расширения для 1С и не изменяют типовые механизмы, что значительно упрощает поддержку и обновления системы.
Независимо от выбранного подхода, интеграция с системой контроля и управления доступом (СКУД) является ключевым элементом для автоматизации учета времени. Она позволяет:
Способы обмена данными:
После получения данных из СКУД, необходимо настроить обработку, которая будет:
Табель учета рабочего времени.При реализации сложного учета рабочего времени стоит обратить внимание на следующие аспекты:
ИспользоватьЗарплатаКадрыКорпоративнаяПодсистемы относится к активации функционала версии 1С:ЗУП КОРП. Эта версия предлагает более широкие возможности для управления персоналом, включая расширенную аналитику, функции подбора, оценки, мотивации, обучения, учет охраны труда и соцпакетов. Хотя сама по себе эта версия не дает прямого инструмента для задания времени начала/окончания смены в графике, она может предоставить более гибкие настройки прав доступа и интеграции, которые будут полезны при реализации сложных схем учета рабочего времени. Однако для полноценного использования возможностей КОРП-версии обычно требуется переход на саму КОРП-версию, а не просто активация константы в ПРОФ-версии.В итоге, хотя типовые конфигурации 1С:ЗУП и 1С:ERP не содержат прямого механизма для указания конкретного времени начала и окончания смены по дням недели, платформа предоставляет широкие возможности для доработки. Мы рассмотрели несколько подходов – от добавления простых реквизитов до создания полноценной подсистемы с регистрами сведений и подписками на события. Выбор конкретного решения будет зависеть от сложности требований, бюджета на доработку и квалификации команды разработчиков.