При проектировании подсистем учета рабочего времени в платформе «1С:Предприятие 8» разработчики часто сталкиваются с дилеммой: какой объект метаданных выбрать для хранения данных о загрузке сотрудников? С одной стороны, регистр сведений (РС) кажется простым и интуитивно понятным решением для фиксации ежедневных событий. С другой стороны, регистр накопления (РН) предоставляет мощные механизмы агрегации показателей. Выясним причину дискуссий, проанализируем обе архитектурные модели, разберем их плюсы и минусы, а также рассмотрим лучшие практики, применяемые в типовых конфигурациях фирмы «1С».
Прежде чем перейти к выбору конкретного объекта метаданных, сформулируем ключевые требования к разрабатываемому функционалу:
Регистр сведений традиционно используется для хранения условно-постоянной информации, настроек, курсов валют, цен или состояний объектов. Однако его также можно применить для фиксации рабочего времени.
Рассмотрим подробнее специфику проектирования такого регистра. Важнейший нюанс заключается в выборе периодичности. Использование периодического регистра сведений для учета времени в большинстве случаев является архитектурной ошибкой. Периодический РС ориентирован на получение среза последних данных на определенный момент времени (например, актуальный оклад или должность сотрудника). В нашей задаче срез последних не требуется, так как нам нужны все записи за период, а не только последняя.
Поэтому правильным решением будет использование непериодического независимого регистра сведений. В такой структуре дата работы выносится в качестве одного из ключевых измерений. Структура регистра будет выглядеть следующим образом:
Сотрудник (СправочникСсылка.Сотрудники), Дата (Дата, без времени), Проект / Задача (при необходимости).Часы (Число), ВидВремени (СправочникСсылка.ВидыИспользованияРабочегоВремени).Преимущества использования регистра сведений:
Недостатки использования регистра сведений:
НомерСтроки или Задача), иначе платформа выдаст ошибку неуникальности записи.Регистр накопления с видом «Обороты» специально создан для учета величин, которые накапливаются и суммируются со временем (продажи, затраты, рабочее время). В отличие от остаточных регистров, оборотные регистры хранят только движения и агрегированные итоги по ним.
Проанализируем структуру оборотного регистра накопления:
Сотрудник, ВидВремени, Проект.Часы.Преимущества использования регистра накопления:
Обороты.Недостатки использования регистра накопления:
В тиражных решениях уровня «1С:ЗУП» или «1С:ERP» фирма «1С» использует комбинированную (гибридную) схему. Разберем по шагам, как устроена эта архитектура:
Шаг 1. Хранение нормы (планового времени)
Нормативные графики работы сотрудников редко меняются задним числом, а данные по ним нужны посуточно. Для хранения этой информации идеально подходит независимый непериодический регистр сведений (например, ГрафикиРаботыПоВидамВремени). Измерениями выступают ГрафикРаботы (или Сотрудник) и Дата, а ресурсом — Часы. Это позволяет быстро получать норму времени на любой день для сравнения с фактом.
Шаг 2. Хранение факта (отработанного времени)
Фактически отработанное время фиксируется документами («Табель», «Ежедневный отчет») и записывается в оборотный регистр накопления (например, ДанныеТабельногоУчетаРабочегоВремениСотрудников). Это обеспечивает высокую скорость построения сводной отчетности по отработанным часам за любые периоды.
Шаг 3. Сопоставление данных в отчете
Для выявления перегрузок и недогрузок («норма/факт») в отчете СКД выполняется левое соединение таблицы плановых данных из регистра сведений и таблицы фактических данных из виртуальной таблицы оборотов регистра накопления.
Если данные о рабочем времени должны автоматически загружаться из систем контроля и управления доступом (СКУД), напрямую писать транзакции проходов в регистр накопления нельзя. Логика интеграции должна строиться следующим образом:
СобытияДоступаСКУД. Измерения: Сотрудник, ДатаВремяСобытия (тип Дата, включает время), ТочкаДоступа. Ресурсы: Направление (Вход / Выход). Время события обязательно должно быть измерением, чтобы избежать перезаписи при повторных прикладываниях карты в одну и ту же секунду.Рассмотрим пример создания структуры для решения задачи автора. Создадим два объекта:
ПлановыеГрафикиРаботы (непериодический, независимый). Измерения: Сотрудник, Дата. Ресурсы: ЧасыНорма.ОтработанноеВремя (вид движения: Обороты). Измерения: Сотрудник. Ресурсы: ЧасыФакт.Посмотрим на пример запроса, который собирает данные за произвольный период и рассчитывает показатели «Норма», «Факт» и «Отклонение» (загружен/недогружен) посуточно:
ВЫБРАТЬ
Графики.Сотрудник КАК Сотрудник,
Графики.Дата КАК ПериодДень,
ЕСТЬNULL(Графики.ЧасыНорма, 0) КАК ЧасыНорма,
ЕСТЬNULL(ФактическиеОбороты.ЧасыФактОборот, 0) КАК ЧасыФакт,
ЕСТЬNULL(ФактическиеОбороты.ЧасыФактОборот, 0) - ЕСТЬNULL(Графики.ЧасыНорма, 0) КАК Отклонение,
ВЫБОР
КОГДА ЕСТЬNULL(ФактическиеОбороты.ЧасыFactОборот, 0) > ЕСТЬNULL(Графики.ЧасыНорма, 0) ТАКГДА "Перегружен"
КОГДА ЕСТЬNULL(ФактическиеОбороты.ЧасыFactОборот, 0) < ЕСТЬNULL(Графики.ЧасыНорма, 0) ТАКГДА "Недогружен"
ИНАЧЕ "Норма"
КОНЕЦ КАК СтатусЗагрузки
ИЗ
РегистрСведений.ПлановыеГрафикиРаботы КАК Графики
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремя.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ФактическиеОбороты
ПО Графики.Сотрудник = ФактическиеОбороты.Сотрудник
И Графики.Дата = ФактическиеОбороты.Период
В данном запросе мы использовали периодичность День для виртуальной таблицы оборотов регистра накопления. Это позволяет сопоставить каждую дату из планового графика с фактическими часами за этот же день. При выводе в отчет СКД пользователь сможет легко свернуть эти данные до уровня недели или месяца, при этом группировки будут рассчитываться быстро и корректно.
Подводя итог обсуждению, дадим финальные рекомендации по выбору регистра для учета рабочего времени: