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