К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить работающих сотрудников в 1С:ЗУП 3.1 программно

Запросы к регистрам ЗУП 3.1 для получения работающих сотрудников: КадроваяИсторияСотрудников, ВидыЗанятостиСотрудников, примеры кода, ошибки и проверка результата.

Задача получить список работающих сотрудников программно возникает в 1С:ЗУП 3.1 постоянно: при формировании отчётов, обменах, заполнении документов и проверках перед расчётом. Главная сложность в том, что у справочника «Сотрудники» нет простого реквизита «работает/уволен» — факт трудовых отношений хранится в регистрах сведений и зависит от даты, на которую выполняется проверка.

Корректное решение строится на запросах к регистрам «КадроваяИсторияСотрудников» и «ВидыЗанятостиСотрудников», а также на стандартных функциях общего модуля «КадровыйУчет». Ниже разобраны рабочие варианты запросов, универсальные функции, типичные ошибки и способы проверить результат перед использованием в продуктивном коде.

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

Справочник «Сотрудники» в ЗУП 3.1 — это лишь карточки физлиц в контексте организации. Сотрудник может быть принят, уволен, принят снова, работать по совместительству — и всё это отражается не в самом справочнике, а в регистрах. Реквизит «ДатаУвольнения» в карточке сотрудника существует, но заполняется не всегда корректно (например, при отмене увольнения или при работе по нескольким позициям), поэтому опираться на него нельзя.

Правильный источник данных — регистры сведений, которые конфигурация ведёт автоматически при проведении кадровых документов (ПриёмНаРаботу, КадровыйПеревод, Увольнение). Ключевые из них:

  • КадроваяИсторияСотрудников — периодический регистр с подразделением, должностью и видом события (Прием, Перемещение, Увольнение);
  • ВидыЗанятостиСотрудников — интервальный регистр с датами «ДатаСобытия» и «ДействуетДо» и признаком «ПлановоеУвольнение»;
  • ПараметрыПериодовВидовЗанятостиСотрудников и служебные регистры обновления — используются механизмами интервального учёта.

Базовый запрос: работающие на дату через ВидыЗанятостиСотрудников

Самый надёжный способ — запрос к интервальному регистру. В ЗУП 3.1 для него есть виртуальная таблица, но чаще используют прямой запрос с условиями на поля «ДатаСобытия» и «ДействуетДо»:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ВидыЗанятости.Сотрудник КАК Сотрудник,

| ВидыЗанятости.ГоловнаяОрганизация КАК Организация,

| ВидыЗанятости.ВидЗанятости КАК ВидЗанятости

|ИЗ

| РегистрСведений.ВидыЗанятостиСотрудников КАК ВидыЗанятости

|ГДЕ

| ВидыЗанятости.ДатаСобытия <= &Дата

| И ВидыЗанятости.ДействуетДо >= &Дата

| И НЕ ВидыЗанятости.ПлановоеУвольнение

| И ВидыЗанятости.ГоловнаяОрганизация = &Организация";

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

Запрос.УстановитьПараметр("Организация", Организация);

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

Условие «ДатаСобытия <= &Дата И ДействуетДо >= &Дата» выбирает интервалы, действующие на указанную дату. Признак «ПлановоеУвольнение» исключает сотрудников, у которых уже введено увольнение будущей датой — в зависимости от задачи их можно оставить (например, для списков на дату до увольнения они ещё работают).

Обратите внимание: параметр организации — это «ГоловнаяОрганизация». Если в базе ведутся обособленные подразделения как отдельные организации, отбор нужно строить через поле «ФизическоеЛицо» и связь с кадровой историей, где хранится конкретная организация.

Получение подразделения и должности: связка с КадроваяИсторияСотрудников

Сам по себе регистр видов занятости не содержит подразделения и должности. Если нужен список работающих с местами работы, добавляют соединение со срезом последних кадровой истории:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ВидыЗанятости.Сотрудник КАК Сотрудник,

| КадроваяИстория.Подразделение КАК Подразделение,

| КадроваяИстория.Должность КАК Должность

|ИЗ

| РегистрСведений.ВидыЗанятостиСотрудников КАК ВидыЗанятости

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(

| &Дата,

| Сотрудник В

| (ВЫБРАТЬ

| ВЗ.Сотрудник

| ИЗ

| РегистрСведений.ВидыЗанятостиСотрудников КАК ВЗ

| ГДЕ

| ВЗ.ДатаСобытия <= &Дата

| И ВЗ.ДействуетДо >= &Дата)) КАК КадроваяИстория

| ПО ВидыЗанятости.Сотрудник = КадроваяИстория.Сотрудник

|ГДЕ

| ВидыЗанятости.ДатаСобытия <= &Дата

| И ВидыЗанятости.ДействуетДо >= &Дата";

Такой запрос возвращает текущее место работы каждого работающего сотрудника. Для отбора по конкретному подразделению добавьте условие на «КадроваяИстория.Подразделение В ИЕРАРХИИ (&Подразделение)» — это учтёт дочерние подразделения.

Стандартные функции общего модуля КадровыйУчет

Для многих задач не нужно писать запрос вручную — в ЗУП 3.1 есть готовые программные интерфейсы. Основные точки входа:

  • КадровыйУчет.КадровыеДанныеСотрудников(Истина, Сотрудники, "Подразделение,Должность,ДатаУвольнения", Дата) — универсальное получение кадровых данных на дату;
  • отбор работающих через параметр «ОформленПоТрудовомуДоговору» и отбор по дате увольнения в кадровых данных;
  • отчёт «Штатная расстановка» и «Остатки отпусков» — как визуальный эталон для сверки.
bsl
СписокСотрудников = КадровыйУчет.РаботающиеСотрудникиОрганизации(Организация, ДатаОтбора);

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

Отбор сотрудников с договорами ГПХ и совместителями

Частый вопрос — считать ли «работающими» исполнителей по договорам ГПХ. В ЗУП 3.1 договоры ГПХ учитываются отдельно: документы «ДоговорРаботыУслуги» и регистры «ПериодыДействияДоговоровГражданскоПравовогоХарактера». Виды занятости для таких лиц отличаются, и в базовом запросе выше они не попадут в выборку, если фильтровать по трудовым отношениям.

Если нужен полный список занятых (трудовые + ГПХ), объединяйте два запроса через ОБЪЕДИНИТЬ ВСЕ: по «ВидыЗанятостиСотрудников» и по регистру договоров ГПХ с условием, что дата отбора попадает в период действия договора. Совместители (внутренние) — это отдельные элементы справочника «Сотрудники» с видом занятости «ВнутреннееСовместительство», поэтому они попадут в выборку как самостоятельные строки; при подсчёте численности по физлицам группируйте по «ФизическоеЛицо», а не по «Сотрудник».

Маршрут решения

Как выбрать способ

Нужен разовый список работающих без мест работыЗапрос к ВидыЗанятостиСотрудников с условием на интервал дат
Нужны подразделение и должностьСоединение со срезом последних КадроваяИсторияСотрудников
Нужны исполнители ГПХОтдельный запрос к регистру периодов договоров ГПХ и объединение выборок
Нужна численность физлиц без дублейГруппировка результата по полю ФизическоеЛицо

Проверка результата и типичные ошибки

После написания запроса результат обязательно сверьте с типовым отчётом: откройте «Штатную расстановку» или «Списки работающих сотрудников» на ту же дату и сравните количество строк. Расхождения почти всегда объясняются одной из перечисленных ниже ошибок.

Типичные ошибки
01
Отбор по реквизиту «ДатаУвольнения» справочника — поле не всегда заполнено, часть работающих теряется или, наоборот, попадают уволенные
02
Забыт признак «ПлановоеУвольнение» — в список попадают сотрудники с введённым увольнением будущей датой
03
Сравнение только по «ДатаСобытия» без «ДействуетДо» — выборка включает закрытые интервалы и даёт дубли
04
Группировка по «Сотрудник» вместо «ФизическоеЛицо» — внутренние совместители считаются дважды
05
Отбор по головной организации в базе с обособленными подразделениями — теряются сотрудники филиалов

Ещё одна ловушка — неактуальные данные интервального регистра после обмена или ручной корректировки документов. Если запрос возвращает явно неверный результат (например, уволенный полгода назад сотрудник числится работающим), проверьте, нет ли в журнале непроведённых или помеченных увольнений, и при необходимости выполните перепроведение кадровых документов по этому сотруднику на копии базы.

Контрольные точки

Как проверить результат

Количество строк запроса против отчёта «Штатная расстановка» на ту же дату
Норма

Числа совпадают или отличаются на известные позиции (ГПХ, плановые увольнения)

Тревожный признак

Расхождение без объяснимой причины — проверяйте условия запроса

Наличие в выборке недавно уволенных
Норма

Сотрудник с увольнением до даты отбора отсутствует

Тревожный признак

Уволенный присутствует — смотрите «ДействуетДо» и «ПлановоеУвольнение»

Дубли по одному физлицу
Норма

Дубли только у внутренних совместителей и это учтено

Тревожный признак

Одно физлицо с одной позицией встречается несколько раз

FAQ

Можно ли получить работающих сотрудников через СКД без кода?

Да. Создайте набор данных-запрос к «ВидыЗанятостиСотрудников» с теми же условиями на интервал дат, вынесите дату отбора в параметры СКД и добавьте связь с кадровой историей для вывода должности. Такой отчёт пользователи смогут открывать и настраивать без изменения кода.

Как получить сотрудников, работавших в произвольном периоде, а не на одну дату?

Измените условие с попадания даты в интервал на пересечение интервалов: «ДатаСобытия <= &КонецПериода И ДействуетДо >= &НачалоПериода». Это выберет всех, кто работал хотя бы часть периода, включая принятых и уволенных внутри него.

Почему запрос возвращает пустой результат, хотя сотрудники есть?

Чаще всего неверно передана дата (например, пустая дата или дата с временем при сравнении «ДействуетДо >= &Дата») либо отбор по головной организации, тогда как сотрудники оформлены на другую организацию. Проверьте параметры и выполните запрос без отбора по организации.

Нужно ли учитывать сотрудников в отпуске по уходу за ребёнком?

Да, формально они работающие — трудовой договор действует. В «ВидыЗанятостиСотрудников» их интервал остаётся открытым. Если для задачи они не нужны (например, для расчёта явочной численности), дополнительно исключайте их по регистру состояний сотрудников «СостоянияСотрудников».

Где посмотреть состав полей регистров в моей версии ЗУП?

В конфигураторе: «Конфигурация — Открыть конфигурацию», ветка «Регистры сведений — ВидыЗанятостиСотрудников» и «КадроваяИсторияСотрудников». Там же видно измерения, ресурсы и признак периодичности, что помогает корректно составить запрос под конкретный релиз.

Безопасно ли выполнять такие запросы в рабочей базе?

Запросы на чтение не изменяют данные и безопасны. Риск только в производительности: тяжёлый запрос в сеансе пользователя может надолго заблокировать таблицы на чтение в файловой базе. Тестируйте на копии и не запускайте массовые обходы в цикле с запросом внутри — выносите запрос из цикла.

Итог

Что важно запомнить

Работающих сотрудников в ЗУП 3.1 определяют по интервальному регистру «ВидыЗанятостиСотрудников» с условием попадания даты в интервал и учётом признака «ПлановоеУвольнение»; подразделение и должность берут из среза «КадроваяИсторияСотрудников». Результат всегда сверяйте с типовым отчётом, а имена стандартных функций — с вашим релизом конфигурации.