В процессе автоматизации HR-задач часто возникает вопрос: как связать между собой разные этапы подбора персонала? Например, как сделать так, чтобы система сама отслеживала состояние вакансий при работе с кандидатами. В этой статье мы разберем, как реализовать автоматическое изменение данных в справочнике "Вакансии" при оформлении приема нового сотрудника.
Изначальный вопрос на форуме звучал так: "Чтобы при добавлении данных в справочник 'Соискатели', в справочнике 'Вакансии' данная вакансия уходила в минус". Проанализируем эту задачу и рассмотрим наиболее правильные и эффективные способы ее решения.
Первое, на что стоит обратить внимание, — это логика самого процесса. Появление нового соискателя еще не означает, что вакансия закрыта. Кандидатов может быть много, они проходят собеседования, и только один из них (или несколько, если вакансия массовая) в итоге будет принят на работу. Поэтому связывать изменение в справочнике "Вакансии" с созданием элемента в справочнике "Соискатели" — неверно.
Правильный подход: действие с вакансией должно происходить в момент, когда событие найма юридически и фактически зафиксировано в системе. Чаще всего для этого используется документ "Прием на работу". Именно в этом документе указывается и принятый сотрудник, и вакансия, на которую он зачислен. Таким образом, триггером для изменения статуса вакансии должно служить проведение документа "Прием на работу".
Рассмотрим несколько основных способов, как можно реализовать эту автоматизацию в среде "1С:Предприятие". Выбор конкретного метода зависит от вашей конфигурации (типовая или измененная) и предпочтений в разработке.
Это самый современный и рекомендуемый способ, особенно если вы работаете с типовой конфигурацией, которую нежелательно изменять. Подписка на события позволяет добавить свою логику, не затрагивая код стандартных объектов.
Что это такое? Подписка на событие — это механизм платформы, который позволяет "перехватить" определенное событие (например, запись или проведение документа) и выполнить связанный с ним программный код, расположенный в общем модуле.
Разберем по шагам, как это настроить:
"ЗакрытьВакансиюПриПриемеНаРаботу".ДокументОбъект.ПриемНаРаботу. Это объект, за которым мы будем следить.Проведение. Это момент, когда наша логика должна сработать.УправлениеПерсоналом.ЗакрытьВакансиюПриПроведенииПриемаНаРаботу. Не забудьте установить у общего модуля флаги "Сервер", "Внешнее соединение" и "Вызов сервера".Источник и Отказ.Пример кода в общем модуле:
Процедура ЗакрытьВакансиюПриПроведенииПриемаНаРаботу(Источник, Отказ, РежимПроведения) Экспорт
// Источник - это сам документ "Прием на работу", который сейчас проводится
ДокументПриема = Источник;
// Предположим, в документе есть реквизит "Вакансия",
// который ссылается на элемент справочника "Вакансии"
Если НЕ ЗначениеЗаполнено(ДокументПриема.Вакансия) Тогда
// Если вакансия не указана, ничего не делаем
Возврат;
КонецЕсли;
// Получаем объект справочника "Вакансии" для изменения
ВакансияОбъект = ДокументПриема.Вакансия.ПолучитьОбъект();
// Далее реализуем логику изменения. Например, меняем статус.
// Предположим, есть реквизит "Состояние" типа Перечисление.СтатусыВакансий
Если НЕ ВакансияОбъект.Состояние = Перечисления.СтатусыВакансий.Закрыта Тогда
ВакансияОбъект.Состояние = Перечисления.СтатусыВакансий.Закрыта;
// Записываем изменения в базу данных
// Обернем в Попытку для надежности
Попытка
ВакансияОбъект.Записать();
Исключение
// Можно записать ошибку в журнал регистрации
ЗаписьЖурналаРегистрации("Закрытие вакансии", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось изменить статус вакансии: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Этот подход является наиболее гибким и безопасным для поддержки конфигурации в будущем.
Это классический подход, при котором вся логика пишется непосредственно в модуле самого документа "Прием на работу".
Как это работает? Вы открываете модуль объекта документа "Прием на работу" и находите процедуру обработчика события ОбработкаПроведения(). Внутри этой процедуры, после всех основных движений документа, вы дописываете свой код.
Пример кода в модуле документа "Прием на работу":
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ... здесь идет стандартный код проведения документа по регистрам ...
// Наш дополнительный код для изменения вакансии
// Проверяем, что вакансия указана в документе
Если ЗначениеЗаполнено(ЭтотОбъект.Вакансия) Тогда
// Получаем объект вакансии
ВакансияОбъект = ЭтотОбъект.Вакансия.ПолучитьОбъект();
// Уменьшаем количество свободных мест на 1
// Предположим, есть реквизит "КоличествоМест"
Если ВакансияОбъект.КоличествоМест > 0 Тогда
ВакансияОбъект.КоличествоМест = ВакансияОбъект.КоличествоМест - 1;
// Если мест больше не осталось, меняем статус
Если ВакансияОбъект.КоличествоМест = 0 Тогда
ВакансияОбъект.Состояние = Перечисления.СтатусыВакансий.Закрыта;
КонецЕсли;
// Записываем изменения
ВакансияОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Недостаток этого метода в том, что он требует снятия конфигурации с поддержки, если она типовая. Это может существенно усложнить процесс будущих обновлений.
Фразу автора "уходила в минус" можно реализовать по-разному. Проанализируем самые популярные и практичные варианты.
В справочнике "Вакансии" создается числовой реквизит, например, "КоличествоОткрытыхМест". При создании новой вакансии пользователь указывает, сколько человек нужно нанять. При каждом проведении документа "Прием на работу" по этой вакансии, значение реквизита уменьшается на единицу.
Важные моменты:
Это более гибкий и часто используемый подход, предложенный на форуме. В справочнике "Вакансии" создается реквизит "Состояние", который может быть ссылкой на перечисление (например, Перечисление.СтатусыВакансий) со значениями: "Открыта", "В работе", "Приостановлена", "Закрыта", "Архивная".
При проведении документа "Прием на работу" вы программно меняете состояние вакансии на "Закрыта". Это позволяет легко фильтровать списки, строить отчеты и управлять видимостью вакансий для пользователей, не удаляя при этом исторические данные.
Можно программно установить пометку на удаление для элемента справочника "Вакансии". Однако, этот способ категорически не рекомендуется. Он ведет к потере истории подбора и может вызвать ошибки нарушения целостности данных, если на эту вакансию ссылаются другие объекты системы (например, отчеты по подбору, документы с собеседованиями и т.д.).
Для компаний с выстроенным процессом рекрутинга 1С предлагает мощные инструменты — "Бизнес-процессы" и "Задачи". Можно создать бизнес-процесс "Подбор персонала", который будет стартовать при создании новой вакансии.
Как это может работать:
"Прием на работу"), бизнес-процесс может автоматически завершиться и, как часть своего завершения, изменить статус связанной вакансии на "Закрыта".Этот подход обеспечивает максимальную прозрачность и управляемость всего процесса подбора, автоматизируя всю цепочку действий.