Как отправить сообщение в Max из 1С
Февраль 2026 · Редакция «Арете-ИТ»
Для первого сообщения из 1С не нужен отдельный сервис на Python. Достаточно знать получателя, собрать JSON и вызвать POST /messages. Ниже — минимальный рабочий запрос и те детали, которые обычно остаются за его пределами.
Кому отправлять: user_id или chat_id
Метод принимает либо user_id (личный диалог), либо chat_id (группа или канал).
Оба значения выдаёт Max; код сотрудника или контрагента из 1С здесь не подойдёт.
Бот не начинает личный диалог первым: пользователь должен запустить его, после чего Max пришлёт
событие bot_started или message_created.
Для отладки проще всего снять идентификатор из GET /updates. В рабочей системе лучше принимать события через webhook. Long polling ограничен по скорости и сроку хранения событий; сама документация Max оставляет его для разработки и тестирования. Чтобы получать события группы или канала, бот должен быть их администратором.
Запрос = Новый HTTPЗапрос("/updates?limit=50&timeout=30");
Запрос.Заголовки.Вставить("Authorization", ТокенБота);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Пакет = ПрочитатьJSON(ЧтениеJSON);
Для Каждого Событие Из Пакет.updates Цикл
Если Событие.update_type = "bot_started" Тогда
ИдПользователя = Событие.user.user_id;
Прервать;
ИначеЕсли Событие.update_type = "message_created"
И Событие.message.Свойство("sender") Тогда
ИдПользователя = Событие.message.sender.user_id;
Прервать;
КонецЕсли;
КонецЦикла;
// Для следующего запроса сохраните Пакет.marker и передайте его в query.
Токен передаётся в заголовке Authorization: query-параметр для него больше не поддерживается.
Актуальный адрес API — platform-api2.max.ru. На сервере 1С должен быть
доверен сертификат, которым удостоверен этот домен; документация Max отдельно напоминает
о сертификате Минцифры.
Вызов POST /messages
Текст длиной до 4000 символов передаётся в теле, получатель — в query-параметре. Строку запроса и тело следует формировать раздельно: так в JSON не окажутся служебные поля, а идентификатор адресата не придётся экранировать вручную.
ТокенБота = "подставьте_токен_бота";
ИдПользователя = 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 вернул " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
ЗаписьJSON, не конкатенация строк
Кавычки, переносы строк и обратные слеши делают конкатенацию ненадёжной.
ЗаписатьJSON экранирует их по правилам формата. Тело запроса отправляйте
в UTF-8 без BOM — это прямо указано в примере выше.
Что делать с ответом
При успехе Max возвращает HTTP 200 и описание созданного сообщения. Код 401 означает проблему с токеном, 429 — превышение частоты запросов, 500 — временную ошибку сервера. Записывайте в журнал не только код, но и тело ответа: именно там обычно находится причина отказа.
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8); Если Ответ.КодСостояния = 200 Тогда ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СтрокаОтвета); Данные = ПрочитатьJSON(ЧтениеJSON); // Данные содержат объект Message: timestamp, body, recipient и другие поля. ИначеЕсли Ответ.КодСостояния = 401 Тогда ВызватьИсключение "Токен бота не принят. Проверьте заголовок Authorization."; ИначеЕсли Ответ.КодСостояния = 429 Тогда ВызватьИсключение "Слишком часто. В один диалог — не больше двух сообщений в секунду."; Иначе ВызватьИсключение "Код " + Ответ.КодСостояния + ": " + СтрокаОтвета; КонецЕсли;
Max разрешает не более двух сообщений в секунду в один диалог, групповой чат или канал;
для platform-api2.max.ru действует общий предел 30 запросов в секунду.
Массовую отправку стоит вести через очередь, а временные ошибки повторять с увеличением интервала.
Сетевой сбой при этом не должен отменять проведение документа в 1С.
Когда к сообщению нужен файл
С УПД, счётом или расчётным листком появляется ещё один этап: POST /uploads,
multipart-загрузка и ожидание обработки вложения. Подробности разобраны отдельно:
- отправка файла — печатные формы и отчёты;
- отправка фотографии —
type=image; - отправка видео — дольше обрабатывается;
- отложенная отправка — регламентка и список получателей.
Подход не привязан к конкретной конфигурации: важны версия платформы и возможность выполнить исходящий HTTPS-запрос. В клиент-серверной базе проверяйте доступ к API именно с рабочих серверов кластера 1С — успешный запрос с компьютера разработчика ничего не доказывает.
Как это выглядит через подсистему
В «Арете — сервер мессенджеров, Max edition» соединение, токен, разбор ответа и журнал уже находятся
в общем транспортном модуле. Подсистема создаёт карточки пользователей по событиям Max
и подставляет user_id или chat_id из контекста.
Параметры = Новый Структура;
Параметры.Вставить("user_id", ИдПользователя);
Параметры.Вставить("text", "Заявка принята. Мы свяжемся с вами.");
АСМ_М.ОтправитьСообщение(Бот, Параметры);
Сценарий остаётся кодом 1С, но служебную часть из примеров выше не приходится копировать в каждый обработчик.