Отложенная отправка в Max из 1С
Январь 2026 · Редакция «Арете-ИТ»
У Bot API нет команды «доставить это сообщение завтра в девять». Отложенную отправку организует сама 1С: хранит материал и получателей, а в назначенное время запускает регламентное задание. По той же схеме работают периодические рассылки.
Из чего состоит рассылка
Минимальная модель включает три независимые части:
- материал: текст, разметка и вложения;
- актуальный список пользователей или чатов Max;
- расписание и исполнитель, который вызывает
POST /messages.
Процедура ОтложеннаяОтправкаВMax(ПараметрыЗадания) Экспорт
ТокенБота = ПараметрыЗадания.ТокенБота;
Текст = ПараметрыЗадания.Текст;
// Очередь должна выдавать ограниченную порцию ещё не обработанных user_id.
Получатели = ПараметрыЗадания.Получатели;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение(
"platform-api2.max.ru", 443, , , , 30, ЗащищенноеСоединение);
Для Каждого ИдПользователя Из Получатели Цикл
Тело = Новый Структура("text", Текст);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Тело);
Запрос = Новый HTTPЗапрос("/messages?user_id=" + Формат(ИдПользователя, "ЧГ="));
Запрос.Заголовки.Вставить("Authorization", ТокенБота);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(
ЗаписьJSON.Закрыть(),
КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Max", УровеньЖурналаРегистрации.Ошибка, , ,
"user_id " + Формат(ИдПользователя, "ЧГ=") + ": " +
Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
// Зафиксируйте результат строки в очереди, чтобы повторный запуск не создал дубль.
КонецЦикла;
// Следующую порцию запускайте по расписанию с учётом общего лимита 30 rps.
КонецПроцедуры
Расписание — только половина задачи
Расписание отвечает только на вопрос «когда начать». Исполнитель ещё должен соблюдать ограничения Max: не более двух сообщений в секунду в один диалог и не более 30 запросов в секунду к основному API. Ответы 429 и временные серверные ошибки требуют очереди и повторных попыток, а не немедленного перезапуска всей рассылки.
В журнале стоит фиксировать адресата, материал, время, код ответа и число попыток.
Уникальный ключ строки очереди не даст поставить одну операцию дважды. Но если процесс
оборвётся после успешного ответа Max и до записи результата в 1С, точного ответа
«доставлено или нет» уже не будет: у POST /messages нет клиентского ключа
идемпотентности. Этот редкий случай нужно учитывать при выборе политики повторов.
Проверки перед отправкой
Динамический список лучше пересчитать непосредственно перед запуском: вчера сотрудник подходил под отбор, а сегодня уже нет. Материал сначала отправляют тестовой группе — так проверяются текст, разметка, кнопки и вложения до основной рассылки.
Один и тот же прайс-лист можно загрузить заранее и переиспользовать его token. Персональные документы, наоборот, формируются отдельно для каждого адресата. Эти два сценария нельзя объединять в одну безусловную загрузку «файла рассылки».
Если нужна пачка расчётных листков по сотрудникам ЗУП — это уже персональный файл на каждого, не один текст на всех. Отдельная заметка: рассылка расчётных листков.
Как устроены рассылки в «Арете — сервер мессенджеров, Max edition»
В подсистеме материал, аудитория и расписание разделены между справочниками Контент, Списки получателей и Рассылки. Список заполняется вручную или запросом СКД, а регламентное задание создаётся и перенастраивается вместе с рассылкой.
Перед рабочим запуском можно обновить динамические списки и выполнить тестовую отправку. Транспортный модуль соблюдает ограничения API, повторяет временные ошибки и сохраняет результат по каждому адресату — прикладной код исполнителя из примера писать не требуется.