Как в 1С:ЗУП 3.1 получить данные о приеме на работу сотрудника для печатной формы

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

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

Способ 1: Использование запросов к регистрам сведений

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

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

Пример правильного построения полей запроса для получения данных договора:


ВЫБРАТЬ
    ЕСТЬNULL(ДанныеКонтракта.НомерДоговораКонтракта, ПриемНаРаботу.ТрудовойДоговорНомер) КАК НомерДоговора,
    ЕСТЬNULL(ДанныеКонтракта.ДатаДоговораКонтракта, ПриемНаРаботу.ТрудовойДоговорДата) КАК ДатаДоговора
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеДанныеКонтрактаДоговораСотрудника.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК ДанныеКонтракта
    ПО Сотрудники.Ссылка = ДанныеКонтракта.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК ПриемНаРаботу
    ПО Сотрудники.Ссылка = ПриемНаРаботу.Сотрудник И ПриемНаРаботу.Проведен
ГДЕ
    Сотрудники.Ссылка = &Сотрудник

Обратим внимание на использование функции ЕСТЬNULL. В ЗУП 3.1 данные могут записываться как непосредственно в регистр (при проведении кадровых документов), так и оставаться в самом документе ПриемНаРаботу, если регистр по каким-то причинам не был заполнен. Такое соединение гарантирует получение номера договора.

Способ 2: Использование типового программного интерфейса (API) ЗУП

Наиболее эффективный и современный способ получения данных в ЗУП 3.1 — использование функции КадровыйУчет.КадровыеДанныеСотрудников. Этот метод позволяет получить практически любые сведения (ФИО, паспортные данные, должность, подразделение, дата приема) одной строкой кода, не описывая сложные соединения в запросах.

Разберем по шагам, как применить этот метод в коде печатной формы:

  1. Подготовим массив сотрудников. Даже если нам нужен один человек, функция принимает массив ссылок.
  2. Определим список необходимых полей. Поля указываются строкой через запятую (например, "ФИОПолные, Должность, ДатаПриема, НомерДоговора").
  3. Вызовем функцию. Передадим дату, на которую нам нужны актуальные сведения.

Пример реализации на встроенном языке:


// Определим сотрудника (например, из ссылки на объект)
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);

// Список нужных нам полей
Поля = "ФИОПолные, Должность, Подразделение, ДатаПриема, НомерДоговора, ДатаДоговора";

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

// Извлекаем результат
Если ТаблицаДанных.Количество() > 0 Тогда
    Данные = ТаблицаДанных[0];
    НомерДоговора = Данные.НомерДоговора;
    ДолжностьСотрудника = Данные.Должность;
КонецЕсли;

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

Различие между «Сотрудником» и «Физическим лицом»

Выясним причину, почему иногда не удается найти данные паспорта или ИНН в регистрах сотрудников. В архитектуре ЗУП 3.1 персональные данные привязаны к справочнику ФизическиеЛица, в то время как кадровые (должность, табельный номер) — к справочнику Сотрудники. Один человек (Физлицо) может иметь несколько карточек сотрудников (например, основное место работы и внутреннее совместительство).

Для получения паспортных данных в печатной форме используйте регистр сведений ДокументыФизическихЛиц. Если вы используете функцию КадровыеДанныеСотрудников, она сама "под капотом" выполнит соединение с данными физического лица, если вы укажете соответствующие поля (например, "ДокументНомер", "ДокументСерия").

Проблема: «Печатает только последнего созданного сотрудника»

Проанализируем ситуацию, описанную в обсуждении, когда запрос возвращает данные не того сотрудника. Это происходит из-за неправильной работы с виртуальными таблицами. В параметрах виртуальной таблицы СрезПоследних крайне важно передавать условие по сотруднику.

Если написать условие в секции ГДЕ, система сначала получит последние записи по всем сотрудникам организации, а уже потом отфильтрует их. Если у выбранного сотрудника последняя запись в истории не совпадает с глобально последней записью регистра, результат может быть пустым или неверным. Всегда передавайте фильтр в параметры таблицы:

РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, Сотрудник = &НужныйСотрудник)

Полезные функции для оформления ФИО

В печатных формах (особенно в трудовых договорах) часто требуется склонение ФИО по падежам. В ЗУП 3.1 для этого не нужно писать свои функции. Рассмотрим стандартные возможности:

Для склонения ФИО используйте функции БСП. Например, чтобы получить ФИО в родительном падеже:


РезультатСклонения = "";
ФизическиеЛица.Просклонять(ДанныеСотрудника.ФИОПолные, 2, РезультатСклонения, ДанныеСотрудника.Пол);

Также для формирования краткого ФИО (Иванов И.И.) удобно использовать функцию ФизическиеЛица.ФамилияИнициалыФизЛица(ФИО). Это сэкономит время и сделает ваш код чище и надежнее.

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

← На главную