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