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

Другое · 13 мин

Как выбрать работающих сотрудников в запросе 1С ЗУП 3.1

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

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

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

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

Первая и самая распространённая ошибка — запрос к справочнику «Сотрудники» с отбором вроде НЕ Сотрудники.ВАрхиве или по реквизиту «ГоловнойСотрудник». Такой запрос не отвечает на вопрос «работает ли сотрудник на дату», потому что справочник хранит карточки, а не трудовые отношения. Уволенный сотрудник может не быть помечен как архивный, а принятый с будущей датой — уже существовать в справочнике.

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

Основной способ: регистр «КадроваяИсторияСотрудников»

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

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

Вариант 1: интервальный регистр (рекомендуемый)

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

ВЫБРАТЬ РАЗЛИЧНЫЕ

История.Сотрудник КАК Сотрудник,

История.ФизическоеЛицо КАК ФизическоеЛицо,

История.Организация КАК Организация,

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

История.Должность КАК Должность

ИЗ

РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК История

ГДЕ

&Дата МЕЖДУ История.ДатаНачала И История.ДатаОкончания

И История.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

И История.Организация = &Организация

Обратите внимание: запись увольнения в интервальном регистре тоже существует (с даты увольнения), поэтому условие на ВидСобытия обязательно — иначе уволенные попадут в выборку.

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

Если интервальный регистр по какой-то причине недоступен (например, запрос строится в СКД с ограничениями), используют срез последних и определяют, было ли после него увольнение:

ВЫБРАТЬ

Срез.Сотрудник КАК Сотрудник

ПОМЕСТИТЬ ВТ_Работающие

ИЗ

РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Дата, Организация = &Организация) КАК Срез

ГДЕ

НЕ Срез.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

И НЕ ИСТИНА В (

ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА

ИЗ РегистрСведений.КадроваяИсторияСотрудников КАК Увольнения

ГДЕ Увольнения.Сотрудник = Срез.Сотрудник

И Увольнения.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

И Увольнения.Период <= &Дата)

Этот вариант тяжелее по производительности, поэтому в новых доработках предпочитайте интервальный регистр.

bsl
ВЫБРАТЬ РАЗЛИЧНЫЕ История.Сотрудник ИЗ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК История ГДЕ &Дата МЕЖДУ История.ДатаНачала И История.ДатаОкончания И История.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

Учёт организации, головных сотрудников и совместителей

Организация. В ЗУП одна информационная база обычно ведёт несколько организаций. Если не добавить отбор по организации, вы получите работающих по всем юрлицам сразу. Отбор по организации ставьте в параметры виртуальной таблицы или в условие ГДЕ — это и быстрее, и корректнее.

Совместители. Внутренние совместители — это отдельные элементы справочника «Сотрудники», связанные с головным через реквизит «ГоловнойСотрудник». Если нужен список только основных мест работы, добавьте условие История.Сотрудник = История.Сотрудник.ГоловнойСотрудник. Если нужны все договоры — это условие не добавляйте.

Внешние совместители учитываются как обычные сотрудники со своим видом занятости. Отличить их можно по реквизиту «ВидЗанятости» в той же кадровой истории (в интервальном регистре это поле присутствует): ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ОсновноеМестоРаботы) и другие значения перечисления.

Сравнение вариантов

Интервальный регистр

Быстро, просто, типовой механизм. Требует, чтобы интервальные записи были корректно заполнены (обновляются регламентно/при проведении).

Срез последних + проверка увольнения

Универсально, но медленнее и сложнее в отладке. Подходит, когда интервальный регистр недоступен.

Отбор по справочнику Сотрудники

Не рекомендуется: не учитывает даты приёма/увольнения и даёт ошибки на границах периодов.

Работающие на дату и работавшие в течение периода

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

ГДЕ

История.ДатаНачала <= &КонецПериода

И История.ДатаОкончания >= &НачалоПериода

И История.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

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

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

Как выбрать постановку задачи

Нужен список на конкретное число (например, на конец месяца)Используйте условие «&Дата МЕЖДУ ДатаНачала И ДатаОкончания»
Нужны все, кто работал хотя бы один день в периодеИспользуйте пересечение интервалов: ДатаНачала <= КонецПериода И ДатаОкончания >= НачалоПериода
Нужен список физлиц без дублейСгруппируйте результат по ФизическоеЛицо и уберите Сотрудник из выборки

Альтернатива: типовые функции и отчёты вместо запроса

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

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

Порядок действий для своего запроса
  1. 1
    Определите постановку: на дату или за период, сотрудники или физлица, одна организация или все
  2. 2
    Напишите запрос к интервальному регистру с условием на ВидСобытия
  3. 3
    Добавьте отборы по организации, подразделению, виду занятости при необходимости
  4. 4
    Выполните запрос в консоли запросов на тестовой дате
  5. 5
    Сверьте количество с типовым отчётом «Списки сотрудников» на ту же дату

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

Главный способ проверки — сверка с типовым отчётом. Возьмите отчёт «Штатная расстановка» или «Списки сотрудников» на ту же дату с теми же отборами по организации и сравните количество строк и список фамилий. Расхождение почти всегда означает одну из ошибок ниже.

Также проверьте граничные случаи: сотрудник, принятый завтрашней датой (не должен попасть в выборку на сегодня), уволенный вчера (не должен попасть), уволенный и принятый снова в одном месяце (должен быть в выборке один раз по актуальному договору), внутренний совместитель (должен или не должен попадать — в зависимости от постановки).

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

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

Количество работающих на дату
Норма

Совпадает с отчётом «Штатная расстановка» на ту же дату

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

Расхождение — ищите сотрудника-разницу и смотрите его кадровую историю

Сотрудник, уволенный на дату отбора
Норма

Отсутствует в выборке

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

Присутствует — не сработало условие на ВидСобытия

Сотрудник с датой приёма в будущем
Норма

Отсутствует в выборке на текущую дату

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

Присутствует — проверьте условие по датам интервала

Ограничения и риски

Интервальный регистр «КадроваяИсторияСотрудниковИнтервальный» заполняется автоматически при проведении кадровых документов и при обновлении конфигурации. Если в базе были переносы данных, ручные корректировки регистров или прерванные обновления, интервалы могут расходиться с основным регистром. Признак проблемы: типовой отчёт и ваш запрос дают разные списки. В этом случае не правьте запрос под симптом — сначала восстановите корректность данных (например, через типовые механизмы обновления кадровой истории или тестирование и исправление).

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

Часто задаваемые вопросы

Чем сотрудник отличается от физического лица в ЗУП 3.1?

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

Почему в выборку попал сотрудник, который ещё не вышел на работу?

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

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

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

Как выбрать работающих в СКД, где нельзя писать вложенные запросы свободно?

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

Что делать, если база обновлена, а интервальный регистр пустой или неполный?

Это признак того, что служебное заполнение интервалов не выполнено или прервано. Проверьте, заполнен ли основной регистр «КадроваяИсторияСотрудников»: если да, проблема именно в интервальных данных, и их нужно перезаполнить штатными средствами обновления. До устранения используйте вариант запроса через срез последних основного регистра.

Можно ли определить работающих по регистру расчётов или начислений?

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

Итог

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

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