Как программно получить документ приема на работу в 1С:ЗУП 3.1?

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

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

В этой статье мы подробно разберем, как получить документ приема «по-ЗУП-ошному», проанализируем основные методы общего модуля КадровыйУчет и научимся извлекать сопутствующие данные приказа.

Метод 1: Использование функции КадровыйУчет.КадровыеДанныеСотрудников

Это самый распространенный и рекомендуемый способ получения информации о сотрудниках. Основное преимущество метода заключается в том, что он возвращает готовую ТаблицуЗначений или Массив со всеми запрошенными данными на определенную дату. Для получения приказа о приеме нам необходимо использовать специфическое имя поля.

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


// Определяем параметры
СотрудникСсылка = Справочники.Сотрудники.НайтиПоНаименованию("Иванов Иван Иванович");
ДатаСреза = ТекущаяДата();

// Формируем список необходимых полей
// ПриказОПриеме - это ссылка на документ (Прием на работу или Прием на работу списком)
Поля = "ПриказОПриеме, ПриказОПриемеДата, ПриказОПриемеНомер";

// Вызываем стандартную функцию ЗУП
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СотрудникСсылка, Поля, ДатаСреза);

// Анализируем результат
Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    ДокументПриема = СтрокаДанных.ПриказОПриеме;
    Сообщить("Получен документ: " + ДокументПриема + " от " + СтрокаДанных.ПриказОПриемеДата);
КонецЕсли;

Разберем, что происходит в этом коде. Функция КадровыйУчет.КадровыеДанныеСотрудников принимает первым параметром признак ТолькоТекущиеДанные. Если передано Истина, система ищет данные на текущий момент, если Ложь — на указанную дату. Поле ПриказОПриеме является виртуальным: система сама обращается к нужным регистрам сведений (таким как «Кадровая история сотрудников») и вычисляет регистратор первого события приема для данного сотрудника в рамках его текущего рабочего периода.

Метод 2: Работа с данными через временные таблицы (ВТ)

Если вам необходимо получить документы приема сразу по большому количеству сотрудников (например, для построения сложного списка в отчете), вызов функции в цикле будет крайне неэффективным решением. В ЗУП 3.1 реализован механизм работы через Менеджер Временных Таблиц.

Проанализируем ситуацию: нам нужно в запросе соединить таблицу сотрудников с их приказами о приеме. Посмотрим, как это реализовать профессионально:


Запрос = Новый Запрос;
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

// Шаг 1: Создаем ВТ со списком сотрудников, по которым нужны данные
Запрос.Текст = "ВЫБРАТЬ Ссылка КАК Сотрудник ПОМЕСТИТЬ ВТСписокСотрудников ИЗ Справочник.Сотрудники ГДЕ НЕ ПометкаУдаления";
Запрос.Выполнить();

// Шаг 2: Вызываем системную процедуру для наполнения кадровых данных в ВТ
ОписательПолей = "ПриказОПриеме, ПриказОПриемеДата";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(МенеджерВТ, Истина, ОписательПолей, "ВТСписокСотрудников");

// Шаг 3: Теперь мы можем использовать ВТКадровыеДанныеСотрудников в своем запросе
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КадровыеДанные.Сотрудник,
    |	КадровыеДанные.ПриказОПриеме КАК ДокументСсылка
    |ИЗ
    |	ВТКадровыеДанныеСотрудников КАК КадровыеДанные";

Результат = Запрос.Выполнить().Выгрузить();

Этот метод является стандартом индустрии для разработки под ЗУП. Процедура СоздатьВТКадровыеДанныеСотрудников автоматически создает временную таблицу с именем ВТКадровыеДанныеСотрудников, в которой уже будут рассчитаны все необходимые поля. Это значительно быстрее, чем ручное соединение с регистрами, так как учитываются все тонкости учета (исправления документов, работа по совместительству и т.д.).

Метод 3: Использование функции СотрудникиОрганизации

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

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


ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыОтбора.Вставить("НачалоПериода", ДатаСреза);
ПараметрыОтбора.Вставить("КонецПериода", ДатаСреза);

ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыОтбора);
// В ТаблицаСотрудников будет колонка ДокументОснование

Важные нюансы и дополнительные поля

При получении документа приема важно помнить о нескольких особенностях архитектуры ЗУП 3.1:

  1. Одиночные и списочные документы: Если сотрудника приняли документом ПриемНаРаботуСписком, поле ПриказОПриеме вернет ссылку на весь документ целиком. Если вам нужно получить данные конкретной строки (например, условия работы), стандартный интерфейс всё равно вернет ссылку на объект-владелец.
  2. Трудовой договор: В ЗУП данные трудового договора часто хранятся в том же объекте, что и прием, но логически это разные сущности. Чтобы получить их программно, используйте поля ДатаДоговора и НомерДоговора в том же запросе к КадровыеДанныеСотрудников.
  3. Дата приема vs Дата приказа: Не путайте дату самого документа (когда он был создан) и дату события (с какого числа сотрудник вышел на работу). Поле ДатаПриема вернет именно дату начала работы, в то время как ПриказОПриемеДата вернет дату, указанную в шапке документа.

Рассмотрим, где искать полный список доступных полей. Если заглянуть «под капот» системы, то в общем модуле КадровыйУчетВнутренний есть функция ЗапросВТПостоянныеКадровыеДанныеСотрудников. Именно в ее комментариях разработчики фирмы «1С» поддерживают актуальный список параметров, которые можно запрашивать через ОписательПолей. Среди них:

Заключение

Подведем итог нашему анализу. Для получения документа приема на работу в ЗУП 3.1 всегда используйте методы общего модуля КадровыйУчет. Это избавляет вас от необходимости самостоятельно описывать сложные связи в запросах к регистрам КадроваяИсторияСотрудников или ОсновныеДанныеКонтрактовСотрудников. Для одиночных запросов идеально подходит КадровыеДанныеСотрудников, а для массовой обработки данных в отчетах — создание временных таблиц через СоздатьВТКадровыеДанныеСотрудников.

Помните, что программный интерфейс ЗУП спроектирован так, чтобы минимизировать ошибки разработчика при получении среза данных на исторические даты, что критически важно для корректного формирования отчетности и печатных форм приказов.

← На главную