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