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

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

В конфигурации «1С:Зарплата и управление персоналом 3.1» задача получения отработанного времени часто вызывает сложности у начинающих разработчиков. Основная причина заключается в том, что данные об отработанных часах в окончательном виде попадают в регистры расчета только после проведения документа «Начисление зарплаты и взносов». Однако на практике отчеты или доработки часто требуют получения этих данных до расчета зарплаты. В этой статье мы подробно разберем, как вытащить данные о времени, используя механизмы платформы и программный интерфейс системы.

Понимание источников данных в ЗУП 3.1

Прежде чем писать запрос, нам необходимо разобраться, откуда система берет данные. В ЗУП 3.1 существует несколько источников данных о времени, и их приоритетность выглядит следующим образом:

  1. Документ «Табель»: Если он введен и проведен, система считает его приоритетным источником. Данные хранятся в регистре накопления ДанныеТабельногоУчетаРабочегоВремениСотрудников.
  2. График работы и отклонения: Если табель не введен, система вычисляет время «на лету», накладывая документы отклонений (больничные, отпуска, командировки) на плановый график работы сотрудника.
  3. Оперативный учет: Ввод данных через «Данные для расчета зарплаты» фиксируется в регистре ДанныеОперативногоУчетаРабочегоВремениСотрудников.

Рассмотрим подробнее каждый из способов получения этих данных.

Способ 1: Использование программного интерфейса (рекомендуемый)

Разработчики 1С предусмотрели мощный инструмент в общем модуле УчетРабочегоВремениРасширенный, который позволяет получить таблицу со всеми данными о времени (явка, ночные, сверхурочные), учитывая все приоритеты и настройки программы. Разберем по шагам, как использовать метод СоздатьВТДанныеУчетаВремениИСостоянийСотрудников.

Этот метод удобен тем, что он самостоятельно анализирует, введен ли табель или нужно использовать график, и собирает итоговую временную таблицу, которую затем можно использовать в основном запросе.

Пример реализации кода:


// 1. Подготовка менеджера временных таблиц и параметров
Менеджер = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Менеджер;

// 2. Формируем список сотрудников (ВТСотрудникиОрганизации)
ПараметрыПолученияДанных = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияДанных.Организация = Объект.Организация;
ПараметрыПолученияДанных.НачалоПериода = Объект.Период.ДатаНачала;
ПараметрыПолученияДанных.ОкончаниеПериода = Объект.Период.ДатаОкончания;

КадровыйУчет.СоздатьВТСотрудникиОрганизации(Менеджер, ИСТИНА, ПараметрыПолученияДанных);

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

Запрос.УстановитьПараметр("НачалоПериода", Объект.Период.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", Объект.Период.ДатаОкончания);
Запрос.Выполнить();

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

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

// 5. Получение результата
Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТУчетРабочегоВремениПолный";
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

В результате в таблице ВТУчетРабочегоВремениПолный вы получите детальную информацию. Проанализируем ее структуру: в ней будут колонки Сотрудник, ВидВремени, Дней, Часов. Это позволяет максимально точно определить, сколько часов отработал человек по каждому виду времени (например, отдельно «Явка», отдельно «Ночные»).

Способ 2: Запрос к регистру табельного учета

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

Важно помнить: если табель не проведен, этот регистр будет пуст. Рассмотрим пример структуры такого запроса:


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

Нюанс: Данный метод не учитывает отклонения, введенные после того, как табель был создан и проведен. Если кадровик ввел больничный лист уже после формирования табеля, данные в этом регистре могут стать неактуальными, пока табель не будет перезаполнен.

Способ 3: Метод «График минус Отклонения»

Если мы хотим понять, как система считает время без документа «Табель», разберем логику прямого запроса к плановым и фактическим данным. Этот способ сложнее в реализации, но дает понимание внутренней кухни ЗУП.

Проанализируем основные регистры:

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

Критически важные моменты

Рассмотрим несколько ситуаций, в которых получение данных может вызывать ошибки:

  1. Проблема «пустого» Табеля: Если документ «Табель» создан, но не заполнен (или строки в нем пусты), программные методы 1С (включая ВТ) могут вернуть нулевые значения. Это происходит потому, что проведенный «Табель» имеет высший приоритет над графиком. Всегда проверяйте наличие проведенных пустых табелей при отладке.
  2. Состояние документов: Для того чтобы отклонение (например, «Командировка») отразилось в учете времени, документ должен быть как минимум проведен. Если расчетчик создал документ, но не провел его, система будет считать это время как рабочее (по графику).
  3. Дата актуальности: В методе СоздатьВТДанныеУчетаВремениИСостоянийСотрудников параметр ДатаАктуальности играет важную роль. Обычно его устанавливают на конец периода получения данных, чтобы учесть все изменения в кадровой истории.

Использование общего модуля «УчетРабочегоВремени»

Для тех, кто предпочитает работу с коллекциями значений (ТаблицаЗначений), существует альтернативный способ через функцию ДанныеУчетаВремениСотрудников. Она позволяет получить структуру с данными по каждому дню. Выясним, как это работает:


// Получаем данные за период
ТаблицаДанных = УчетРабочегоВремени.ДанныеУчетаВремениСотрудников(Сотрудник, ДатаНачала, ДатаОкончания);

// Теперь можно обойти таблицу и просуммировать часы по виду времени "Явка"
ИтогоЧасов = 0;
Для Каждого Строка Из ТаблицаДанных Цикл
    Если Строка.ВидВремени = Справочники.ВидыИспользованияРабочегоВремени.Явка Тогда
        ИтогоЧасов = ИтогоЧасов + Строка.Часов;
    КонецЕсли;
КонецЦикла;

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

Резюме

Мы проанализировали основные подходы к получению отработанных часов в ЗУП 3.1. Для надежной разработки всегда рекомендуется использовать стандартные механизмы БСП (такие как СоздатьВТДанныеУчетаВремениИСостоянийСотрудников), так как они автоматически учитывают все настройки программы: использование табелей, индивидуальные графики, переносы выходных и приоритеты документов-отклонений. Прямые запросы к регистрам допустимы только в узких задачах, где вы на 100% уверены в методике ведения учета конкретного клиента.

← На главную