При активном ведении кадрового учета в программе 1С:Зарплата и управление персоналом 3.1 (ЗУП) пользователи часто сталкиваются с неприятной ситуацией. Бухгалтер или кадровик оформляет несколько изменений графиков или кадровых переводов для одного сотрудника в течение короткого периода (например, одного месяца). В основных регистрах все данные отражаются корректно, однако в карточке сотрудника по кнопке «История переводов» или в отчетах начинает отображаться недостоверная информация, либо программа «забывает» вернуть сотрудника на его первоначальный график работы.
В этой статье мы подробно разберем, почему возникает эта архитектурная проблема, как устроены интервальные регистры «под капотом» программы и какие существуют практические способы исправления этой ошибки — как для старых, так и для новых релизов 1С:ЗУП.
Проанализируем классическую ситуацию. Сотруднику в течение месяца несколько раз меняли график работы с помощью документов Изменение графика работы или Кадровый перевод. Все документы проведены без ошибок. Если мы откроем стандартный регистр сведений График работы сотрудников, то увидим идеальную картину: записи идут последовательно, периоды не пересекаются, и финальная запись указывает на возврат к исходному графику.
Однако при просмотре истории кадровых изменений в карточке сотрудника или при расчете заработной платы программа ведет себя так, будто действует совершенно другой график. Все дело в том, что начиная с версий 3.1.4/3.1.5, разработчики фирмы «1С» изменили архитектуру получения кадровых данных для повышения быстродействия системы.
Вместо классического обращения к виртуальным таблицам типа «Срез последних» с периодичностью, программа обращается к специальным интервальным регистрам сведений. В нашей ситуации ключевую роль играет регистр График работы сотрудников интервальный. Именно в нем при наложении периодов происходит сбой.
Давайте разберем внутреннее устройство интервальных регистров сведений, чтобы понять природу ошибки:
Период. Вместо этого используются два полноценных измерения: Дата начала и Дата окончания. Если состояние сотрудника является открытым (то есть действует по настоящее время), в поле окончания записывается техническая дата 31.12.3999 23:59:59.ПриЗаписи() основного регистра сведений и запускает системный метод обновления интервальных таблиц. При сложных цепочках документов этот автоматический алгоритм вытеснения периодов дает сбой.Фирма «1С» признала проблему рассогласования интервальных регистров системной. Начиная с релизов 3.1.35.13 (и ЗУП КОРП 3.1.35.14), в программе появился официальный встроенный инструмент для исправления таких ошибок.
Если ваша база обновлена до актуального релиза, выполните следующие шаги:
Важно: Процедура перезаполнения может занять продолжительное время в зависимости от объема информационной базы. Рекомендуется выполнять ее в период наименьшей активности пользователей.
Если вы работаете на более ранней версии программы (например, как автор темы на релизе 3.1.6) и оперативно обновиться нет возможности, существует проверенный временем пользовательский прием. Он заставляет программу принудительно пересчитать интервалы по конкретному сотруднику без написания кода.
Рассмотрим этот алгоритм пошагово:
Отсутствие (прогул, болезнь, неявка) на проблемного сотрудника.После этой несложной манипуляции откройте карточку сотрудника и проверьте «Историю переводов» — в большинстве случаев лишние некорректные записи исчезнут, а возврат к старому графику отобразится правильно.
Если документов по сотруднику за месяц было введено действительно много, и простой перезапуск интервалов через «Отсутствие» не помог, необходимо восстановить правильную последовательность документов-регистраторов:
Такой подход позволяет платформе корректно распределить «секунды» документов в базе данных и правильно рассчитать вытеснение интервалов в регистре График работы сотрудников интервальный.
Если вы являетесь программистом или системным администратором 1С, вы можете запустить обновление интервалов программно через внешнюю обработку. Для этого можно использовать вызов экспортного метода, который перезаполнит данные по конкретному сотруднику или по всей базе.
Для обновления интервального регистра сведений используется следующий метод платформы:
// Пример вызова обновления интервального регистра программно
РегистрыСведений.ГрафикРаботыСотрудниковИнтервальный.ОбновитьИнтервальныйРегистрСведений(ПараметрыОбновления);
На профильных ресурсах для разработчиков (например, Инфостарт) доступно множество готовых бесплатных обработок «Восстановление интервальных регистров», которые используют этот и аналогичные методы для исправления накопившихся ошибок кадровой истории.
Если ошибка локальная, затрагивает одного сотрудника, а времени на технические манипуляции нет, самым простым выходом из ситуации для бухгалтера будет явное ручное указание нужного графика.
Вместо того чтобы полагаться на автоматический возврат к старому графику после окончания срока действия временного кадрового перевода, создайте новый документ Изменение графика работы. В поле «Дата изменения» укажите день, с которого сотрудник должен вернуться на прежний график, и явно выберите необходимый график работы (например, график 171, как в примере автора темы). Проведение этого документа принудительно зафиксирует нужное состояние и прекратит влияние некорректно закрытых интервалов предыдущих документов.