+7 (999) 881-15-11

Отложенная отправка в Max из 1С

Январь 2026 · Редакция «Арете-ИТ»

У Bot API нет команды «доставить это сообщение завтра в девять». Отложенную отправку организует сама 1С: хранит материал и получателей, а в назначенное время запускает регламентное задание. По той же схеме работают периодические рассылки.

Из чего состоит рассылка

Минимальная модель включает три независимые части:

Упрощённый исполнитель регламентного задания
Процедура ОтложеннаяОтправкаВ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, повторяет временные ошибки и сохраняет результат по каждому адресату — прикладной код исполнителя из примера писать не требуется.

Читать дальше