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