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

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

При разработке отчетов в конфигурации 1С:Зарплата и Управление Персоналом 3.1 (ЗУП) одной из самых трудоемких задач является сопоставление планового времени (по графику) и фактического (по табелю). Ситуация осложняется, когда сотрудник в течение одного месяца переводится с одного графика на другой. В этом случае простым запросом к регистру сведений ГрафикиРаботыПоВидамВремени не обойтись, так как данные там могут быть распределены по разным разрезам или вовсе отсутствовать для конкретного сотрудника без отклонений.

В этой статье мы подробно разберем, как правильно извлекать данные о рабочем времени, проанализируем структуру регистров и рассмотрим "золотой стандарт" разработки отчетов в ЗУП через программный интерфейс, что позволит организовать качественный мониторинг рабочего времени сотрудников.

Механизм хранения данных о времени в ЗУП 3.1

Прежде чем приступать к написанию кода или запроса, проанализируем, как система хранит информацию. В отличие от старых версий (ЗУП 2.5), в актуальной редакции 3.1 используется сложная система интервальных регистров. Рассмотрим основные объекты:

  1. Регистр сведений ГрафикиРаботыПоВидамВремени. Здесь хранится детальная информация о часах в разрезе видов времени (явка, ночные, праздничные). Однако, если у сотрудника нет индивидуального графика или табеля, в этом регистре записи по конкретному сотруднику могут отсутствовать — система в таких случаях обращается напрямую к графику работы, указанному в справочнике.
  2. Регистр сведений ГрафикРаботыСотрудниковИнтервальный. Это ключевой регистр для нашей задачи. В нем фиксируется, какой график работы действует для сотрудника в каждый конкретный период времени. При кадровом переводе со сменой графика здесь создаются соответствующие записи с указанием интервалов (дат начала и окончания). Чтобы быстро проанализировать эти данные, можно использовать готовые отчеты по графикам сотрудников для проверки суммированного учета.
  3. Регистры ДанныеГрафикаСлужебный и ДанныеТабеляСлужебный. Служебные таблицы, в которых система "схлопывает" данные для ускорения расчетов. К ним можно обращаться запросом, но нужно четко понимать логику их заполнения.

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

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

Разберем, как это реализовать. Предположим, мы разрабатываем отчет на СКД с использованием внешнего набора данных. Рассмотрим пример формирования такой таблицы:


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

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

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

// Теперь мы можем обратиться к этой ВТ в обычном запросе
Запрос.Текст = 
"ВЫБРАТЬ
|   ВТ.Сотрудник,
|   ВТ.Дата,
|   ВТ.ОсновноеВремяПлан КАК ЧасыПоГрафику,
|   ВТ.ОсновноеВремяФакт КАК ЧасыПоТабелю
|ИЗ
|   ВТДанныеУчетаВремени КАК ВТ";

ТЗ_Результат = Запрос.Выполнить().Выгрузить();

Преимущества этого метода: система сама определяет, какой график был актуален, был ли введен Индивидуальный график, были ли больничные или отпуска, которые "вытеснили" плановое время. Для отладки и проверки таких конструкций идеально подойдет консоль запросов ЗУП с поддержкой программного интерфейса. Написать аналогичный запрос вручную, учитывающий все нюансы законодательства и логики 1С, практически невозможно без ошибок.

Способ 2. Запросный метод через интервальные регистры

Если по каким-то причинам использование программного метода невозможно (например, нужен "чистый" запрос в консоли или динамическом списке), проанализируем ситуацию через соединение регистров. Выясним причину, по которой обычный запрос к ГрафикиРаботыПоВидамВремени может не работать: при смене графика в середине месяца нам нужно сначала понять, какой график был актуален в конкретный день.

Рассмотрим алгоритм действий:

  1. Создадим временную таблицу периодов работы сотрудников на основе регистра ГрафикРаботыСотрудниковИнтервальный.
  2. Соединим ее с данными графиков работы из регистра ГрафикиРаботыПоВидамВремени по условию совпадения графика и вхождения даты в интервал.

Пример структуры такого запроса:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    План.Сотрудник,
    План.Дата,
    СУММА(План.ЧасыПоГрафику) КАК ПланЧасы,
    СУММА(ЕСТЬNULL(Факт.ВремяВЧасах, 0)) КАК ФактЧасы
ИЗ
    ВТ_План КАК План
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК Факт
        ПО План.Сотрудник = Факт.ГрафикРаботы
            И План.Дата = Факт.Дата
            И ТИПЗНАЧЕНИЯ(Факт.ГрафикРаботы) = ТИП(Справочник.Сотрудники)
СГРУППИРОВАТЬ ПО
    План.Сотрудник,
    План.Дата

Обратите внимание на важный технический момент в условии соединения: ТИПЗНАЧЕНИЯ(Факт.ГрафикРаботы) = ТИП(Справочник.Сотрудники). В регистре ГрафикиРаботыПоВидамВремени измерение ГрафикРаботы имеет составной тип. Если мы ищем данные по Табелю или Индивидуальному графику, в этом поле будет лежать ссылка на справочник Сотрудники. Если мы ищем данные общего графика, там будет ссылка на справочник ГрафикиРаботы.

Важные нюансы и типичные ошибки

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

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

← На главную