Как получить корректные данные об отработанном времени с учетом переходящих смен в 1С:ЗУП КОРП?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

При работе в 1С:Зарплата и управление персоналом КОРП специалисты часто сталкиваются с проблемой корректного извлечения данных об отработанном времени, когда на предприятии используются переходящие смены (например, работа с 20:00 до 08:00 следующего дня). Типовые регистры сведений, такие как ДанныеТабельногоУчетаРабочегоВремениСотрудников, при прямом обращении через запрос могут показывать «пустоты» или помечать день окончания смены как выходной, хотя фактически сотрудник в эти сутки работал.

В этой статье мы подробно разберем, почему так происходит, и проанализируем механизмы, которые позволяют собрать данные сводно за месяц в разрезе видов времени (явка, ночные, вечерние) без потери часов на стыке суток.

Причина проблемы: как ЗУП КОРП видит переходящую смену

Рассмотрим ситуацию: смена начинается 2 марта в 20:00 и заканчивается 3 марта в 08:00. В настройках смены или графика может быть установлен (или снят) флаг «Отражать часы в день начала смены». Если этот флаг выключен, система должна распределить 4 часа на 2 марта и 8 часов на 3 марта.

Однако при простом обращении к регистру ДанныеТабельногоУчетаРабочегоВремениСотрудников вы можете увидеть, что за 3 марта записи отсутствуют или день помечен как выходной. Это происходит потому, что в версии КОРП учет времени опирается на объекты Смена и дополнительные реквизиты, такие как ПереходящаяЧастьСмены. Чтобы получить «честную» картинку, нельзя просто суммировать записи регистра по датам — необходимо использовать программные механизмы, которые умеют собирать данные из нескольких источников (графики, табели, индивидуальные графики, ежедневные отчеты).

Решение 1: Программное получение данных через общий модуль

Наиболее надежный способ получить данные для отчета или обработки — использовать типовой программный интерфейс. Разберем алгоритм работы с общим модулем УчетРабочегоВремениРасширенный. Этот метод позволяет сформировать временную таблицу, в которой данные уже будут «причесаны» и распределены по календарным дням с учетом всех приоритетов начислений.

Для начала подготовим таблицу сотрудников, по которым нам нужны данные. Проанализируем пример процедуры инициализации:


Процедура ПодготовитьВТСотрудники(ТС, МенеджерВременныхТаблиц, ДатаАктуальности)
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("ТС", ТС);
    Запрос.УстановитьПараметр("ДатаАктуальности", ДатаАктуальности);
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТС.Сотрудник КАК Сотрудник,
    |    ТС.ДатаНачала КАК ДатаНачала,
    |    ТС.ДатаОкончания КАК ДатаОкончания,
    |    ТС.Месяц КАК Месяц,
    |    &ДатаАктуальности КАК ДатаАктуальности
    |ПОМЕСТИТЬ ВТСотрудники
    |ИЗ
    |    &ТС КАК ТС";
    Запрос.Выполнить();
КонецПроцедуры

После того как список сотрудников помещен во временную таблицу, мы вызываем основной метод формирования данных учета времени. Рассмотрим, как правильно настроить параметры запроса:


// Создаем менеджер для хранения результатов
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ДатаАктуальности = КонецМесяца(МесяцНачисления);

// Вызываем вспомогательную процедуру (см. выше)
ПодготовитьВТСотрудники(ТаблицаСотрудников, МенеджерВременныхТаблиц, ДатаАктуальности);

// Инициализируем структуру параметров
ПП = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников();
ПП.ДатаНачала = НачалоМесяца(МесяцНачисления);
ПП.ДатаОкончания = КонецМесяца(МесяцНачисления);
ПП.МесяцДатаНачала = ПП.ДатаНачала;
ПП.МесяцДатаОкончания = ПП.ДатаОкончания;
ПП.ДатаАктуальности = ДатаАктуальности; 

// Формируем временную таблицу с данными
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(МенеджерВременныхТаблиц, Истина, ПП);

// Выгружаем результат для анализа
ТЧ = МенеджерВременныхТаблиц.Таблицы.Найти("ВТДанныеУчетаВремениИСостоянийСотрудников").ПолучитьДанные().Выгрузить();    
МенеджерВременныхТаблиц.Закрыть();

В результате в таблице ТЧ мы получим детальную информацию по каждому дню. Важно понимать, что метод СоздатьВТДанныеУчетаВремениИСостоянийСотрудников внутри себя анализирует флаги переходящих смен и корректно разносит часы по суткам, основываясь на настройках ВидВремени и Смена.

Решение 2: Использование аналитического отчета Т-13

Если задача стоит не в программном извлечении данных, а в предоставлении пользователю удобного отчета, выясним, как адаптировать типовой отчет «Табель учета рабочего времени (Т-13)».

В ЗУП КОРП этот отчет обладает гибкими настройками. Чтобы увидеть данные в разрезе видов времени и дат без ошибок переходящих смен, выполним следующие шаги:

  1. Откроем отчет «Табель Т-13» и перейдем в режим «Настройки», выбрав вид «Расширенный».
  2. На вкладке «Структура» мы можем изменить группировки. Для аналитических целей рекомендуется использовать группировку по сотруднику, а в детальных записях выводить поля Дата, Вид времени и Часы.
  3. Проверим настройки на вкладке «Поля и сортировки». В КОРП-версии важно убедиться, что отчет берет данные из виртуальных таблиц, которые учитывают «оперативное время» (ежедневные отчеты), если они используются в организации.

Важный нюанс: Если даже в отчете Т-13 вы видите некорректные данные (например, 3-е число пустое), проанализируем настройки смен. В справочнике Смены работы для ночных смен проверьте время окончания. Если оно заходит за полночь, убедитесь, что в графике работы для этой смены корректно определены периоды. После любого изменения в графиках или сменах необходимо выполнить перепроведение документов Табель, так как именно в момент проведения происходит расчет и запись данных в регистры, на которых строятся отчеты.

Дополнительные инструменты анализа

При отладке или разработке сложных сводных отчетов полезно заглянуть в общий модуль УчетРабочегоВремениРасширенный и найти функцию ЭтоПереходящаяЧастьПредыдущейСмены. Рассмотрим её логику:


Функция ЭтоПереходящаяЧастьПредыдущейСмены(СтрокаРегистрируемыхДанных)
    Возврат СтрокаРегистрируемыхДанных.ПереходящаяЧастьСмены 
            И Не СтрокаРегистрируемыхДанных.ОтражатьЧасыВДеньНачалаСмены;     
КонецФункции

Эта функция подсказывает нам, что система разделяет понятия «физическая работа в эти сутки» и «принадлежность работы к смене, начатой вчера». Если вы пишете собственный запрос к регистру ДанныеТабельногоУчетаРабочегоВремениСотрудников, вам обязательно нужно учитывать поле ПереходящаяЧастьСмены. Если оно равно Истина, значит, эти часы относятся к смене предыдущего дня, и их нужно корректно суммировать с общим итогом сотрудника за месяц, не теряя привязке к конкретной дате календаря.

Резюме

Для получения корректного свода времени в ЗУП КОРП мы рекомендуем:

Помните, что прямые запросы к регистрам сведений в КОРП-версии без учета специфики переходящих смен почти всегда приводят к ошибкам в отчетности. Использование типовых функций — это залог того, что ваши данные по явкам, ночным и выходным сойдутся с расчетом заработной платы.

← На главную