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