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