В процессе эксплуатации конфигурации «1С:Зарплата и Управление Персоналом», редакция 3.1 (особенно в релизах ветки 3.1.8 и смежных), многие пользователи сталкиваются с неприятной ситуацией: при создании документа-исправления для отпуска данные в регистре накопления Отработанное время по сотрудникам начинают отображаться некорректно. Это приводит к искажению статистической отчетности (например, формы П-4) и аналитических отчетов по рабочему времени. Рассмотрим подробнее, почему это происходит и как исправить ситуацию.
Представим стандартную ситуацию: в прошлом периоде был неверно рассчитан отпуск (например, не доплачена единовременная выплата). Мы создаем документ-исправление. С точки зрения сумм и налогов всё отрабатывает штатно, но при анализе движений регистра Отработанное время по сотрудникам мы видим странную картину. Первоначальный документ зафиксировал, допустим, 10 рабочих дней (по графику сотрудника), а документ-исправление пытается сторнировать 15 дней (полную календарную длительность отпуска). В результате в регистре «повисает» разница в -5 дней, которой там быть не должно.
Разберем, почему программа ведет себя именно так. В ЗУП 3.1 существует два основных способа учета времени в документах отсутствия:
Табель. Программа видит фактическое время и записывает в регистр именно те дни, которые являются рабочими по графику.Проблема заключается в «забывчивости» алгоритма документа-исправления: он не всегда корректно определяет, в каком режиме (рабочие или календарные дни) работал исходный документ, и выполняет сторно по календарным дням, даже если исходник двигал только рабочие смены.
Чтобы понять масштаб бедствия в вашей информационной базе, проанализируем состояние регистра накопления с помощью технического запроса. Этот запрос поможет найти все регистраторы, у которых сумма сторнирующих и новых записей не дает нулевой остаток по дням и часам в рамках одного периода действия.
ВЫБРАТЬ РАЗЛИЧНЫЕ
ОтработанноеВремяПоСотрудникам.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТСторнирующиеРегистраторы
ИЗ
РегистрНакопления.ОтработанноеВремяПоСотрудникам КАК ОтработанноеВремяПоСотрудникам
ГДЕ
ОтработанноеВремяПоСотрудникам.Период >= &Период
И ОтработанноеВремяПоСотрудникам.Начисление В(&НачислениеОтпуска)
И ОтработанноеВремяПоСотрудникам.Сторно
ИНДЕКСИРОВАТЬ ПО
Регистратор
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОтработанноеВремяПоСотрудникам.Регистратор КАК Регистратор,
СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноДней) КАК ОтработаноДней,
СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноЧасов) КАК ОтработаноЧасов,
СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоДней) КАК ОплаченоДней,
СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоЧасов) КАК ОплаченоЧасов
ИЗ
РегистрНакопления.ОтработанноеВремяПоСотрудникам КАК ОтработанноеВремяПоСотрудникам
ГДЕ
ОтработанноеВремяПоСотрудникам.Регистратор В
(ВЫБРАТЬ
ВТСторнирующиеРегистраторы.Регистратор
ИЗ
ВТСторнирующиеРегистраторы)
СГРУППИРОВАТЬ ПО
ОтработанноеВремяПоСотрудникам.Регистратор
ИМЕЮЩИЕ
(СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноДней) <> 0
ИЛИ СУММА(ОтработанноеВремяПоСотрудникам.ОтработаноЧасов) <> 0
ИЛИ СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоДней) <> 0
ИЛИ СУММА(ОтработанноеВремяПоСотрудникам.ОплаченоЧасов) <> 0)
Если запрос выдал список документов — значит, ваша база содержит «кашу» в регистре отработанного времени, которую необходимо выправлять.
Это наиболее простой «пользовательский» способ, который помогает заставить систему пересчитать движения в правильном режиме без внесения правок в программный код. Разберем его по шагам:
Табель, который охватывает период исправляемого отпуска.Отпуск, нажмем кнопку «Пересчитать» и проведем его. В отсутствие табеля система будет использовать единую логику учета времени для сторно и для новых начислений (как правило, по календарным дням).Табель.Важно: этот метод может потребовать перепроведения цепочки начислений зарплаты, если табель влияет на расчет сумм, поэтому выполняйте его аккуратно и желательно сначала на копии базы.
Если документов много или снятие табеля невозможно из-за закрытого периода, проанализируем вариант с программным исправлением. Можно создать небольшую внешнюю обработку, которая будет подключаться к документу через механизм «Дополнительные отчеты и обработки».
Суть работы обработки заключается в том, чтобы после записи документа Отпуск программно вмешаться в набор записей регистра накопления Отработанное время по сотрудникам. Нам нужно принудительно уравнять количество сторнируемых дней с количеством дней в исходном (исправляемом) документе.
Для этого в обработке используется следующий алгоритм:
Сторно = Истина.ОтработаноДней, ОтработаноЧасов и ОплаченоДней в сторнирующих записях на те значения, которые были в исходном документе.Выясним причину, почему данная проблема была столь массовой. Это официально признанный баг компании 1С, который возникал из-за несовершенства механизмов распределения времени при наличии Табеля. В современных релизах (начиная с 3.1.10.Х и выше) алгоритмы формирования движений в регистре ОтработанноеВремяПоСотрудникам были переработаны.
Если вы всё еще работаете на старых версиях (например, 3.1.8), настоятельно рекомендуем запланировать обновление. В новых релизах система жестко связывает сторно-записи с движениями исправляемого документа, что исключает возникновение разницы в единицах измерения времени (когда сторнируются календарные дни вместо рабочих).
Резюме: столкнувшись с лишними днями в анализе зарплаты после исправления отпуска, первым делом проверьте наличие табеля в периоде. Используйте метод временной отмены проведения табеля или воспользуйтесь расширением/обработкой для выравнивания регистра. Но лучшим долгосрочным решением остается переход на актуальный релиз программы.