Привет, меня зовут Дмитрий Черняев, я руководитель отдела аналитики в компании «Эволюция». Как партнеры Битрикс24 мы помогаем компаниям внедрять CRM, автоматизировать бизнес-процессы и с 2022 года, создаем решения для автоматизации.
В этой статье расскажу о том, как с помощью кастомных и типовых решений в Битрикс24 можно автоматизировать HR-департамент для компании с более чем 250 сотрудников.
Нашему заказчику, компании Equip Group, необходимо было настроить и стандартизировать HR-процессы: подачу и согласование заявок на отпуска и командировки, поиск кандидатов на вакансии, а также организовать техническую поддержку пользователей. Нужно было собрать несколько процессов, которые велись в полуручном режиме, в единый контур, с одной точкой входа, понятным интерфейсом.
Мы собрали разрозненные HR-сценарии в едином контуре, создали раздел «HR-департамент» — отдельное цифровое рабочее место, в котором реализованы 4 инструмента:
Приложение «Отпуск» и контроль нагрузки — локальное приложение внутри Битрикс24, которое дает руководителям и HR оперативную видимость отпусков и помогает управлять нагрузкой подразделений.
Сервис подбор и найм: автоматизация поиска приема заявок на вакансию на HH.ru и Авито.Работа
Тикет-борд поддержки — единый канал для обращений сотрудников и партнеров с автоматической маршрутизацией, прозрачными статусами и контролем качества закрытий.
Автоматизация командировок — процесс автоматизирует не только согласование заявок, но и расчет бюджета в зависимости от длительности поездки, типа командировки (по России или за границу) и других факторов.
Автоматизировать такие задачи можно по-разному. Чаще всего достаточно типовых смарт-процессов, иногда можно интегрироваться с приложениями из маркетплейса, а в ряде случаев не остается ничего другого, кроме кастомной разработки.
В нашем случае тикет-борд и командировки реализованы на типовых смарт-процессах Битрикс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 минут вручную.
