Как правильно выбрать данные сотрудников и рассчитать стаж в 1С:УПП 1.3

Программист 1С v8.3 (Обычные формы)
← На главную

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

Источники персональных данных сотрудников

Для начала проанализируем, где хранятся базовые сведения. Хотя многие реквизиты кажутся доступными напрямую из справочников, для обеспечения точности (например, если сотрудник менял фамилию) лучше обращаться к соответствующим регистрам сведений:

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

Как определить список работающих сотрудников на дату

Выясним причину, по которой нельзя просто проверять дату увольнения в карточке сотрудника. В УПП данные о состоянии работника (принят, переведен, уволен) хранятся в регистре сведений РаботникиОрганизаций. Это периодический регистр, и именно он является «первоисточником» истины для кадрового учета.

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


ВЫБРАТЬ
    Работники.Сотрудник,
    Работники.Сотрудник.Код КАК ТабельныйНомер,
    Работники.Сотрудник.Физлицо.ДатаРождения КАК ДатаРождения,
    Работники.Сотрудник.Физлицо.Пол КАК Пол
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаСреза, 
        Сотрудник.ВидЗанятости <> ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиВОрганизации.ВнутреннееСовместительство)) КАК Работники
ГДЕ
    ВЫБОР
        КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1) И Работники.ПериодЗавершения <= &ДатаСреза
            ТОГДА Работники.ПричинаИзмененияСостоянияЗавершения
        ИНАЧЕ Работники.ПричинаИзмененияСостояния
    КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)

Проанализируем этот код. Здесь мы используем СрезПоследних. Обратите внимание на проверку ПериодЗавершения. В УПП 1.3 существует механизм временных кадровых перемещений. Если сотрудника перевели на другую должность временно, в регистре заполняется дата окончания этого состояния. По истечении этой даты состояние должно «вернуться» к исходному. Условие в ГДЕ корректно обрабатывает такие случаи, проверяя, не было ли увольнения последним значимым событием.

Получение данных о стаже (общий и непрерывный)

Вопрос расчета стажа — один из самых сложных. В 1С стаж не хранится как статичное число (количество лет и месяцев), так как он увеличивается ежедневно. В системе хранятся «точки отсчета».

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

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

Посмотрим на пример логики, которую нужно реализовать в коде обработки:


// Пример использования экспортной функции для расчета стажа
ДатаОтчета = КонецДня(ПараметрыСеанса.ТекущаяДата); // или дата из диалога
Для Каждого СтрокаСотрудник Из ТаблицаСотрудников Цикл
    СтажТекст = ПроцедурыУправленияПерсоналом.РассчитатьСтажРаботы(
        СтрокаСотрудник.Физлицо, 
        Справочники.ВидыСтажа.ОбщийСтаж, 
        ДатаОтчета
    );
    // Функция вернет структуру или строку с рассчитанными данными
КонецЦикла;

Важный момент: Если вам нужен стаж работы именно «в данной организации», то точкой отсчета будет дата самого первого документа ПриемНаРаботуВОрганизацию для данного физлица в этой компании. Эти данные также извлекаются из регистра РаботникиОрганизаций путем выбора самой ранней записи с состоянием «Принято».

Выборка сотрудников, уволенных за период

Если задача стоит иначе — например, вывести список всех, кто уволился в течение 2018 года, — подход со СрезомПоследних не подойдет. В этом случае нам нужно обращаться к физической таблице регистра РаботникиОрганизаций за период.

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


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

В данном случае Регистратор позволит вам вытащить номер и дату приказа об увольнении, так как в самом регистре сведений номер приказа не хранится — он есть только в документе УвольнениеИзОрганизации.

Резюме и рекомендации

При построении кадровых отчетов в УПП 1.3 придерживайтесь следующих правил:

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

← На главную