+7 (999) 881-15-11

Уведомление менеджеру при проведении документа

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

Уведомление о проведённом документе кажется простой автоматизацией: записали реализацию — ответственный получил номер и сумму в Max. Главная задача здесь не сам POST /messages, а безопасная связь с транзакцией записи документа.

Если документов несколько, используйте подписку на событие ПриЗаписи, а не одинаковые вставки в типовых модулях объектов. Обработчик должен проверить проведение, режим загрузки обмена и наличие ответственного, затем записать задание в очередь. Непосредственный HTTP-вызов внутри транзакции может задержать запись или сорвать её из-за временной недоступности Max.

Каркас подписки на событие
// Обработчик подписки на событие «ПриЗаписи» для нужных документов.
Процедура ДокументПриЗаписи(Источник, Отказ) Экспорт

	Если Источник.ОбменДанными.Загрузка Или Отказ Или Не Источник.Проведен Тогда
		Возврат;
	КонецЕсли;

	ИдМенеджера = 123456789; // заранее сопоставленный user_id
	Текст = СтрШаблон("Проведён %1 № %2 от %3",
		Источник.Метаданные().Синоним,
		Источник.Номер,
		Формат(Источник.Дата, "ДЛФ=D"));

	// Здесь следует записать уведомление в собственную очередь.
	// Отправляйте его регламентным или фоновым заданием после завершения транзакции.
	// Уникальный ключ не даст повторно поставить то же проведение в очередь.

КонецПроцедуры
POST /messages из обработчика очереди
ТокенБота = "подставьте_токен_бота";
ИдПользователя = 123456789; // user_id из события Max, не код справочника 1С

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение(
	"platform-api2.max.ru", 443, , , , 30, ЗащищенноеСоединение);

Тело = Новый Структура;
Тело.Вставить("text", "Здравствуйте! Направляем подтверждение заказа № 145.");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Тело);
СтрокаJSON = ЗаписьJSON.Закрыть();

Запрос = Новый HTTPЗапрос("/messages?user_id=" + Формат(ИдПользователя, "ЧГ="));
Запрос.Заголовки.Вставить("Authorization", ТокенБота);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(
	СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
	ВызватьИсключение "Max вернул " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;

Получателя определяйте по данным документа: ответственному, подразделению или настроенной матрице оповещений должна соответствовать карточка пользователя Max. Токен бота и user_id не следует хранить в коде подписки.

Отдельно решите вопрос дублей. Повторное проведение, обмен и восстановление очереди не должны отправлять одно и то же уведомление без конца. Практичный ключ идемпотентности — ссылка на документ, вид события и версия или момент проведения. Он защищает от повторной постановки в очередь, но не устраняет неопределённость при обрыве между ответом Max и фиксацией результата в 1С.

Обработчик очереди соблюдает ограничения API, повторяет временные ошибки и пишет результат в журнал. Это часть общей архитектуры интеграции. Если руководитель должен не только увидеть документ, но и принять решение, понадобится сценарий с callback-кнопками.

Транспортная часть в «Арете — сервер мессенджеров, Max edition»

Подписка на событие и проверка бизнес-условий остаются прикладным кодом. Подсистема заменяет низкоуровневый запрос из второго примера, ведёт пользователей и записывает результат отправки в журнал:

Сообщение ответственному через АСМ_М
Параметры = Новый Структура;
Параметры.Вставить("user_id", ИдПользователя);
Параметры.Вставить("text", "Заявка принята. Мы свяжемся с вами.");
АСМ_М.ОтправитьСообщение(Бот, Параметры);

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