Уведомление менеджеру при проведении документа
Сентябрь 2026 · Редакция «Арете-ИТ»
Уведомление о проведённом документе кажется простой автоматизацией: записали реализацию —
ответственный получил номер и сумму в Max. Главная задача здесь не сам POST /messages,
а безопасная связь с транзакцией записи документа.
Если документов несколько, используйте подписку на событие ПриЗаписи,
а не одинаковые вставки в типовых модулях объектов. Обработчик должен проверить проведение,
режим загрузки обмена и наличие ответственного, затем записать задание в очередь.
Непосредственный HTTP-вызов внутри транзакции может задержать запись или сорвать её
из-за временной недоступности Max.
// Обработчик подписки на событие «ПриЗаписи» для нужных документов.
Процедура ДокументПриЗаписи(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Или Отказ Или Не Источник.Проведен Тогда
Возврат;
КонецЕсли;
ИдМенеджера = 123456789; // заранее сопоставленный user_id
Текст = СтрШаблон("Проведён %1 № %2 от %3",
Источник.Метаданные().Синоним,
Источник.Номер,
Формат(Источник.Дата, "ДЛФ=D"));
// Здесь следует записать уведомление в собственную очередь.
// Отправляйте его регламентным или фоновым заданием после завершения транзакции.
// Уникальный ключ не даст повторно поставить то же проведение в очередь.
КонецПроцедуры
ТокенБота = "подставьте_токен_бота";
ИдПользователя = 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", "Заявка принята. Мы свяжемся с вами.");
АСМ_М.ОтправитьСообщение(Бот, Параметры);