Привет, меня зовут Дмитрий Черняев, я руководитель отдела аналитики в компании «Эволюция». Как партнеры Битрикс24 мы помогаем компаниям внедрять CRM, автоматизировать бизнес-процессы и с 2022 года, создаем решения для автоматизации.

В этой статье расскажу о том, как с помощью кастомных и типовых решений в Битрикс24 можно автоматизировать HR-департамент для компании с более чем 250 сотрудников. 

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

Мы собрали разрозненные HR-сценарии в едином контуре, создали раздел «HR-департамент» — отдельное цифровое рабочее место, в котором реализованы 4 инструмента:

  1. Приложение «Отпуск» и контроль нагрузки — локальное приложение внутри Битрикс24, которое дает руководителям и HR оперативную видимость отпусков и помогает управлять нагрузкой подразделений.

  2. Сервис подбор и найм: автоматизация поиска приема заявок на вакансию на HH.ru и Авито.Работа

  3. Тикет-борд поддержки — единый канал для обращений сотрудников и партнеров с автоматической маршрутизацией, прозрачными статусами и контролем качества закрытий. 

  4. Автоматизация командировок — процесс автоматизирует не только согласование заявок, но и расчет бюджета в зависимости от длительности поездки, типа командировки (по России или за границу) и других факторов. 

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

В нашем случае тикет-борд и командировки реализованы на типовых смарт-процессах Битрикс24.  Для сценария подбора и найма персонала мы подобрали и настроили нужным образом готовые приложения из Маркетплейса Битрикс24, а для автоматизации отпусков и контроля нагрузки создали отдельное приложение со своей логикой и интерфейсом. В нем не используются стандартные настройки Битрикс24, поэтому его легко можно дорабатывать под новые запросы клиента. 

Первые три инструмента достаточно просты в реализации, поэтому не будем останавливаться на них подробно. А приложение «Отпуск» рассмотрим детально.

Приложение «Отпуск» и контроль нагрузки

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

Под капотом приложения — система смарт-процессов. Приложение полностью интегрировано с экосистемой Битрикс24 через REST API и JS-SDK. Все операции выполняются на стороне клиента с использованием методов BX24.callMethod() для выполнения запросов к API портала. 

Сотрудник формирует заявку на отпуск — заполняет поля и прикрепляет файл с заявлением. Пока реализована заглушка с файлом, но мы работаем над подключением КЭДО и скоро сотрудники смогут отправлять полностью цифровые заявления через систему кадрового документооборота. 

Взаимодействие со смарт-процессами

Все заявки на отпуск управляются через специально созданный смарт-процесс (entityTypeId: 1098). Приложение использует следующие основные методы:

- crm.item.list — загрузка всех заявок сотрудника/отдела

- crm.item.add — создание новой заявки

- crm.item.update — обновление данных заявки (включая очистку лишних файлов)

При создании заявки формируется структура данных со всеми необходимыми полями:

BX24.callMethod('crm.item.add', {

  entityTypeId: 1098,

  fields: {

    title: Отпуск: ${startDate} - ${endDate},

    'ufCrm31_1757317723': employeeId,

    'ufCrm31_1757318147975': startDate,

    'ufCrm31_1757318154837': endDate,

    stageId: 'DT1098_39:PREPARATION'

  }

})

Согласование заявки и анализ загрузки

Далее автоматически запускается процесс согласования заявления. Он включает в себя обязательную проверку нагрузки отдела.  

Вот как это выглядит на блок-схеме: 

Отпуска
Отпуска

Система цветовых зон загрузки отделов — это ключевой механизм предотвращения кадровых коллапсов.

Вместе с заказчиком мы определили бизнес-логику зон:

- 🟢 Зеленая (<20%) — нормальная загрузка, заявка проходит обычное согласование.

- 🟡 Желтая (20-50%) — повышенная загрузка, система предупреждает пользователя о возможных проблемах, заявку могут отклонить.

- 🔴 Красная (>50%) — критическая загрузка, система блокирует подачу заявки без дополнительного подтверждения.

Приложение а��томатически анализирует загрузку отдела на выбранные даты и определяет цветовую зону:

async function checkDepartmentLoad(deptId, startDateStr, endDateStr) {

  // Загружаем одобренные заявки для всех сотрудников отдела

  BX24.callMethod('crm.item.list', {

    entityTypeId: 1098,

    filter: {

      'ufCrm31_1757317723': deptUserIds,

      'stageId': ['DT1098_39:UC_HPZPS1', 'DT1098_39:CLIENT']

    }

  }, function(res) {

    // Рассчитываем процентное соотношение сотрудников в отпуске

    const percentage = Math.round((onVacationCount / totalUsers) * 100);

    

    // Определяем цветовую зону

    let zone = 'green';

    if (percentage > 50) zone = 'red';

    else if (percentage > 20) zone = 'yellow';

  });

}

Эта механика полностью реализована в приложении, но заказчик попросил ее временно отключить и пока его HR-специалисты вручную принимают решение — давать ход заявке или нет. Им доступна вся информация о том, сколько сотрудников в отделе и какой процент из них в отпуске — эти цифры видны в самом приложении.

Статусы согласованного отпуска

Если отпуск согласован успешно, заявка переходит в раздел «Запланированные». Во внешнем обработчике стоит скрипт, который сверяет текущую дату и дату начала запланированного отпуска. Как только дата наступает, отпуск переходит в стадию «Отпуск». И также точно завершается и переходит в «Завершен».

Как работает скрипт

Приведенный ниже Python-скрипт — это «мозг» системы управления отпусками. Он автоматическ�� отслеживает даты начала и окончания отпусков и перемещает заявки по нужным этапам рабочего процесса, экономя время HR-специалистам и руководителям.

Скрипт работает в двух режимах:

1. Ежедневная автоматическая обработка — запускается по расписанию через cron

2. Мгновенная реакция на изменения через вебхуки при создании или изменении заявок

Логика работы скрипта

Система автоматически определяет текущий статус отпуска, анализируя даты:

# Основная логика обработки отпусков

today = get_current_msk_time().date()

# 1. Если отпуск согласован и дата начала в будущем → "Запланированы"

if current_stage == STAGE_PREPARATION and start_date_date > today:

    move_deal(deal_id, STAGE_PLANNED)

# 2. Если дата начала наступила → "В отпуске"

elif current_stage in [STAGE_PREPARATION, STAGE_PLANNED] and start_date_date <= today:

    move_deal(deal_id, STAGE_ACTIVE)

# 3. Если дата окончания прошла → "Завершены"

elif current_stage == STAGE_ACTIVE and end_date_date and end_date_date < today:

    move_deal(deal_id, STAGE_COMPLETED)

Пример работы скрипта

Ситуация: сотрудник подал заявку на отпуск с 15 по 25 июня 2025 года.

Рассмотрим, как скрипт обрабатывает эту заявку.

1. 10 июня, дата создания заявки:

   - Статус: "На согласовании" (PREPARATION)

   - Скрипт проверяет дату начала (15 июня) > сегодня (10 июня) → оставляет на согласовании

2. 12 июня,  руководитель одобрил заявку:

   - Статус меняется на "Запланированы" (PLANNED)

   - Скрипт фиксирует: дата начала (15 июня) > сегодня (12 июня) → оставляет в статусе "Запланированы"

3. 15 июня, дата начала отпуска:

   - В 00:01 скрипт автоматически меняет статус с "Запланированы" на "В отпуске" (ACTIVE)

   - В календаре сотрудника отпуск становится зеленым (активный)

4. 26 июня, следующий день после окончания:

   - Скрипт автоматически перемещает заявку в статус "Завершены" (COMPLETED)

   - В календаре отпуск становится серым, освобождая место для новых заявок

Технические особенности скрипта

  • Точное время: скрипт работает в московском часовом поясе, что критично для корректной обработки дат.

  • Надежность: все операции логируются в файл /var/log/otpyska.log для отслеживания работы.

  • Гибкость: поддерживается как массовая обработка всех отпусков, так и реагирование на отдельные изменения.

  • Интеграция: работает через REST API Битрикс24, полностью интегрируясь в существующие бизнес-процессы.

Скрипт полностью автоматизирует рутинный процесс контроля дат отпусков: исключает человеческий фактор при перемещении заявок по стадиям, вовремя обновляет статусы, гарантирует актуальность данных в календаре в реальном времени. Все это снижает нагрузку на HR-специалистов и обеспечивает прозрачность HR-процессов. Можно было собрать ту же логику на роботах и бизнес-процессах, но мы решили разработать отдельный скрипт. Нам важно было запускать всю проверку его один раз в день, поэтому выбрали cron, как более простое и надежное для этого случая решение.

Согласованные и запланированные отпуска добавляются в отдельный календарь — чтобы коллеги не назначали встречи, задачи и созвоны на время отсутствия сотрудника. 

Система отправляет уведомления о новых заявках и напоминания перед началом отпуска руководителям и HR.

Отдельно по просьбе заказчика реализовали «График отсутствий», в котором отображаются отпуска и командировки сотрудников. Заказчик активно пользуется этим инструментом. 

Что еще видят пользователи в приложении

  • Структуру компании в виде дерева: отделы → подотделы → сотрудники. 

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

function loadAllDepartments(params = {}, collectedDepartments = []) {

  BX24.callMethod('department.get', params, function(res) {

    if (res.next()) {

      loadAllDepartments(res.next(), collectedDepartments);

    } else {

      allDepartments = collectedDepartments.map(d => ({...}));

    }

  });

}

Для получения данных о сотрудниках используется метод user.get с параметром ACTIVE: true — приложение показывает только активных пользователей. Особое внимание мы уделили корректной обработке принадлежности сотрудников к нескольким отделам одновременно — это характерная особенность структуры Equip Group.

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

  • Блок ключевых показателей (кликабельные): «Сейчас в отпуске», «Планируют уйти», «Неотгуленные дни отпуска».

Система автоматически рассчитывает неотгулянные дни отпуска для каждого сотрудника по годам:

function calculateUnusedVacationDays(user, year, userEvents) {

  // Рассчитываем накопленные дни за год

  let monthsWorked = 12;

  const dateCreate = new Date(user.DATE_CREATE);

  if (dateCreate.getFullYear() === year) {

    monthsWorked = 12 - dateCreate.getMonth();

  }

  const accruedDays = Math.min(28, Math.floor(monthsWorked * 2.33));

  

  // Считаем использованные дни в указанном году из одобренных заявок

  let usedDays = 0;

  userEvents.forEach(event => {

    if (event.stageId === 'DT1098_39:SUCCESS' && 

        new Date(event.startFull).getFullYear() === year) {

      const duration = calculateDaysBetween(event.startFull, event.endFull);

      usedDays += duration;

    }

  });

  

  return Math.max(0, accruedDays - usedDays);

}
  • Для HR-специалистов — годовые планы отпусков.

Функция генерации годового плана отпусков реализована через внешний сервис:

async function generateVacationPlan(year) {

  // Собираем данные по всем сотрудникам

  const planData = allActiveUsers.map(user => {

    const unusedDays = calculateUnusedVacationDays(user, year, userEvents);

    return {

      department: getUserDepartment(user),

      position: user.WORK_POSITION,

      fio: ${user.NAME} ${user.LAST_NAME},

      duration: unusedDays,

      startDate: generateStartDate(year, unusedDays)

    };

  });

  

  // Отправляем на генерацию Word-документа

  const response = await fetch('https://generator.example/generate\_vacation\_plan', {

    method: 'POST',

    body: JSON.stringify({ planData, year })

  });

  

  // Скачиваем сгенерированный документ

  downloadFile(await response.blob(), План_отпусков_${year}.docx);

}

Особенности реализации приложения

1. Ленивая загрузка данных: события (заявки на отпуск) загружаются только для видимых пользователей, что значительно ускоряет работу приложения.

2. Оптимизация работы с файлами: при создании заявки система обрабатывает прикрепленные файлы (максимум 25 МБ) и автоматически очищает дубликаты после загрузки.

3. Адаптивное отображение: приложение поддерживает различные временные периоды (месяц, квартал, год) с пропорциональным отображением событий.

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

5. Кэширование данных: для каждого пользователя устанавливается флаг eventsLoaded, что позволяет избежать повторных запросов к API и ускорить работу интерфейса.

Такая архитектура обеспечивает эффективную работу с большими объемами данных компании, предоставляя удобные инструменты для управления отпусками с учетом реальных бизнес-процессов Equip Group.

Результаты: 

  • срок согласования заявки сократился минимум в 2 раза — сократился с 2–3 дней до 1 дня;

  • проверить загрузку отдела на выбранные даты можно автоматически за 10 секунд вместо 15-20 минут вручную.