Как получить норму времени сотрудника в 1С:ЗиКГУ 3.1 и ЗУП 3.1

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

При разработке сложных кадровых или расчетных отчетов в конфигурациях «Зарплата и кадры государственного учреждения» или «Зарплата и управление персоналом» (редакции 3.1) программисты часто сталкиваются с необходимостью вывести норму времени. Это может потребоваться для мониторингов Минздрава, анализа эффективности или проверки корректности начислений. В отличие от версии 2.5, в 3.1 данные о времени распределены по нескольким регистрам, и выбор правильного метода зависит от того, используете ли вы систему компоновки данных (СКД) или пишете программный код. Если переход на новую редакцию программы ещё не завершен, можно использовать раздел с решениями для переноса данных ЗУП.

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

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

Наиболее корректный способ, который учитывает все нюансы системы (индивидуальные графики, корректировки времени, переводы), — это обращение к экспортным функциям общих модулей. Разберем подход, который используется в типовых мониторингах отчетности.

Для формирования временных таблиц с данными учета времени мы можем воспользоваться модулем УчетРабочегоВремениРасширенный. Это позволит нам получить готовую таблицу с нормой часов и дней без необходимости вручную связывать множество регистров.

Рассмотрим пример кода, который подготавливает данные:


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

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

// Извлечение данных из временной таблицы ВТНормаВремени
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ ВТНормаВремени КАК ВТ");
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
ТЗНорма = Запрос.Выполнить().Выгрузить();

// Свертка данных по сотруднику, если нужно общее значение за период
ТЗНорма.Свернуть("Сотрудник", "ЧасыНорма, ДниНорма");

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

Способ 2: Запрос к регистру сведений «Графики работы по видам времени»

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

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

Посмотрим на пример функции, которая возвращает норму часов по конкретному графику:


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

    Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
    Запрос.УстановитьПараметр("ГрафикРаботы", ТекущийГрафик);
    // Обычно для нормы используется вид времени "Явка"
    Запрос.УстановитьПараметр("ВидУчетаВремени", Справочники.ВидыИспользованияРабочегоВремени.Явка);

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат 0;
    КонецЕсли;
    
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Возврат Выборка.НормаЧасов;
КонецФункции

Обратите внимание на поле ДополнительноеЗначениеНорма. В типовых конфигурациях 3.1 оно часто используется для хранения нормы времени. Если же вам нужны дни, следует использовать ресурс ОсновноеЗначениеНорма.

Способ 3: Использование представлений и общих наборов данных в СКД

Для разработчиков отчетов на базе СКД в ЗиКГУ предусмотрен механизм виртуальных таблиц кадровых данных. Это позволяет не «изобретать велосипед», а использовать стандартные механизмы поставки данных.

Чтобы задействовать этот механизм, проанализируем последовательность действий в модуле объекта отчета:

  1. В процедуре ПриКомпоновкеРезультата вызовем заполнение общих источников данных.
  2. Используем функцию ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект).
  3. В тексте запроса СКД опишем обращение к виртуальным таблицам, таким как Представления_ДанныеУчетаВремениИСостоянийСотрудников.

Пример фрагмента запроса для СКД, который вытягивает норму:


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    ДанныеВремени.НормаЧасов КАК НормаЧасов,
    ДанныеВремени.НормаДней КАК НормаДней
ИЗ
    Справочник.Сотрудники КАК Сотрудники
    ЛЕВОЕ СОЕДИНЕНИЕ Представления_ДанныеУчетаВремениИСостоянийСотрудников КАК ДанныеВремени
    ПО Сотрудники.Ссылка = ДанныеВремени.Сотрудник
{ГДЕ (ДанныеВремени.ДатаНачала = &ДатаНачала), (ДанныеВремени.ДатаОкончания = &ДатаОкончания)}

Важный нюанс: Чтобы виртуальные таблицы Представления_... заработали, необходимо правильно настроить параметры в схеме компоновки данных и инициализировать их в коде перед выполнением отчета.

Важные замечания по определению нормы

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

Подводя итог, скажем: если вы пишете сложный отчет «с нуля», лучше всего воспользоваться Способом 1 (через УчетРабочегоВремениРасширенный). Это гарантирует, что ваш отчет будет показывать те же цифры, которые бухгалтер видит в документе Начисление зарплаты и взносов. Если же задача разовая и простая — используйте запрос к регистру ГрафикиРаботыПоВидамВремени, но не забудьте про проверку на индивидуальные графики.

← На главную