Согласование счёта в Max из 1С
Сентябрь 2026 · Редакция «Арете-ИТ»
Руководитель может согласовать счёт прямо из сообщения Max, но нажатие кнопки — только начало операции. 1С должна узнать документ, проверить полномочия и текущее состояние, записать решение и подтвердить обработку callback.
Кнопки живут в attachments с типом inline_keyboard.
Max разрешает до 210 кнопок в 30 рядах, хотя для счёта достаточно двух.
У callback-кнопки есть строковый payload. В простом варианте в нём передают
действие и UUID документа; для сложных данных лучше хранить значение в 1С,
а в payload оставлять короткий идентификатор.
// Низкоуровневый вариант: обработчик callback сам разбирает строки approve|UUID и reject|UUID.
КнопкаОк = Новый Структура;
КнопкаОк.Вставить("type", "callback");
КнопкаОк.Вставить("text", "Согласовать");
КнопкаОк.Вставить("payload", "approve|" + Строка(Ссылка.УникальныйИдентификатор()));
КнопкаНет = Новый Структура;
КнопкаНет.Вставить("type", "callback");
КнопкаНет.Вставить("text", "Отклонить");
КнопкаНет.Вставить("payload", "reject|" + Строка(Ссылка.УникальныйИдентификатор()));
Ряд = Новый Массив;
Ряд.Добавить(КнопкаОк);
Ряд.Добавить(КнопкаНет);
Кнопки = Новый Массив;
Кнопки.Добавить(Ряд);
Клавиатура = Новый Структура("type, payload", "inline_keyboard", Новый Структура("buttons", Кнопки));
Вложения = Новый Массив;
Вложения.Добавить(Клавиатура);
Тело = Новый Структура;
Тело.Вставить("text", "Согласуйте счёт на оплату");
Тело.Вставить("attachments", Вложения);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Тело);
Запрос = Новый HTTPЗапрос("/messages?user_id=" + Строка(ИдСогласующего));
Запрос.Заголовки.Вставить("Authorization", ТокенБота);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(
ЗаписьJSON.Закрыть(),
КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Соединение = Новый HTTPСоединение(
"platform-api2.max.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Входящие callback лучше принимать через webhook. Перед записью решения проверьте,
что нажал назначенный согласующий, документ ещё ждёт решения, а кнопка не была обработана раньше.
После этого вызовите
POST /answers
с callback_id: метод может
обновить исходное сообщение, например убрать кнопки и показать результат.
ИдCallback = КодироватьСтроку(
Событие.callback.callback_id,
СпособКодированияСтроки.URLВКодировкеURL,
"UTF-8");
СообщениеОтвета = Новый Структура;
СообщениеОтвета.Вставить("text", "Счёт согласован. Решение записано в 1С.");
СообщениеОтвета.Вставить("attachments", Новый Массив); // Пустой массив удалит кнопки.
ТелоОтвета = Новый Структура("message", СообщениеОтвета);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоОтвета);
Запрос = Новый HTTPЗапрос("/answers?callback_id=" + ИдCallback);
Запрос.Заголовки.Вставить("Authorization", ТокенБота);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(
ЗаписьJSON.Закрыть(),
КодировкаТекста.UTF8,
ИспользованиеByteOrderMark.НеИспользовать);
Соединение = Новый HTTPСоединение(
"platform-api2.max.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(
Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
Результат = ПрочитатьJSON(ЧтениеJSON);
Если НЕ Результат.success Тогда
Пояснение = ?(Результат.Свойство("message"), Результат.message, "");
ВызватьИсключение "Max не подтвердил callback: " + Пояснение;
КонецЕсли;
Общая схема приёма событий описана в статье об архитектуре интеграции. Пример прикладного сценария — бот согласования, а подготовка PDF — в статье об отправке счёта.
Кнопки и маршрутизация в «Арете — сервер мессенджеров, Max edition»
В подсистеме Кнопка_callback принимает имя маршрута, видимый текст
и данные 1С. Простое значение помещается в payload, а ссылка или структура сохраняется
в регистр и восстанавливается при получении message_callback.
Клавиатура = Неопределено;
АСМ_М.Кнопка_callback(
Клавиатура,
"РешениеПоСчету",
"Согласовать",
Новый Структура("Счет, Согласовано", Ссылка, Истина));
АСМ_М.Кнопка_callback(
Клавиатура,
"РешениеПоСчету",
"Отклонить",
Новый Структура("Счет, Согласовано", Ссылка, Ложь));
Параметры = Новый Структура;
Параметры.Вставить("user_id", ИдСогласующего);
Параметры.Вставить("text", "Согласуйте счёт на оплату");
АСМ_М.ВложитьКлавиатуру(Параметры, Клавиатура);
АСМ_М.ОтправитьСообщение(Бот, Параметры);
Обработчик получает имя кнопки и восстановленные данные, а транспортный модуль отвечает на callback и записывает обмен в журнал.