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