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