Почему в ЗУП 3.1 некорректно заполняется отработанное время при исправлении документа Отпуск?

Программист 1С:Зарплата и Управление Персоналом Управленческий учет
← На главную

В процессе эксплуатации конфигурации «1С:Зарплата и Управление Персоналом», редакция 3.1 (особенно в релизах ветки 3.1.8 и смежных), многие пользователи сталкиваются с неприятной ситуацией: при создании документа-исправления для отпуска данные в регистре накопления Отработанное время по сотрудникам начинают отображаться некорректно. Это приводит к искажению статистической отчетности (например, формы П-4) и аналитических отчетов по рабочему времени. Рассмотрим подробнее, почему это происходит и как исправить ситуацию.

Суть проблемы: конфликт рабочих и календарных дней

Представим стандартную ситуацию: в прошлом периоде был неверно рассчитан отпуск (например, не доплачена единовременная выплата). Мы создаем документ-исправление. С точки зрения сумм и налогов всё отрабатывает штатно, но при анализе движений регистра Отработанное время по сотрудникам мы видим странную картину. Первоначальный документ зафиксировал, допустим, 10 рабочих дней (по графику сотрудника), а документ-исправление пытается сторнировать 15 дней (полную календарную длительность отпуска). В результате в регистре «повисает» разница в -5 дней, которой там быть не должно.

Разберем, почему программа ведет себя именно так. В ЗУП 3.1 существует два основных способа учета времени в документах отсутствия:

  1. По графику (рабочие дни): этот режим включается автоматически, если в системе на момент проведения отпуска уже зарегистрирован и проведен документ Табель. Программа видит фактическое время и записывает в регистр именно те дни, которые являются рабочими по графику.
  2. По календарным дням: если табеля нет, документ фиксирует общую продолжительность отсутствия.

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

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

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ОтработанноеВремяПоСотрудникам.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТСторнирующиеРегистраторы
ИЗ
    РегистрНакопления.ОтработанноеВремяПоСотрудникам КАК ОтработанноеВремяПоСотрудникам
ГДЕ
    ОтработанноеВремяПоСотрудникам.Период >= &Период
    И ОтработанноеВремяПоСотрудникам.Начисление В(&НачислениеОтпуска)
    И ОтработанноеВремяПоСотрудникам.Сторно
ИНДЕКСИРОВАТЬ ПО
    Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОтработанноеВремяПоСотрудникам.Регистратор КАК Регистратор,
    СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноДней) КАК ОтработаноДней,
    СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноЧасов) КАК ОтработаноЧасов,
    СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоДней) КАК ОплаченоДней,
    СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоЧасов) КАК ОплаченоЧасов
ИЗ
    РегистрНакопления.ОтработанноеВремяПоСотрудникам КАК ОтработанноеВремяПоСотрудникам
ГДЕ
    ОтработанноеВремяПоСотрудникам.Регистратор В
            (ВЫБРАТЬ
                ВТСторнирующиеРегистраторы.Регистратор
            ИЗ
                ВТСторнирующиеРегистраторы)
СГРУППИРОВАТЬ ПО
    ОтработанноеВремяПоСотрудникам.Регистратор
ИМЕЮЩИЕ
    (СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноДней) <> 0
        ИЛИ СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноЧасов) <> 0
        ИЛИ СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоДней) <> 0
        ИЛИ СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоЧасов) <> 0)

Если запрос выдал список документов — значит, ваша база содержит «кашу» в регистре отработанного времени, которую необходимо выправлять.

Способ 1: Временное снятие Табеля с проведения

Это наиболее простой «пользовательский» способ, который помогает заставить систему пересчитать движения в правильном режиме без внесения правок в программный код. Разберем его по шагам:

  1. Найдем документ Табель, который охватывает период исправляемого отпуска.
  2. Снимем этот табель с проведения (отмена проведения).
  3. Откроем наш документ-исправление Отпуск, нажмем кнопку «Пересчитать» и проведем его. В отсутствие табеля система будет использовать единую логику учета времени для сторно и для новых начислений (как правило, по календарным дням).
  4. Снова проведем документ Табель.

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

Способ 2: Программная корректировка движений (Обработка)

Если документов много или снятие табеля невозможно из-за закрытого периода, проанализируем вариант с программным исправлением. Можно создать небольшую внешнюю обработку, которая будет подключаться к документу через механизм «Дополнительные отчеты и обработки».

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

Для этого в обработке используется следующий алгоритм:

  1. Прочитать движения регистра по текущему регистратору.
  2. Найти строки с признаком Сторно = Истина.
  3. Найти строки без признака сторно.
  4. Заменить значения ресурсов ОтработаноДней, ОтработаноЧасов и ОплаченоДней в сторнирующих записях на те значения, которые были в исходном документе.
  5. Записать набор записей.

Рекомендации по обновлению

Выясним причину, почему данная проблема была столь массовой. Это официально признанный баг компании 1С, который возникал из-за несовершенства механизмов распределения времени при наличии Табеля. В современных релизах (начиная с 3.1.10.Х и выше) алгоритмы формирования движений в регистре ОтработанноеВремяПоСотрудникам были переработаны.

Если вы всё еще работаете на старых версиях (например, 3.1.8), настоятельно рекомендуем запланировать обновление. В новых релизах система жестко связывает сторно-записи с движениями исправляемого документа, что исключает возникновение разницы в единицах измерения времени (когда сторнируются календарные дни вместо рабочих).

Резюме: столкнувшись с лишними днями в анализе зарплаты после исправления отпуска, первым делом проверьте наличие табеля в периоде. Используйте метод временной отмены проведения табеля или воспользуйтесь расширением/обработкой для выравнивания регистра. Но лучшим долгосрочным решением остается переход на актуальный релиз программы.

← На главную