Заметки
Как прибавить к дате 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), а ручное условие оставлял
для случаев, где правило переноса нужно явно видеть в выражении.