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

Модуль КадровыйУчет входит в зарплатно-кадровую библиотеку, на которой построены ЗУП, ERP и КА, а не в БСП, хотя пользуется её механизмами. Примеры ниже — для ЗУП 3.1; набор доступных полей и параметры функций сверяйте с описанием в своей версии.

Почему не писать свой запрос

ФИО, подразделение, должность, ставка, вид занятости, ФОТ, состояние «в отпуске» или «на больничном» хранятся в разных периодических регистрах. Правильный запрос на дату с учётом совместительства, исправлений и сторно — это сотни строк, и после очередного обновления ЗУП он может перестать работать: разработчики меняют регистры, добавляют измерения.

Функции модуля КадровыйУчет:

  • знают, из каких регистров брать каждое поле;
  • работают и для одного сотрудника, и для массива;
  • поддерживают проверку прав (ТолькоРазрешенные);
  • обновляются вместе с конфигурацией.
ЗадачаФункция
Данные физлиц на одну дату, результат — таблицаКадровыйУчет.КадровыеДанныеФизическихЛиц
Данные сотрудников на одну дату, результат — таблицаКадровыйУчет.КадровыеДанныеСотрудников
То же, но во временную таблицуСоздатьНаДатуВТКадровыеДанныеФизическихЛиц, СоздатьНаДатуВТКадровыеДанныеСотрудников
Данные на разные даты для разных строкЗапросВТКадровыеДанныеФизическихЛиц, ЗапросВТКадровыеДанныеСотрудников

Полный список полей смотрите в описании функций КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников и КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеФизическихЛиц вашей конфигурации.

Кадровые данные физического лица на дату

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

1С
// Выводит фамилию физического лица, действующую на указанную дату.
Процедура ПоказатьФамилиюНаДату(ФизическоеЛицо, ДатаДанных)

	КадровыеДанные = КадровыйУчет.КадровыеДанныеФизическихЛиц(Истина, ФизическоеЛицо,
		"Фамилия, Имя, Отчество", ДатаДанных);

	Для Каждого СтрокаДанных Из КадровыеДанные Цикл
		ОбщегоНазначения.СообщитьПользователю(СтрШаблон("%1: на %2 фамилия %3",
			СтрокаДанных.ФизическоеЛицо, Формат(ДатаДанных, "ДЛФ=D"), СтрокаДанных.Фамилия));
	КонецЦикла;

КонецПроцедуры

ФИО в ЗУП ведётся с историей. Если у сотрудника менялась фамилия, функция вернёт ту, что действовала на дату — именно это нужно для печатных форм приказов, датированных прошлым периодом.

Дополнительные отборы периодических данных

Последний параметр позволяет наложить условие на регистр, из которого берутся данные. Структура: ключ — имя регистра, значение — массив условий с полями ЛевоеЗначение, ВидСравнения, ПравоеЗначение.

1С
УсловиеОтбора = Новый Структура;
УсловиеОтбора.Вставить("ЛевоеЗначение", "Отчество");
УсловиеОтбора.Вставить("ВидСравнения", "ПОДОБНО");
УсловиеОтбора.Вставить("ПравоеЗначение", """Вади%""");

Условия = Новый Массив;
Условия.Добавить(УсловиеОтбора);

ОтборыПериодическихДанных = Новый Структура("ФИОФизическихЛиц", Условия);

КадровыеДанные = КадровыйУчет.КадровыеДанныеФизическихЛиц(Истина, ФизическоеЛицо,
	"Фамилия", ДатаДанных, ОтборыПериодическихДанных);

Обратите внимание: правое значение — это фрагмент текста запроса, поэтому строка передаётся в кавычках внутри строки. Механизм удобен, но читается тяжело — применяю его редко, когда без отбора на уровне регистра не обойтись.

Кадровые данные сотрудников: должность, подразделение, ФОТ

Для сотрудников — КадровыеДанныеСотрудников. В параметр списка можно передать одну ссылку или массив.

1С
// Возвращает таблицу с подразделением и должностью сотрудников на дату.
Функция ДолжностиСотрудников(МассивСотрудников, ДатаДанных) Экспорт

	Возврат КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников,
		"Подразделение, Должность, ДатаПриема, ДатаУвольнения", ДатаДанных);

КонецФункции

Функцию не вызывайте в цикле по сотрудникам — передавайте массив целиком. Внутри строится один запрос, и разница на сотнях сотрудников ощутима.

Временные таблицы: кадровые данные внутри своего запроса

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

1С
Функция СотрудникиСФамилиейИДолжностью(МассивСотрудников, МассивФизлиц, ДатаДанных) Экспорт

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

	КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеСотрудников(МенеджерВТ, Истина, МассивСотрудников,
		"Подразделение, Должность, ФОТ", ДатаДанных);
	КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеФизическихЛиц(МенеджерВТ, Истина, МассивФизлиц,
		"Фамилия", ДатаДанных);

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

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

КонецФункции

Массив физлиц можно не собирать отдельно — получите его запросом по реквизиту ФизическоеЛицо сотрудников или сначала выберите сотрудников во временную таблицу.

Данные на разные даты одним запросом

Типичная задача — печать пачки кадровых документов с разными датами: для каждого нужны ФИО и должность на дату документа. Запрос в цикле по документам — плохая идея. Функции ЗапросВТКадровыеДанные… принимают описание временной таблицы со списком «кто — на какую дату» и возвращают объект Запрос, который нужно выполнить в вашем менеджере.

Кадровые данные сотрудников ЗУП на разные даты: одна запись, разные значения в разные периоды
Кадровые данные сотрудников ЗУП на разные даты: одна запись, разные значения в разные периоды

Шаг 1. Временная таблица отборов с колонками ФизическоеЛицо и Период:

1С
МенеджерВТ = Новый МенеджерВременныхТаблиц;

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

ТаблицаДокументов — таблица значений с типизированными колонками ФизическоеЛицо и Дата; без описания типов колонок платформа не сможет использовать её как источник в запросе.

Шаг 2. Описание таблицы отборов и получение кадровых данных:

1С
ОписаниеОтборов = КадровыйУчет.ОписаниеВременнойТаблицыОтборовФизическихЛиц("ВТФизическиеЛица");

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

Шаг 3. Используем ВТКадровыеДанныеФизическихЛиц — в ней строка на каждую пару «физлицо — период»:

1С
Запрос.Текст =
"ВЫБРАТЬ
|	Данные.ФизическоеЛицо КАК ФизическоеЛицо,
|	Данные.Период КАК Период,
|	Данные.Фамилия КАК Фамилия,
|	Данные.Имя КАК Имя,
|	Данные.Отчество КАК Отчество
|ИЗ
|	ВТКадровыеДанныеФизическихЛиц КАК Данные";
КадровыеДанные = Запрос.Выполнить().Выгрузить();

Если колонки называются иначе, чем ФизическоеЛицо и Период, их имена передаются параметрами функции описания. Для сотрудников есть аналогичная пара функций описания отборов и ЗапросВТКадровыеДанныеСотрудников.

Типичные ошибки

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

Нужна печатная форма или отчёт по кадровым данным с учётом истории — это типичная доработка 1С:ЗУП; отчёты удобно строить на СКД с теми же временными таблицами.

Итог

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