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

Заметки

datediff в роботах: почему вместо разницы дат получается 0

Почему datediff в роботах Bitrix24 может вернуть 0 и чем отличаются форматы %d и %a.

Если нужно узнать, сколько дней прошло между двумя датами, в datediff обычно нужен формат %a, а не %d. %d показывает только дневную часть интервала, поэтому результат может неожиданно оказаться нулём.

Проблема

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

Для этого используют функцию datediff. Но иногда вместо ожидаемого количества дней робот возвращает 0.

Типичный пример:

{{=datediff({{Дата создания элемента}}, {=System:NowLocal}, "%d")}}

На первый взгляд кажется, что %d должен вернуть количество дней между датами. Но именно здесь обычно и появляется ошибка.

Почему так происходит

Третий параметр datediff отвечает за формат вывода разницы. И форматы %d и %a означают разные вещи.

%d — это не общее количество дней. Это дневная часть составного интервала. Например, если между датами прошёл ровно один месяц и ноль дополнительных дней, то дневная часть будет равна нулю.

{{=datediff("01.01.2026", "01.02.2026", "%d")}}

Такое выражение может вернуть:

0

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

Для общего количества дней нужен формат %a:

{{=datediff("01.01.2026", "01.02.2026", "%a")}}

В этом случае результат будет:

31

Есть ещё похожая ловушка с типом поля. Если поле имеет тип Дата, в нём нет часов и минут. Для расчётов такая дата обычно воспринимается как начало дня. Для простого подсчёта дней это нормально, но для дедлайнов внутри дня лучше использовать поле Дата/время.

Также стоит не путать системные значения:

  • {=System:Now} — текущие дата и время сервера;
  • {=System:NowLocal} — текущие дата и время пользователя с учётом часового пояса;
  • {=System:Date} — текущая дата без времени.

В CRM-роботах чаще всего удобнее использовать {=System:NowLocal}, потому что это значение ближе к тому времени, которое пользователь видит в интерфейсе.

Как правильно считать дни

Если задача звучит как «сколько дней прошло», почти всегда нужен формат %a.

Для даты создания элемента выражение может выглядеть так:

{{=datediff({{Дата создания элемента}}, {=System:NowLocal}, "%a")}}

Для двух пользовательских полей:

{{=datediff({{Дата начала}}, {{Дата окончания}}, "%a")}}

А вот %d нормально использовать, когда нужно вывести составной интервал:

{{=datediff({{Дата начала}}, {{Дата окончания}}, "%m мес. %d дн.")}}

В этом примере %d уместен, потому что мы специально выводим месяцы отдельно и дни отдельно.

Если после замены на %a результат всё равно выглядит странно, обычно дело уже не в формате интервала, а во входных датах: пустом поле, поле типа Дата без времени, часовом поясе или порядке дат.