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