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

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

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

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

Почему нельзя использовать прямые запросы и обращение через точку?

Перед тем как перейти к коду, выясним причину, почему стандартные подходы из других конфигураций не работают в ЗУП 3.1:

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

Рассмотрим по шагам три основных и наиболее эффективных метода получения данных.

Способ 1. Получение данных на одного сотрудника (Самый простой вариант)

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

Разберем пример кода, который получает ФИО, должность и график работы сотрудника на текущую дату:


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

// Задаем список необходимых полей через запятую
НужныеПоля = "ФИОПолные, Должность, ГрафикРаботы";

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

// Заполняем параметры макета печатной формы
ОбластьШапки.Параметры.ФИО = КадровыеДанные.ФИОПолные;
ОбластьШапки.Параметры.Должность = КадровыеДанные.Должность;

// График работы является ссылкой на справочник, мы можем обратиться к его реквизитам
Если ЗначениеЗаполнено(КадровыеДанные.ГрафикРаботы) Тогда
    ОбластьШапки.Параметры.РежимРаботы = КадровыеДанные.ГрафикРаботы.РежимРаботы;
КонецЕсли;

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

Способ 2. Получение данных по списку сотрудников

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

Проанализируем ситуацию, когда нам нужно получить данные по массиву сотрудников:


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

// Формируем массив полей, которые мы хотим извлечь
МассивКадровыхДанных = Новый Массив;
МассивКадровыхДанных.Добавить("Должность");
МассивКадровыхДанных.Добавить("ГрафикРаботы");
МассивКадровыхДанных.Добавить("Подразделение");

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

// Проверяем, вернулись ли данные, и извлекаем их по индексу [0] для первого сотрудника
Если ТаблицаКадровыхДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаКадровыхДанных[0];
    
    ОбластьШапки.Параметры.Должность = СтрокаДанных.Должность;
    ОбластьШапки.Параметры.Подразделение = СтрокаДанных.Подразделение;
    
    Если ЗначениеЗаполнено(СтрокаДанных.ГрафикРаботы) Тогда
        ОбластьШапки.Параметры.РежимРаботы = СтрокаДанных.ГрафикРаботы.РежимРаботы;
    КонецЕсли;
КонецЕсли;

Способ 3. Использование Временных Таблиц (ВТ) в сложных запросах

Для опытных разработчиков, создающих сложные отчета или многостраничные печатные формы, лучшим решением по производительности будет интеграция кадровых данных прямо в текст вашего SQL-подобного запроса 1С. Для этого применяется метод создания временной таблицы кадровых данных.

Рассмотрим пример создания и использования ВТ в запросе:


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

// Шаг 1. Помещаем исходный список сотрудников во временную таблицу "ВТСотрудники"
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Договор.Сотрудник КАК Сотрудник,
    |	&Период КАК Период
    |ПОМЕСТИТЬ ВТСотрудники
    |ИЗ
    |	Документ.ДоговорРаботыУслуги КАК Договор
    |ГДЕ
    |	Договор.Ссылка В(&МассивСсылок)";

Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.Выполнить();

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

// Шаг 3. Соединяем нашу исходную таблицу с автоматически созданной таблицей "ВТКадровыеДанныеСотрудников"
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Договор.Ссылка КАК Ссылка,
    |	КадровыеДанные.ФИОПолные КАК ФИОПолные,
    |	КадровыеДанные.Должность КАК Должность,
    |	КадровыеДанные.ДокументПредставление КАК ПаспортныеДанные,
    |	КадровыеДанные.АдресПоПропискеПредставление КАК АдресРегистрации
    |ИЗ
    |	Документ.ДоговорРаботыУслуги КАК Договор
    |	ЛЕВОЕ СОЕДИНЕНИЕ ВТКадровыеДанныеСотрудников КАК КадровыеДанные
    |	ПО Договор.Сотрудник = КадровыеДанные.Сотрудник";

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

Пока Выборка.Следующий() Цикл
    // Заполнение параметров макета из выборки запроса
    ОбластьДоговора.Параметры.ФИО = Выборка.ФИОПолные;
    ОбластьДоговора.Параметры.Адрес = Выборка.АдресРегистрации;
    ОбластьДоговора.Параметры.Паспорт = Выборка.ПаспортныеДанные;
КонецЦикла;

Где найти полный список полей для запроса?

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

Вот список наиболее востребованных полей для повседневных задач:

Получение сопутствующих данных (Руководитель организации)

Часто в трудовом договоре или приказе требуется вывести не только данные сотрудника, но и подписанта — руководителя организации. Напрямую через кадровые данные сотрудника это сделать нельзя, но в ЗУП 3.1 для этого предусмотрен другой удобный механизм:


// Сначала получаем организацию сотрудника через кадровые данные
ОрганизацияСотрудника = КадровыеДанные.Организация;

// Получаем сведения об ответственных лицах организации на нужную дату
ОтветственныеЛица = СведенияОбОтветственныхЛицах.СведенияОбОтветственныхЛицах(ОрганизацияСотрудника, "Руководитель, ДолжностьРуководителя", ДатаПолучения);

// Заполняем параметры макета
ОбластьШапки.Параметры.ФИОДиректора = ОтветственныеЛица.Руководитель;
ОбластьШапки.Параметры.ДолжностьДиректора = ОтветственныеЛица.ДолжностьРуководителя;

Использование этого метода гарантирует, что если в организации сменился руководитель, печатная форма на дату старого документа выведет именно того директора, который действовал в то время.

Применяя описанные стандарты разработки, вы ускорите работу своих печатных форм, обезопасите код от ошибок при обновлениях 1С:ЗУП и напишете качественное решение, соответствующее лучшим практикам разработки фирмы «1С».

← На главную