← Назад к заметкам

Заметки

Как прибавить к дате 1 рабочий день и поставить время 17:00

Как в роботе или бизнес-процессе Bitrix24 получить следующий рабочий день и выставить время 17:00.

Если нужно просто прибавить один рабочий день, сначала посмотрите в сторону addworkdays и settime. Ручной вариант через locdate('N') и strtotime нужен, когда рабочими считаются только понедельник–пятница и это правило нужно явно зашить в выражение.

Задача

Допустим, в роботе нужно заполнить крайний срок: взять текущую дату, прибавить один рабочий день и поставить время 17:00.

Ожидаемая логика такая:

  • если сегодня понедельник, срок должен стать вторником в 17:00;
  • если сегодня четверг, срок должен стать пятницей в 17:00;
  • если сегодня пятница, срок должен стать понедельником в 17:00;
  • если сегодня суббота или воскресенье, срок тоже должен стать понедельником в 17:00.

Главная ошибка в таких выражениях — просто прибавить +1 day. Для пятницы это даст субботу, а для субботы — воскресенье. Если в процессе нужны только рабочие дни, такой вариант не подходит.

Простой вариант

Если на портале корректно настроены рабочие дни, проще использовать штатную функцию addworkdays, а время выставить через settime.

Для текущего момента выражение может быть таким:

{{=settime(addworkdays({=System:NowLocal}, 1), 17, 0)}}

Здесь addworkdays прибавляет один рабочий день, а settime ставит у полученной даты время 17:00.

Этот вариант удобнее ручных условий. Но есть нюанс: рабочие дни берутся из настроек портала. Если вам нужно не это, а жёсткое правило «пн–пт рабочие, сб–вс выходные», лучше прописать условие явно.

Для поля с крайним сроком лучше использовать тип Дата/время. Если поле хранит только дату, время 17:00 может не сохраниться так, как ожидается.

Вариант через locdate и strtotime

Для ручной проверки дня недели удобно использовать locdate('N'). Формат N возвращает номер дня недели: от 1 для понедельника до 7 для воскресенья.

Если точка отсчёта — текущий момент, можно проверить день недели и выбрать нужную дату:

{{=if(
    locdate('N') >= 5,
    settime(strtotime('next Monday'), 17, 0),
    settime(strtotime('+1 day'), 17, 0)
)}}

Логика здесь простая:

  • locdate('N') >= 5 — сегодня пятница, суббота или воскресенье;
  • для пятницы и выходных берём next Monday;
  • для понедельника–четверга берём +1 day;
  • после выбора даты ставим время 17:00.

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

Если в вашей задаче пятница должна переноситься не на ближайший понедельник, а, например, на вторник из-за праздников или индивидуального графика, это выражение уже не подойдёт. Тогда лучше использовать addworkdays или отдельную логику в PHP-активити.

strtotime работает с английскими относительными форматами: +1 day, next Monday, next Friday. Для большинства обычных роботов я бы начинал с settime(addworkdays(...), 17, 0), а ручное условие оставлял для случаев, где правило переноса нужно явно видеть в выражении.