При работе в программе 1С:Зарплата и Управление Персоналом редакции 2.5 пользователи часто сталкиваются с неприятной особенностью автоматического заполнения документов. Типичный сценарий: сотрудник в середине расчетного месяца (например, 12-го числа) переводится из одного подразделения в другое с помощью документа КадровоеПеремещение. Когда кадровик или бухгалтер начинает заполнять документ ТабельУчетаРабочегоВремени с отбором по старому подразделению, программа заполняет рабочие часы сотрудника до самого конца месяца, игнорируя факт его перевода.
В то же время при заполнении табеля по новому подразделению программа отрабатывает корректно — рабочие дни сотрудника заполняются строго с 12-го числа. В этой статье мы подробно разберем, почему возникает эта архитектурная особенность, и рассмотрим несколько эффективных способов решения проблемы.
Для того чтобы понять логику программы, проанализируем внутренние механизмы платформы. При автоматическом заполнении табличной части документа ТабельУчетаРабочегоВремени система делает запрос к регистру сведений РаботникиОрганизаций. На начало месяца (с 1-го по 11-е число) сотрудник числился в старом подразделении. Поскольку система находит его в списке работников этого подразделения на начало периода, она включает его в документ.
Однако алгоритм заполнения сетки дней (с 1 по 31 число) по выбранному подразделению в ЗУП 2.5 не умеет автоматически разделять или «обрезать» плановые часы по дате кадрового перемещения, если документ создается с жестким отбором по конкретному подразделению в шапке. Программа видит сотрудника, видит его основной график работы и просто заполняет всю строку до конца месяца. Это известное поведение конфигурации, которое многие расчетчики считают ошибкой, но разработчики позиционируют как ограничение архитектуры старой редакции.
Рассмотрим четыре практических метода, которые помогут обойти эту проблему.
Давайте разберем наиболее правильный с точки зрения методологии 1С путь. В линейке программ «1С:ЗУП» (как в версии 2.5, так и в современной 3.1) реализован так называемый метод отклонений. Это означает, что создавать документ ТабельУчетаРабочегоВремени в системе вообще не обязательно, если у сотрудников нет ежедневных отклонений от графика, требующих ручного ввода.
Для корректного расчета заработной платы программе вполне достаточно кадровых документов. Выполним следующие шаги:
КадровоеПеремещение с 12-го числа. Программа зафиксирует изменение подразделения в регистре сведений.НачислениеЗарплатыСотрудникамОрганизаций система автоматически разделит оклад сотрудника на две части: расчет по первому подразделению будет произведен с 1 по 11 число, а по второму подразделению — с 12 по 31 число. Никаких наложений и задвоений сумм не произойдет.Этот отчет формируется напрямую по данным кадрового учета и зарегистрированных отклонений (больничные, отпуска). В отчете Т-13 наш сотрудник отразится идеально: в строке старого подразделения дни с 12-го числа будут закрыты символом «Х» (или останутся пустыми), а в строке нового подразделения учет начнется строго с 12-го числа.
Бывают ситуации, когда специфика предприятия (например, наличие ночных смен, сверхурочных часов или суммированный учет рабочего времени) требует обязательного ведения документов ТабельУчетаРабочегоВремени вручную. В этом случае мы можем применить простую хитрость:
ТабельУчетаРабочегоВремени.При таком подходе алгоритм автозаполнения видит всю цепочку перемещений сотрудника за месяц целиком. Система сама автоматически разделит строки сотрудника: создаст одну строку по старому подразделению с рабочими днями по 11-е число, и вторую строку по новому подразделению — с 12-го числа. Вам останется лишь провести документ. Минус данного способа — неудобство работы в крупных компаниях, где кадровики закреплены за конкретными подразделениями и не должны видеть чужих сотрудников.
Если на вашем предприятии кадровики ведут учет строго по «своим» подразделениям и заполнение общего табеля невозможно, придется корректировать строки вручную. Чтобы кадровик не забыл, у кого именно из сотрудников были перемещения в текущем месяце, настроим оперативный контроль:
Подразделение и проанализируем даты начала работы.Если ручной контроль исключен из-за огромного штата и постоянных ротаций, лучшим решением станет небольшая доработка системы. Рассмотрим два возможных пути реализации.
Путь А: Создание внешней обработки заполнения табличной части. Это наиболее безопасный метод, так как сама конфигурация остается на стандартной поддержке. Напишем обработку, которая будет вызываться из документа «Табель». Она будет анализировать движения по регистру РаботникиОрганизаций и очищать лишние часы. Посмотрим на пример кода, который может быть использован в такой обработке:
// Пример фрагмента кода внешней обработки для очистки "лишних" дней
Для Каждого СтрокаТабеля Из СсылкаНаДокумент.ТЧ_ИспользованияРабочегоВремени Цикл
Сотрудник = СтрокаТабеля.Сотрудник;
ПодразделениеТабеля = СсылкаНаДокумент.ПодразделениеОрганизации;
// Получаем реальный период работы сотрудника в данном подразделении за месяц
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Работники.Период КАК ДатаИзменения,
| Работники.ПодразделениеОрганизации КАК Подразделение
|ИЗ
| РегистрСведений.РаботникиОрганизаций КАК Работники
|ГДЕ
| Работники.Сотрудник = &Сотрудник
| И Работники.Период МЕЖДУ &НачалоМесяца И &КонецМесяца
|УПОРЯДОЧИТЬ ПО
| ДатаИзменения";
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(СсылкаНаДокумент.ПериодРегистрации));
Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(СсылкаНаДокумент.ПериодРегистрации));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Если сотрудник перевелся в другое подразделение, очищаем дни после даты перевода
Если Выборка.Подразделение <> ПодразделениеТабеля Тогда
НомерДняПеревода = День(Выборка.ДатаИзменения);
Для Индекс = НомерДняПеревода По 31 Цикл
ИмяПоляВида = "ВидВремени" + Индекс;
ИмяПоляЧасов = "ПервыйЧас" + Индекс; // и другие поля часов
// Очищаем значения в строке табеля
СтрокаТабеля[ИмяПоляВида] = Неопределено;
СтрокаТабеля[ИмяПоляЧасов] = 0;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецДляОчередного;
Путь Б: Изменение запроса в модуле документа. Если база уже снята с поддержки, программист может скорректировать запрос автозаполнения в общем модуле ЗаполнениеТабеляУчетаРабочегоВремени (или в модуле самого документа). В запрос, собирающий данные по сотрудникам подразделения, необходимо добавить левое соединение с историей кадровых перемещений за выбранный месяц, чтобы ограничить выборку дней для каждого сотрудника фактическим периодом его работы в указанном в шапке подразделении.
Выберите наиболее подходящий для вашей компании метод, чтобы оптимизировать работу кадровой службы и избежать досадных ошибок при расчете заработной платы!