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