При переносе данных или первичной загрузке сотрудников в программу «1С:Зарплата и управление персоналом 3» разработчики нередко сталкиваются с ситуацией, когда дату приема пытаются записать напрямую в справочник Сотрудники, но в карточке сотрудника она так и не появляется. Выясним причину такого поведения системы и разберем правильные способы заполнения даты приема.
Проанализируем структуру конфигурации. В отличие от предыдущих редакций (например, ЗУП 2.5), в редакции 3.х справочник Сотрудники не содержит собственного реквизита для хранения даты приема на работу. В форме элемента и динамических списках это значение является расчетным.
Рассмотрим, как устроено хранение кадровых данных:
КадроваяИсторияСотрудников (а также вспомогательный КадроваяИсторияСотрудниковИнтервальный). Данные в этот регистр попадают исключительно при проведении кадровых документов-регистраторов.ТекущиеКадровыеДанныеСотрудников используется как быстрый кэш для отображения в формах и списках. Важно помнить: этот регистр обновляется автоматически при проведении или отмене проведения документов. Если попытаться записать дату приема напрямую в этот независимый регистр, при первой же кадровой операции или регламентном пересчете данные будут перезаписаны и затерты.Разберем основной и наиболее корректный вариант ввода начальных остатков по персоналу. В документе НачальнаяШтатнаяРасстановка в табличной части предусмотрен реквизит ДатаПриема. При проведении документа конфигурация автоматически делает необходимые движения по кадровым регистрам и обновляет регистр ТекущиеКадровыеДанныеСотрудников.
Посмотрим на пример программного создания и заполнения документа:
ДокументОбъект = Документы.НачальнаяШтатнаяРасстановка.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДата();
ДокументОбъект.Организация = ВыбраннаяОрганизация;
ДокументОбъект.Месяц = НачалоМесяца(ТекущаяДата());
СтрокаСотрудника = ДокументОбъект.Сотрудники.Добавить();
СтрокаСотрудника.Сотрудник = СсылкаНаСотрудника;
СтрокаСотрудника.Подразделение = ВыбранноеПодразделение;
СтрокаСотрудника.Должность = ВыбраннаяДолжность;
СтрокаСотрудника.КоличествоСтавок = 1;
СтрокаСотрудника.ДатаПриема = ДатаПриемаСотрудника;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
После проведения документа дата приема автоматически отобразится в карточке сотрудника и будет корректно использоваться во всех кадровых отчетах и расчетах стажа.
Если начальные данные вводятся не срезным документом штатной расстановки, а по мере фактического оформления трудовых отношений, используем стандартный документ ПриемНаРаботу (или ПриемНаРаботуСписком).
Разберем по шагам создание кадрового документа:
ДокументПрием = Документы.ПриемНаРаботу.СоздатьДокумент();
ДокументПрием.Дата = ТекущаяДата();
ДокументПрием.Организация = ВыбраннаяОрганизация;
ДокументПрием.Сотрудник = СсылкаНаСотрудника;
ДокументПрием.ФизическоеЛицо = СсылкаНаСотрудника.ФизическоеЛицо;
ДокументПрием.ДатаПриема = ДатаПриемаСотрудника;
ДокументПрием.Подразделение = ВыбранноеПодразделение;
ДокументПрием.Должность = ВыбраннаяДолжность;
ДокументПрием.КоличествоСтавок = 1;
ДокументПрием.Записать(РежимЗаписиДокумента.Проведение);
Обратите внимание: если по сотруднику уже был проведен документ НачальнаяШтатнаяРасстановка, создавать на него ПриемНаРаботу нельзя, чтобы избежать дублирования движений по кадровой истории.
При прямой загрузке данных из внешних систем или нестандартных баз часто применяется документ ПереносДанных с кодом регистратора ТДК. В этом случае формируются прямые движения по наборам записей регистров КадроваяИсторияСотрудников и ОсновныеДанныеКонтрактаДоговораСотрудника.
Этот способ требует точного заполнения всех служебных измерений и ресурсов кадровых регистров, поэтому рекомендуется использовать его только в рамках специализированных правил конвертации данных.
Если в дальнейшем вам потребуется программно получить дату приема сотрудника в коде внешних отчетов или обработок, не следует обращаться прямыми запросами к таблицам. Разработчики конфигурации предусмотрели универсальный API.
Посмотрим на вызов типовой функции кадрового учета:
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);
КадровыеПоля = "ДатаПриема";
ТаблицаКадровыхДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, КадровыеПоля, ТекущаяДата());
Если ТаблицаКадровыхДанных.Количество() > 0 Тогда
ДатаПриема = ТаблицаКадровыхДанных[0].ДатаПриема;
КонецЕсли;
Использование метода КадровыйУчет.КадровыеДанныеСотрудников гарантирует получение корректных сведений независимо от того, каким документом был зафиксирован прием на работу.