При разработке отчетов или доработке функционала в типовых конфигурациях, таких как 1С:Зарплата и Управление Персоналом, часто возникает задача получения нормы рабочего времени или фактически отработанных часов. Прямые запросы к регистрам могут быть ошибочными из-за сложности учета графиков и отклонений. Давайте разберем, как это реализовать правильно, используя встроенные механизмы системы.
В типовых конфигурациях существует мощная подсистема, которая уже содержит всю необходимую логику расчета. Попытка написать собственный «километровый» запрос к регистрам учета времени — это путь, ведущий к ошибкам при обновлении и неверному расчету норм для сменных графиков или сотрудников с неполным рабочим временем. Вместо этого мы воспользуемся готовым функционалом модуля УчетРабочегоВремениРасширенный.
Разберем по шагам, как получить данные через менеджер временных таблиц:
ВТДанныеУчетаВремениИСостоянийСотрудников и ВТНормаВремени в итоговом запросе.Рассмотрим пример реализации на языке 1С:
ПараметрыЗаполнения = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников;
// Инициализируем создание временных таблиц
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(
Запрос.МенеджерВременныхТаблиц,
Истина,
ПараметрыЗаполнения
);
После выполнения данного кода в МенеджерВременныхТаблиц вашего запроса появятся две готовые таблицы. Первая — ВТДанныеУчетаВремениИСостоянийСотрудников — содержит фактически отработанные часы, а вторая — ВТНормаВремени — содержит нормативные показатели, рассчитанные с учетом производственного календаря и графиков сотрудников.
Если ваша задача — вывести эти данные в отчет, лучшей практикой является использование Системы компоновки данных (СКД). Попытка вписать сложную логику расчета внутрь схемы запроса СКД крайне затруднительна. Мы рекомендуем использовать подход передачи таблицы значений.
Для этого в модуле отчета, при формировании данных, вы вызываете описанную выше функцию, получаете результат в таблицу значений и передаете её в СКД как «Набор данных — объект». Это позволяет:
Если вам не требуется учет индивидуальных графиков, а необходимо только общее количество часов согласно производственному календарю, можно воспользоваться более простыми методами:
Данные производственного календаря. Это плоская таблица, из которой можно легко получить сумму часов по календарным дням с помощью обычного запроса.ПроизводственныйКалендарьКлиентСервер. Это самый быстрый способ получить числовое значение нормы без написания запросов, просто передав даты начала и окончания периода.Графики работы по видам времени. Будьте внимательны: этот метод требует обязательного отбора по конкретному графику и периоду, иначе результат будет неверным.Подведем итог: никогда не пытайтесь «взломать» сложную логику учета рабочего времени прямым запросом к регистрам накопления. Используйте Общие модули системы, которые создают временные таблицы. Это гарантирует, что ваш отчет или обработка будут корректно работать даже после обновления конфигурации, когда условия расчета рабочего времени могут измениться.