Часто разработчики и аналитики сталкиваются с неочевидным поведением системы 1С:Зарплата и Управление Персоналом (ЗУП 3.1) при анализе отработанного времени сотрудников. Проанализируем типичную ситуацию: сотрудник увольняется в середине месяца (например, 14 января). Кадровый документ проведен, однако если мы посмотрим в регистр сведений ГрафикиРаботыПоВидамВремени, то увидим, что до конца января у этого сотрудника проставлен вид учета времени «Явка». Из-за этого самописные отчеты, берущие данные напрямую из этого регистра, начинают показывать некорректно завышенное отработанное время.
Разберем по шагам, почему так происходит, какими документами формируются записи и как правильно построить алгоритм вычисления фактически отработанных часов.
Для начала выясним причину такого поведения базы. Ошибка кроется в неверном понимании функции самого регистра. Данный регистр носит смешанный характер и его основная цель — обеспечивать готовыми данными подсистему расчета зарплаты.
С одной стороны, он хранит эталонные (плановые) графики работы, выступая как базовая нормативно-справочная информация. С другой стороны, в него записывается фактический график сотрудника при окончательном расчете зарплаты, но лишь в том случае, если у человека были специфические отклонения от нормы или индивидуальные настройки. По сути, в нем лежит заложенная норма (план) на месяц, а не окончательный факт работы.
Рассмотрим подробнее механизм появления записей. Записи не всегда привязываются к конкретному человеку. Их можно разделить на два типа:
ГрафикиРаботыСотрудников. Эти данные формируются автоматически в момент проведения (или записи) самого элемента справочника. Это чистая норма времени.НачислениеЗарплатыИВзносов или документа Табель. Программа генерирует их не для всех подряд, а только для тех, чьи уточненные данные о времени требуются механизму расчета именно в этот момент (например, при индивидуальных графиках).Теперь ответим на главный вопрос: почему записи не прерываются 14 января? Кадровые документы-отклонения, такие как «Увольнение», «Отпуск» или «Больничный лист», не делают никаких движений по регистру ГрафикиРаботыПоВидамВремени.
При расчете фактического времени программа математически накладывает плановый график из регистра графиков на фактические состояния сотрудника. Состояния берутся из других регистров, таких как СостоянияСотрудников и ДанныеСостоянийСотрудников. Когда сотрудник увольняется, в регистр состояний пишется статус «Увольнение» с даты, следующей за датой увольнения. Наличие плановых «явок» в регистре графиков после этой даты — это нормальное архитектурное поведение программы. Пытаться править эти записи вручную бессмысленно и даже вредно: это приведет к ошибкам при будущих перерасчетах.
Если перед вами стоит задача разработать или исправить отчет об отработанном времени, строить его напрямую по таблице ГрафикиРаботыПоВидамВремени — это изначально ошибочный подход. В нем лежат промежуточные технические и плановые данные. Рассмотрим правильные пути решения.
Вариант 1: Использование типовых отчетов (для пользователей)
В пользовательском режиме лучше всего донастраивать типовые отчеты. Воспользуйтесь отчетами «Табель (Т-13)», «Потери рабочего времени» или «Полный свод начислений». В них уже зашита вся сложная математика ЗУП по вычислению времени.
Вариант 2: Использование регистра табельного учета (для разработчиков)
Если на предприятии жестко регламентировано ведение табелей и регулярно вводятся документы Табель, то надежнее всего брать фактические данные из регистра накопления ДанныеТабельногоУчетаРабочегоВремени. Он содержит уже рассчитанный и утвержденный факт.
Вариант 3: Использование программных интерфейсов 1С (для разработчиков)
Если вам нужно динамически собрать факт, учитывая увольнения, отпуска и больничные, следует использовать специализированные общие модули и виртуальные таблицы. В конфигурации 1С:ЗУП 3.1 для этого предусмотрен программный интерфейс.
Посмотрим на пример. Вам необходимо использовать функционал модуля УчетРабочегоВремениРасширенный. В нем есть экспортные процедуры, например:
// Примерный вызов формирования ВТ с данными времени
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(
МенеджерВременныхТаблиц,
ПараметрыПостроения
);
Этот алгоритм «под капотом» сам собирает норму времени по плановому графику, затем обращается к регистрам СостоянияСотрудников, вычитает из нормы все зарегистрированные кадровые отклонения и увольнения, и выдает на выходе математически точный итог фактически отработанного времени. Именно этот подход гарантирует, что уволенный 14 января сотрудник не получит рабочих часов в конце месяца, а ваш отчет будет формироваться абсолютно корректно.