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

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




