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

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

При работе с конфигурацией 1С:Зарплата и Управление Персоналом 3.1 программисты часто сталкиваются с особенностями документа Начальная штатная расстановка. Этот документ используется для ввода входящих остатков при начале эксплуатации программы. В отличие от стандартного документа Прием на работу, он имеет специфическую логику записи данных в регистры, которая может меняться от релиза к релизу. Разберем подробно, как гарантированно получить дату приема сотрудника, если она была введена именно через этот документ.

В чем заключается сложность?

Проанализируем ситуацию: в ранних релизах ЗУП 3.1 (например, 3.1.6.37) документ Начальная штатная расстановка записывал данные в регистр сведений Кадровая история сотрудников, где в поле Период попадала реальная дата приема. Однако в более новых версиях логика изменилась. Теперь поле Период в этом регистре для данного документа всегда соответствует дате начала учета (например, первому числу месяца, указанного в шапке документа), а реальная дата приема «прячется» в других полях или регистрах. Это сделано для корректного формирования штатной расстановки на дату запуска системы.

Способ 1: Использование регистра «Текущие кадровые данные сотрудников»

Наиболее простым и эффективным способом получения актуальной даты приема является обращение к регистру сведений Текущие кадровые данные сотрудников. Этот регистр является непериодическим и хранит «срез» самых последних данных по каждому сотруднику.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТекущиеКадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема
    |ИЗ
    |	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
    |ГДЕ
    |	ТекущиеКадровыеДанныеСотрудников.Сотрудник = &Сотрудник";

Запрос.УстановитьПараметр("Сотрудник", ВыбранныйСотрудник);
РезультатЗапроса = Запрос.Выполнить();

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

Способ 2: Обращение к ресурсу «Дата приема (ПФР)»

Если вам необходимо работать именно с регистром Кадровая история сотрудников, важно знать об изменениях в его структуре. В современных релизах реальная дата события для документа Начальная штатная расстановка вынесена в отдельный ресурс.

Выясним причину: Период теперь используется для фиксации состояния сотрудника в системе на момент ввода остатков, а для отчетности (например, в ПФР/СФР) используется поле ДатаПриемаПФР. Посмотрим на пример обращения к этому полю в запросе:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КадроваяИстория.ДатаПриемаПФР КАК РеальнаяДатаПриема
    |ИЗ
    |	РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИстория
    |ГДЕ
    |	КадроваяИстория.Сотрудник = &Сотрудник
    |	И КадроваяИстория.Регистратор ССЫЛКА Документ.НачальнаяШтатнаяРасстановка";

Использование этого поля позволяет обойти проблему «смещения» периода документа на начало месяца эксплуатации.

Способ 3: Использование вспомогательного регистра «Данные о работе сотрудников»

Существует еще один специализированный регистр — Данные о работе сотрудников. Он также является непериодическим и оптимизирован для быстрого получения кадровых дат. Система автоматически поддерживает его в актуальном состоянии при проведении документов кадрового учета.

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

Способ 4: Программный интерфейс (API) конфигурации

В современной разработке на платформе 1С:Предприятие 8.3 крайне не рекомендуется писать прямые запросы к регистрам сведений, если есть готовые функции в общих модулях. Это гарантирует, что ваш код не сломается при очередном обновлении структуры метаданных.

Разберем использование общего модуля КадровыйУчет. Нам понадобится функция КадровыеДанныеСотрудников. Она принимает массив сотрудников и список полей, которые нужно получить.


СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(СотрудникСсылка);

СписокПолей = "ДатаПриема";

ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Ложь, СписокСотрудников, СписокПолей);

Если ТаблицаДанных.Количество() > 0 Тогда
    ДатаПриема = ТаблицаДанных[0].ДатаПриема;
КонецЕсли;

Этот метод является наиболее правильным с точки зрения архитектуры ЗУП 3.1. Метод сам определит, из какого регистра (или комбинации регистров) лучше извлечь данные, учитывая наличие документа Начальная штатная расстановка.

Способ 5: Получение данных напрямую из объекта документа

Иногда возникает необходимость получить дату непосредственно из самого документа Начальная штатная расстановка, не обращаясь к регистрам (например, если документ еще не проведен). Помните, что этот документ является многострочным.

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

  1. Получаем объект документа или его ссылку.
  2. Обращаемся к табличной части Сотрудники.
  3. Используем метод Найти() для поиска строки по конкретному сотруднику.

ПараметрыОтбора = Новый Структура("Сотрудник", НужныйСотрудник);
СтрокиДокумента = ОбъектДокумента.Сотрудники.НайтиСтроки(ПараметрыОтбора);

Если СтрокиДокумента.Количество() > 0 Тогда
    ДатаПриема = СтрокиДокумента[0].ДатаПриема;
КонецЕсли;

Подведем итоги

Выбор метода зависит от вашей конкретной задачи:

Во-первых, если нужно быстро получить текущую дату для отчета или формы — используйте РегистрСведений.ТекущиеКадровыеДанныеСотрудников.

Во-вторых, если вы пишете сложный кадровый алгоритм — используйте API функции модуля КадровыйУчет. Это защитит ваш код от изменений логики хранения данных в будущих релизах.

В-третьих, если вы столкнулись с тем, что в Кадровой истории даты «съехали» на 1-е число месяца — обязательно проверьте значение ресурса ДатаПриемаПФР.

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

← На главную