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