Рассылка в Битрикс24 с учётом часовых поясов
Задача пришла от клиента, который работает с лидами по всей стране — от Калининграда до Владивостока. Сценарий простой: менеджер отбирает по фильтру партию лидов (обычно около тысячи), переводит их в стадию воронки, и бизнес-процесс генерирует каждому персональный документ и отправляет письмо.
В таком виде у сценария было три проблемы:
- Письма уходили в неудобное время. Запуск в 16:00 по Москве означал, что во Владивостоке письмо приходило в 23:00. Запуск вечером приводил к письмам глубокой ночью.
- Выходные никто не учитывал. Письмо, пришедшее в субботу утром, к понедельнику терялось среди других.
- Тысяча писем уходила одним залпом. Это бьёт по лимитам почтового сервера, повышает шанс попасть в спам и создаёт пиковую нагрузку на генерацию документов.
Всё это мы решили штатными средствами облачного Битрикс24 — без внешних серверов и платных приложений.
Как устроено решение
Ключевая идея: каждая копия бизнес-процесса сама рассчитывает, когда ей проснуться. При массовом переводе в стадию запускается тысяча независимых процессов, общей очереди между ними нет, поэтому распределение по времени закладывается в логику каждого из них.

1. Настройки — в Списке, а не в коде процесса
Параметры рассылки меняются от кампании к кампании: до которого часа отправлять сегодня, с какого часа начинать на следующий день, на сколько минут растянуть отправку, какой шаблон документа использовать, от чьего имени слать письмо.
Зашивать это в бизнес-процесс — значит каждый раз звать администратора в дизайнер. Поэтому мы вынесли все параметры в универсальный Список: один элемент работает как «пульт управления». Менеджер открывает обычную форму, видит текущие значения, правит их и сохраняет. Процесс в самом начале читает этот элемент и дальше работает только с полученными значениями.
Важное правило для пользователей: настройки меняются до перевода лидов в стадию. Уже запущенные процессы своё время отправки к этому моменту рассчитали.
2. Время лида
У каждого лида есть поле с часовым поясом, заданным как смещение от Москвы. Процесс берёт текущее время портала, прибавляет смещение и получает «который сейчас час у клиента».
Отдельно пришлось позаботиться о лидах с незаполненным поясом: пустое значение ломает расчёты дат. Простое «значение по умолчанию» у переменной не помогает — оно перезаписывается пустотой при присвоении, поэтому ноль подставляется прямо в формуле. Такие лиды считаются по московскому времени.
3. Три окна времени
Дальше процесс смотрит на час у клиента:
- рано утром или ночью (раньше часа начала) — отправка сегодня, как только у клиента наступит час начала;
- в рабочее время (раньше часа окончания) — отправка сразу;
- вечером — отправка завтра в час начала по времени клиента.
Время отправки всегда привязывается к часовому поясу портала. Если вы хотите письмо в 7:00 у клиента, нужно пересчитать это время в часовой пояс портала (обычно МСК), вычтя разницу поясов. Частая ошибка — сложить вместо вычитания: из‑за этого время сдвигается на двойную разницу и письмо уходит не вовремя
4. Перенос с выходных
После выбора окна отправки процесс проверяет, на какой день недели — снова по времени клиента — пришлась отправка. Если это суббота или воскресенье, отправка переносится на понедельник в час начала. Проверка стоит одна на все три ветки, поэтому корректно отрабатывает и запуск рассылки в пятницу вечером, и запуск в выходной.
5. Индивидуальный слот: убираем «залп»
Чтобы письма не уходили одновременно, к рассчитанному времени каждому лиду добавляется сдвиг на 0…N минут, где N — «окно рассылки» из настроек. Номер минуты вычисляется как остаток от деления ID лида на размер окна.
Это решение выглядит неочевидным, но у него важные плюсы: оно не требует общего счётчика между процессами (а значит, нет гонок при одновременном старте) и хорошо работает, даже когда ID отобранных лидов идут вразнобой — остатки от деления распределяются практически равномерно. При тысяче лидов и окне в 200 минут получается в среднем пять писем в минуту.
Одна особенность облака: пауза бизнес-процесса просыпается не в точную минуту, а при ближайшем проходе планировщика — на практике раз в 5–10 минут. Поэтому реальная картина — небольшие пачки писем с интервалом в несколько минут. Размер пачки регулируется шириной окна.
6. Документ и письмо
После паузы процесс генерирует документ по шаблону, ID которого тоже берётся из Списка. Перед отправкой временно назначает ответственным сотрудника, у которого есть доступ к нужной почте. Это нужно, чтобы письмо ушло корректно: иначе система попробует отправить его от имени запустившего процесс сотрудника — и если у него нет доступа к этой почте, будет ошибка. Отправляет письмо и возвращает прежнего ответственного.
С ответственным связан подводный камень, который мы нашли при аудите исходной версии процесса: прежний ответственный сохранялся в глобальную переменную. Она одна на все тысячу запусков, и каждый следующий её перезаписывал — после паузы всем лидам вернулся бы ответственный последнего стартовавшего. Решение — обычная переменная процесса, своя у каждой копии.
Что получилось
- Каждый клиент получает письмо в рабочее время по своему часовому поясу.
- Письма не приходят в выходные.
- Тысяча писем растягивается на заданное окно вместо одного залпа: почтовый сервер не упирается в лимиты, генерация документов идёт равномерно.
- Менеджер управляет рассылкой через обычную форму Списка — без доступа к дизайнеру бизнес-процессов и без участия администратора.
Что можно развить
- Праздники. Сейчас проверяются только суббота и воскресенье. Дизайнер бизнес-процессов умеет работать с производственным календарём портала — следующий шаг переносить отправку и с праздничных дней.
- Несколько кампаний одновременно. Если завести элемент Списка на каждую кампанию и привязывать к нему лиды, можно вести параллельные рассылки с разными настройками и сохранять историю.
- Выбор шаблона по названию. Вместо ввода ID — выпадающий список шаблонов, который автоматически синхронизируется с генератором документов через REST.
Если в вашем Битрикс24 есть похожая задача — массовые действия, которые нужно растянуть во времени или привязать к часовым поясам клиентов, — напишите нам. Разберём текущий бизнес-процесс и предложим решение на штатных инструментах.