При работе в 1С:Зарплата и управление персоналом КОРП специалисты часто сталкиваются с проблемой корректного извлечения данных об отработанном времени, когда на предприятии используются переходящие смены (например, работа с 20:00 до 08:00 следующего дня). Типовые регистры сведений, такие как ДанныеТабельногоУчетаРабочегоВремениСотрудников, при прямом обращении через запрос могут показывать «пустоты» или помечать день окончания смены как выходной, хотя фактически сотрудник в эти сутки работал.
В этой статье мы подробно разберем, почему так происходит, и проанализируем механизмы, которые позволяют собрать данные сводно за месяц в разрезе видов времени (явка, ночные, вечерние) без потери часов на стыке суток.
Рассмотрим ситуацию: смена начинается 2 марта в 20:00 и заканчивается 3 марта в 08:00. В настройках смены или графика может быть установлен (или снят) флаг «Отражать часы в день начала смены». Если этот флаг выключен, система должна распределить 4 часа на 2 марта и 8 часов на 3 марта.
Однако при простом обращении к регистру ДанныеТабельногоУчетаРабочегоВремениСотрудников вы можете увидеть, что за 3 марта записи отсутствуют или день помечен как выходной. Это происходит потому, что в версии КОРП учет времени опирается на объекты Смена и дополнительные реквизиты, такие как ПереходящаяЧастьСмены. Чтобы получить «честную» картинку, нельзя просто суммировать записи регистра по датам — необходимо использовать программные механизмы, которые умеют собирать данные из нескольких источников (графики, табели, индивидуальные графики, ежедневные отчеты).
Наиболее надежный способ получить данные для отчета или обработки — использовать типовой программный интерфейс. Разберем алгоритм работы с общим модулем УчетРабочегоВремениРасширенный. Этот метод позволяет сформировать временную таблицу, в которой данные уже будут «причесаны» и распределены по календарным дням с учетом всех приоритетов начислений.
Для начала подготовим таблицу сотрудников, по которым нам нужны данные. Проанализируем пример процедуры инициализации:
Процедура ПодготовитьВТСотрудники(ТС, МенеджерВременныхТаблиц, ДатаАктуальности)
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ТС", ТС);
Запрос.УстановитьПараметр("ДатаАктуальности", ДатаАктуальности);
Запрос.Текст =
"ВЫБРАТЬ
| ТС.Сотрудник КАК Сотрудник,
| ТС.ДатаНачала КАК ДатаНачала,
| ТС.ДатаОкончания КАК ДатаОкончания,
| ТС.Месяц КАК Месяц,
| &ДатаАктуальности КАК ДатаАктуальности
|ПОМЕСТИТЬ ВТСотрудники
|ИЗ
| &ТС КАК ТС";
Запрос.Выполнить();
КонецПроцедуры
После того как список сотрудников помещен во временную таблицу, мы вызываем основной метод формирования данных учета времени. Рассмотрим, как правильно настроить параметры запроса:
// Создаем менеджер для хранения результатов
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ДатаАктуальности = КонецМесяца(МесяцНачисления);
// Вызываем вспомогательную процедуру (см. выше)
ПодготовитьВТСотрудники(ТаблицаСотрудников, МенеджерВременныхТаблиц, ДатаАктуальности);
// Инициализируем структуру параметров
ПП = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников();
ПП.ДатаНачала = НачалоМесяца(МесяцНачисления);
ПП.ДатаОкончания = КонецМесяца(МесяцНачисления);
ПП.МесяцДатаНачала = ПП.ДатаНачала;
ПП.МесяцДатаОкончания = ПП.ДатаОкончания;
ПП.ДатаАктуальности = ДатаАктуальности;
// Формируем временную таблицу с данными
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(МенеджерВременныхТаблиц, Истина, ПП);
// Выгружаем результат для анализа
ТЧ = МенеджерВременныхТаблиц.Таблицы.Найти("ВТДанныеУчетаВремениИСостоянийСотрудников").ПолучитьДанные().Выгрузить();
МенеджерВременныхТаблиц.Закрыть();
В результате в таблице ТЧ мы получим детальную информацию по каждому дню. Важно понимать, что метод СоздатьВТДанныеУчетаВремениИСостоянийСотрудников внутри себя анализирует флаги переходящих смен и корректно разносит часы по суткам, основываясь на настройках ВидВремени и Смена.
Если задача стоит не в программном извлечении данных, а в предоставлении пользователю удобного отчета, выясним, как адаптировать типовой отчет «Табель учета рабочего времени (Т-13)».
В ЗУП КОРП этот отчет обладает гибкими настройками. Чтобы увидеть данные в разрезе видов времени и дат без ошибок переходящих смен, выполним следующие шаги:
Дата, Вид времени и Часы.Важный нюанс: Если даже в отчете Т-13 вы видите некорректные данные (например, 3-е число пустое), проанализируем настройки смен. В справочнике Смены работы для ночных смен проверьте время окончания. Если оно заходит за полночь, убедитесь, что в графике работы для этой смены корректно определены периоды. После любого изменения в графиках или сменах необходимо выполнить перепроведение документов Табель, так как именно в момент проведения происходит расчет и запись данных в регистры, на которых строятся отчеты.
При отладке или разработке сложных сводных отчетов полезно заглянуть в общий модуль УчетРабочегоВремениРасширенный и найти функцию ЭтоПереходящаяЧастьПредыдущейСмены. Рассмотрим её логику:
Функция ЭтоПереходящаяЧастьПредыдущейСмены(СтрокаРегистрируемыхДанных)
Возврат СтрокаРегистрируемыхДанных.ПереходящаяЧастьСмены
И Не СтрокаРегистрируемыхДанных.ОтражатьЧасыВДеньНачалаСмены;
КонецФункции
Эта функция подсказывает нам, что система разделяет понятия «физическая работа в эти сутки» и «принадлежность работы к смене, начатой вчера». Если вы пишете собственный запрос к регистру ДанныеТабельногоУчетаРабочегоВремениСотрудников, вам обязательно нужно учитывать поле ПереходящаяЧастьСмены. Если оно равно Истина, значит, эти часы относятся к смене предыдущего дня, и их нужно корректно суммировать с общим итогом сотрудника за месяц, не теряя привязке к конкретной дате календаря.
Для получения корректного свода времени в ЗУП КОРП мы рекомендуем:
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников для программных задач.Помните, что прямые запросы к регистрам сведений в КОРП-версии без учета специфики переходящих смен почти всегда приводят к ошибкам в отчетности. Использование типовых функций — это залог того, что ваши данные по явкам, ночным и выходным сойдутся с расчетом заработной платы.