+7 (999) 881-15-11

Согласование счёта в Max из 1С

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

Руководитель может согласовать счёт прямо из сообщения Max, но нажатие кнопки — только начало операции. 1С должна узнать документ, проверить полномочия и текущее состояние, записать решение и подтвердить обработку callback.

Кнопки живут в attachments с типом inline_keyboard. Max разрешает до 210 кнопок в 30 рядах, хотя для счёта достаточно двух. У callback-кнопки есть строковый payload. В простом варианте в нём передают действие и UUID документа; для сложных данных лучше хранить значение в 1С, а в payload оставлять короткий идентификатор.

Две callback-кнопки и POST /messages средствами 1С
// Низкоуровневый вариант: обработчик 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.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 и записывает обмен в журнал.

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