Как в 1С:ЗУП 3.1 определить дату возникновения вакансии для автоматического закрытия свободных ставок?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

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

В чем заключается главная сложность учета ставок?

При попытке спроектировать алгоритм автоматического закрытия ставок разработчики часто попадают в логическую ловушку «серийного» учета. Рассмотрим типичную ситуацию, которая приводит в тупик:

  1. В январе по определенной позиции штатного расписания открывается 3 ставки, на которые сразу принимают трех сотрудников.
  2. В феврале увольняется первый сотрудник (освобождается 1 ставка).
  3. В марте увольняется второй сотрудник (освобождается еще 1 ставка, суммарно свободно 2).
  4. В апреле на работу принимается новый сотрудник. Он занимает одну из свободных ставок.

Возникает вопрос: какую именно ставку занял апрельский сотрудник — ту, которая освободилась в феврале, или мартовскую? Если мы посчитаем, что он занял февральскую ставку, то мартовская остается вакантной и должна быть закрыта через 6 месяцев (в сентябре). Если же он занял мартовскую, то закрывать нужно февральскую ставку в августе.

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

Математический алгоритм анализа свободных ставок

Чтобы определить, имеем ли мы право закрыть ставку по истечении 6 месяцев, проанализируем историю изменения количества свободных ставок по позиции за этот период:

Давайте разберем это на примере. На позиции числится 3 ставки. В феврале уволился один сотрудник (свободно ставок: 1). В марте уволился второй (свободно ставок: 2). В апреле приняли одного сотрудника (свободно ставок снова стало 1). С февраля по август минимальное количество свободных ставок равнялось 1. Оно ни разу не опустилось до 0. Следовательно, в августе мы имеем полное право сократить ровно 1 ставку по этой позиции.

Где физически хранятся данные в 1С:ЗУП 3.1?

Для реализации алгоритма нам понадобятся данные регистров сведений, в которых фиксируется состояние штатного расписания и занятость сотрудников. Начиная с релиза 3.1.10, в программе используются два ключевых регистра:

  1. РегистрСведений.ЗанятостьПозицийШтатногоРасписания — хранит текущие остатки и записи о занятости ставок.
  2. РегистрСведений.ЗанятостьПозицийШтатногоРасписанияИнтервальный — интервальный аналог, который идеально подходит для анализа истории за периоды, так как содержит готовые даты начала и окончания состояний занятости.

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

Реализация программного алгоритма в 1С

Для автоматизации процесса создадим внешнюю обработку или регламентное задание, которое будет запускаться раз в месяц и анализировать штатную расстановку. Рассмотрим пример построения запроса к интервальному регистру сведений для анализа изменений свободных ставок.

Проанализируем следующий пример кода, который собирает данные о занятости позиций за последние 6 месяцев:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Интервалы.ПозицияШтатногоРасписания КАК Позиция,
|	Интервалы.ДатаНачала КАК ДатаНачала,
|	Интервалы.ДатаОкончания КАК ДатаОкончания,
|	Интервалы.КоличествоСтавок КАК КоличествоСтавок,
|	Интервалы.ВидЗанятости КАК ВидЗанятости
|ИЗ
|	РегистрСведений.ЗанятостьПозицийШтатногоРасписанияИнтервальный КАК Интервалы
|ГДЕ
|	Интервалы.ДатаНачала <= &КонецПериодаПроверки
|	И (Интервалы.ДатаОкончания >= &НачалоПериодаПроверки ИЛИ Интервалы.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1))";

Запрос.УстановитьПараметр("КонецПериодаПроверки", ТекущаяДата());
// Период проверки — 6 месяцев назад от текущей даты
Запрос.УстановитьПараметр("НачалоПериодаПроверки", ДобавитьМесяц(ТекущаяДата(), -6));

РезультатЗапроса = Запрос.Выполнить();

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


ТаблицаСвободныхСтавок = РезультатЗапроса.Выгрузить();

Для Каждого СтрокаПозиции Из ТаблицаУникальныхПозиций Цикл
	
	// Получаем историю изменения свободных ставок по конкретной позиции
	ПараметрыОтбора = Новый Структура("Позиция", СтрокаПозиции.Позиция);
	ИсторияПозиции = ТаблицаСвободныхСтавок.НайтиСтроки(ПараметрыОтбора);
	
	// Нам нужно определить минимальное количество свободных ставок в каждом дне проверяемого периода
	МинимальноеКоличествоСвободныхЗа6Месяцев = ВычислитьМинимумСвободныхСтавок(ИсторияПозиции, НачалоПериодаПроверки, КонецПериодаПроверки);
	
	Если МинимальноеКоличествоСвободныхЗа6Месяцев > 0 Тогда
		// У нас есть как минимум одна ставка, которая непрерывно пустовала 6 месяцев.
		// Инициируем процедуру ее автоматического закрытия в количестве, равном найденному минимуму.
		ЗакрытьВакантнуюСтавку(СтрокаПозиции.Позиция, МинимальноеКоличествоСвободныхЗа6Месяцев);
	КонецЕсли;
	
КонецЦикла;

Сложные кадровые случаи, которые необходимо учесть

При написании логики закрытия ставок крайне важно предусмотреть исключения, чтобы не нарушить требования законодательства и внутренние регламенты учета. Рассмотрим критически важные нюансы:

1. Временное освобождение ставок (декретные позиции)

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

Решение: В алгоритме анализа такие ставки необходимо полностью игнорировать. За основным сотрудником по закону сохраняется его рабочее место, и закрывать такую ставку в штатном расписании нельзя.

2. Внутренние кадровые переводы

При перемещении сотрудников между позициями внутри организации даты освобождения ставок фиксируются на дату проведения документа «Кадровый перевод». Наш алгоритм должен четко отслеживать эти даты как даты начала отсчета вакантности для освободившейся позиции.

Альтернатива для пользователей версии ЗУП КОРП

Если ваша организация использует версию 1С:ЗУП КОРП, то задача значительно упрощается за счет наличия встроенного модуля подбора персонала. В КОРП-версии присутствует специализированный справочник Справочник.Вакансии.

При открытии вакансии на конкретную позицию создается элемент этого справочника, в котором фиксируется реквизит ДатаОткрытия и плановые сроки работы по поиску кандидата. Программа ведет полноценный жизненный цикл вакансий («Открыта», «Приостановлена», «Закрыта»). В этом случае у вас появляется четкий аналитический объект, позволяющий контролировать сроки нахождения вакансии в работе без сложных математических расчетов остатков по регистрам занятости.

Как завершить автоматизацию: создание документа изменений

После того как наш алгоритм выявил позиции и количество ставок, подлежащих закрытию, завершающим шагом должно стать создание документа «Изменение штатного расписания». Мы можем программно сформировать этот документ, заполнить в нем дату закрытия, подобрать выявленные позиции и уменьшить количество ставок на рассчитанную величину.

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

← На главную