Какой регистр использовать для учета времени работы сотрудника: регистр сведений или регистр накопления?

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

При проектировании подсистем учета рабочего времени в платформе «1С:Предприятие 8» разработчики часто сталкиваются с дилеммой: какой объект метаданных выбрать для хранения данных о загрузке сотрудников? С одной стороны, регистр сведений (РС) кажется простым и интуитивно понятным решением для фиксации ежедневных событий. С другой стороны, регистр накопления (РН) предоставляет мощные механизмы агрегации показателей. Выясним причину дискуссий, проанализируем обе архитектурные модели, разберем их плюсы и минусы, а также рассмотрим лучшие практики, применяемые в типовых конфигурациях фирмы «1С».

Постановка задачи и требования к системе

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

  1. Детализация (разрезы учета): Возможность видеть загрузку сотрудников в разрезе каждого дня для оперативного анализа.
  2. Агрегация (анализ за период): Возможность понедельного или помесячного анализа для выявления перегруженных или недогруженных сотрудников.
  3. Производительность: Быстрое построение отчетов при росте объема данных (штат от 100 до 10 000+ сотрудников).
  4. Масштабируемость: Возможность дальнейшего расширения аналитики (учет в разрезе проектов, задач, видов деятельности или интеграция со СКУД).

Вариант 1: Использование регистра сведений (РС)

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

Рассмотрим подробнее специфику проектирования такого регистра. Важнейший нюанс заключается в выборе периодичности. Использование периодического регистра сведений для учета времени в большинстве случаев является архитектурной ошибкой. Периодический РС ориентирован на получение среза последних данных на определенный момент времени (например, актуальный оклад или должность сотрудника). В нашей задаче срез последних не требуется, так как нам нужны все записи за период, а не только последняя.

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

Преимущества использования регистра сведений:

  1. Простота и гибкость структуры: В регистр сведений легко вносить изменения, добавлять новые нечисловые ресурсы (например, текстовое описание проделанной работы, статус задачи или ссылку на документ-источник).
  2. Быстрая запись единичных движений: Независимый регистр сведений записывается напрямую в базу данных без дополнительных расчетов на стороне СУБД, что делает операцию записи очень быстрой.
  3. Отсутствие избыточности: РС не создает скрытых таблиц итогов, которые требуют периодического пересчета.

Недостатки использования регистра сведений:

  1. Отсутствие встроенной агрегации: Время — это классическая аддитивная (суммируемая) величина. Для получения общего объема часов за неделю, месяц или год СУБД будет вынуждена сканировать и суммировать все детальные записи из физической таблицы регистра за указанный период. При миллионах записей отчеты начнут работать крайне медленно.
  2. Сложность контроля уникальности: Уникальность записей в регистре сведений контролируется платформой по набору измерений. Если сотруднику нужно зафиксировать работу по нескольким задачам за один день, придется вводить дополнительное измерение (например, НомерСтроки или Задача), иначе платформа выдаст ошибку неуникальности записи.

Вариант 2: Использование регистра накопления оборотов (РН)

Регистр накопления с видом «Обороты» специально создан для учета величин, которые накапливаются и суммируются со временем (продажи, затраты, рабочее время). В отличие от остаточных регистров, оборотные регистры хранят только движения и агрегированные итоги по ним.

Проанализируем структуру оборотного регистра накопления:

Преимущества использования регистра накопления:

  1. Автоматический расчет и хранение итогов: Платформа «1С:Предприятие» автоматически создает и поддерживает физическую таблицу итогов (обычно с периодичностью «Месяц»). Это позволяет мгновенно получать консолидированные отчеты за квартал или год через обращение к виртуальной таблице Обороты.
  2. Использование виртуальных таблиц: Платформа берет на себя оптимизацию SQL-запросов к виртуальной таблице оборотов, что существенно упрощает разработку отчетов на СКД.
  3. Отсутствие жестких ограничений на уникальность: В отличие от регистра сведений, в регистр накопления можно делать сколько угодно записей с одинаковыми измерениями (например, фиксировать трудозатраты по 15 минут в течение дня по одной и той же задаче) — платформа просто просуммирует их.

Недостатки использования регистра накопления:

  1. Нюансы производительности при детальных запросах: Как справедливо отмечают эксперты, если отчеты будут строиться в разрезе дней или недель, виртуальная таблица оборотов не сможет использовать стандартные месячные итоги. СУБД все равно будет обращаться к таблице движений и рассчитывать данные «на лету». Однако за счет оптимизированных индексов таблицы движений РН этот процесс обычно происходит быстрее, чем в РС.
  2. Сложность хранения нечисловых данных: В регистр накопления нельзя поместить произвольные текстовые комментарии или статусы в ресурсы — все ресурсы должны быть строго числовыми.

Архитектурный стандарт «1С»: Гибридный подход (Норма vs Факт)

В тиражных решениях уровня «1С:ЗУП» или «1С:ERP» фирма «1С» использует комбинированную (гибридную) схему. Разберем по шагам, как устроена эта архитектура:

Шаг 1. Хранение нормы (планового времени)

Нормативные графики работы сотрудников редко меняются задним числом, а данные по ним нужны посуточно. Для хранения этой информации идеально подходит независимый непериодический регистр сведений (например, ГрафикиРаботыПоВидамВремени). Измерениями выступают ГрафикРаботы (или Сотрудник) и Дата, а ресурсом — Часы. Это позволяет быстро получать норму времени на любой день для сравнения с фактом.

Шаг 2. Хранение факта (отработанного времени)

Фактически отработанное время фиксируется документами («Табель», «Ежедневный отчет») и записывается в оборотный регистр накопления (например, ДанныеТабельногоУчетаРабочегоВремениСотрудников). Это обеспечивает высокую скорость построения сводной отчетности по отработанным часам за любые периоды.

Шаг 3. Сопоставление данных в отчете

Для выявления перегрузок и недогрузок («норма/факт») в отчете СКД выполняется левое соединение таблицы плановых данных из регистра сведений и таблицы фактических данных из виртуальной таблицы оборотов регистра накопления.

Особый случай: Интеграция со СКУД (турникеты, биометрия)

Если данные о рабочем времени должны автоматически загружаться из систем контроля и управления доступом (СКУД), напрямую писать транзакции проходов в регистр накопления нельзя. Логика интеграции должна строиться следующим образом:

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

Практический пример реализации

Рассмотрим пример создания структуры для решения задачи автора. Создадим два объекта:

  1. Регистр сведений ПлановыеГрафикиРаботы (непериодический, независимый). Измерения: Сотрудник, Дата. Ресурсы: ЧасыНорма.
  2. Регистр накопления ОтработанноеВремя (вид движения: Обороты). Измерения: Сотрудник. Ресурсы: ЧасыФакт.

Посмотрим на пример запроса, который собирает данные за произвольный период и рассчитывает показатели «Норма», «Факт» и «Отклонение» (загружен/недогружен) посуточно:


ВЫБРАТЬ
    Графики.Сотрудник КАК Сотрудник,
    Графики.Дата КАК ПериодДень,
    ЕСТЬNULL(Графики.ЧасыНорма, 0) КАК ЧасыНорма,
    ЕСТЬNULL(ФактическиеОбороты.ЧасыФактОборот, 0) КАК ЧасыФакт,
    ЕСТЬNULL(ФактическиеОбороты.ЧасыФактОборот, 0) - ЕСТЬNULL(Графики.ЧасыНорма, 0) КАК Отклонение,
    ВЫБОР
        КОГДА ЕСТЬNULL(ФактическиеОбороты.ЧасыFactОборот, 0) > ЕСТЬNULL(Графики.ЧасыНорма, 0) ТАКГДА "Перегружен"
        КОГДА ЕСТЬNULL(ФактическиеОбороты.ЧасыFactОборот, 0) < ЕСТЬNULL(Графики.ЧасыНорма, 0) ТАКГДА "Недогружен"
        ИНАЧЕ "Норма"
    КОНЕЦ КАК СтатусЗагрузки
ИЗ
    РегистрСведений.ПлановыеГрафикиРаботы КАК Графики
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремя.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ФактическиеОбороты
        ПО Графики.Сотрудник = ФактическиеОбороты.Сотрудник
        И Графики.Дата = ФактическиеОбороты.Период

В данном запросе мы использовали периодичность День для виртуальной таблицы оборотов регистра накопления. Это позволяет сопоставить каждую дату из планового графика с фактическими часами за этот же день. При выводе в отчет СКД пользователь сможет легко свернуть эти данные до уровня недели или месяца, при этом группировки будут рассчитываться быстро и корректно.

Резюме и рекомендации

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

← На главную