В практике работы с программой «1С:Зарплата и управление персоналом 8» (редакция 3.1) бухгалтеры и программисты часто сталкиваются с ситуацией: сотрудник уходит в отпуск (особенно в отпуск без сохранения оплаты), а после его окончания статус в карточке сотрудника остается пустым или некорректным. Вместо привычного статуса «Работает» система показывает пустоту, что в дальнейшем приводит к критическим ошибкам при расчете среднего заработка, определении остатков отпусков и синхронизации с сервисом «1С:Кабинет сотрудника».
В этой статье мы подробно разберем, почему возникает такая ситуация, как она связана с историческими данными (переносом из 7.7 или 2.5) и какими способами можно восстановить корректное состояние сотрудника в программе.
Для начала проанализируем, как 1С определяет, работает человек в данный момент или нет. В системе ЗУП 3.1 существует важный периодический регистр сведений — СостоянияСотрудников. Именно в нем хранятся записи типа «Работает», «В отпуске», «Болеет», «Командировка».
Логика программы при оформлении отсутствия (например, документа ОтпускБезСохраненияОплаты) следующая:
Проблема «пустого статуса» возникает тогда, когда в базе данных отсутствует «опорная» запись о том, что сотрудник был принят на работу и находился в состоянии Работа до момента ухода в отпуск. Если этой первичной записи нет, то после окончания отпуска системе просто не к чему возвращаться, и статус становится пустым.
Как правило, подобная проблема проявляется у «старых» сотрудников, принятых в организацию еще в 90-х или начале 2000-х годов. Рассмотрим ситуацию подробнее: при многократных переносах данных (например, из 1С 7.7 в ЗУП 2.5, а затем в ЗУП 3.1) информация о приеме на работу фиксируется не типовым документом ПриемНаРаботу, а техническим документом ПереносДанных.
В старых релизах ЗУП 3.1 регистр СостоянияСотрудников не всегда заполнялся при переносе данных, так как расчетные механизмы тогда меньше зависели от этого регистра. Однако с выходом обновлений (начиная с релизов 8.3.14.ххх и выше), где появились Электронные трудовые книжки (СЗВ-ТД) и Кабинет сотрудника, контроль целостности состояний стал значительно строже.
Если сотрудник работает в организации 20 лет и за это время ни разу не уходил в отпуск или на больничный (в рамках текущей базы), программа может «не замечать» отсутствие записи в регистре. Но как только вводится первый документ отсутствия, механизм состояний ломается.
Если таких сотрудников много, самым быстрым способом будет написание небольшой обработки, которая принудительно создаст записи в регистре. Рассмотрим пример логики кода, который позволяет установить сотруднику статус Работа:
// Пример создания записи в регистре СостоянияСотрудников
МенеджерЗаписи = РегистрыСведений.СостоянияСотрудников.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Сотрудник = ВыбранныйСотрудник;
МенеджерЗаписи.Организация = ВыбранныйСотрудник.Организация;
МенеджерЗаписи.Период = ДатаПриемаСотрудника; // Важно указать дату реального приема
МенеджерЗаписи.Состояние = Перечисления.СостоянияСотрудника.Работа;
МенеджерЗаписи.ВидСобытия = Перечисления.ВидыКадровыхСобытий.Прием;
Попытка
МенеджерЗаписи.Записать();
Сообщить("Статус сотрудника успешно обновлен!");
Исключение
Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецПопытки;
Этот метод хорош тем, что он не требует изменения конфигурации и позволяет точечно исправить данные у конкретных физических лиц, по которым возникли проблемы с расчетом среднего.
Если мы хотим решить проблему «штатными» средствами без программирования, проанализируем документы, которыми сотрудник был введен в базу. Посмотрим на алгоритм действий:
Состояния сотрудников и установим галочку.Преимущество этого метода: данные будут выглядеть для системы естественным образом, как если бы они были корректно перенесены изначально. Это исключит проблемы при будущих обновлениях конфигурации.
Иногда систему можно «подтолкнуть» к пересчету состояний, создав документ КадровыйПеревод. Разберем, как это сделать:
КадровыйПеревод на дату, следующую за датой окончания проблемного отпуска.При проведении кадрового документа система пересматривает цепочку состояний сотрудника и часто автоматически подставляет статус «Работает». После этого документ можно попробовать пометить на удаление — иногда статус сохраняется, но лучше оставить его как «техническую» запись.
Проанализируем, почему нельзя игнорировать отсутствие статуса. Алгоритмы 1С при расчете среднего заработка (например, для последующего оплачиваемого отпуска) анализируют время, фактически отработанное сотрудником. Если в регистре СостоянияСотрудников после отпуска без сохранения оплаты стоит «пустота», программа может:
Важный совет: Если вы видите аномально большие цифры в остатках отпусков, первым делом проверьте именно историю состояний в карточке сотрудника (ссылка «Печать» — «Карточка сотрудника (Т-2)» или через отчет «Штатные сотрудники» с выводом поля состояния).
Посмотрим на ситуацию со стороны современных облачных сервисов. Сервис «1С:Кабинет сотрудника» активно использует данные об остатках отпусков и текущем статусе для публикации в личном кабинете работника. В релизах 8.3.14.183 и выше механизмы сбора этой информации были переработаны. Теперь любое «белое пятно» в истории состояний за последние годы работы приводит к тому, что данные в кабинет либо не выгружаются, либо выгружаются с ошибками, что вызывает шквал вопросов от сотрудников к кадровой службе.
Подводя итог, можно сказать, что проблема «исчезновения» статуса после отпуска — это следствие отсутствия непрерывной истории в регистре СостоянияСотрудников. Мы рекомендуем не «выпиливать» куски кода в конфигурации, отвечающие за расчет среднего, так как это нарушит типовую логику программы. Самым правильным решением будет восстановление исторической записи о приеме на работу в указанном регистре через документ «Перенос данных» или с помощью точечной обработки.
Помните, что чистота данных в регистрах состояний — это залог правильной работы всей подсистемы кадрового учета и расчета зарплаты в 1С:ЗУП 3.1.