1СИнтеграция · через API и вебхуки

Интеграция WhatsApp с 1С: счета, отгрузки и уведомления из базы

Обновлено

В 1С живут счета, отгрузки и долги — именно о них клиенту важнее всего узнать вовремя. wapi.kz даёт обычный HTTP API, поэтому 1С может отправлять сообщения WhatsApp сама, встроенными средствами платформы: без внешних компонент, библиотек и промежуточных сервисов.

Страница для программистов 1С и бухгалтерии, которая ставит им задачу. Ниже — сценарии, где вызывать отправку, готовая функция для 8.3 и два способа получать ответы клиентов.

Из 1С в WhatsApp
  1. Документ записан в 1С
  2. регламентное задание или обработка
  3. POST /messages/send
  4. клиент в WhatsApp
Из WhatsApp в 1С
  1. Клиент отвечает в WhatsApp
  2. вебхук или опрос GET /messages
  3. HTTP-сервис или задание 1С
  4. запись в базе

Что можно автоматизировать

  • Счёт на оплату — после записи счёта клиенту уходит сообщение с суммой и PDF-файлом счёта.
  • Отгрузка — проведена реализация: «Заказ отгружен, накладная №…, доставка завтра до 18:00».
  • Напоминание о долге — раз в день обработка находит счета, неоплаченные дольше N дней, и вежливо напоминает. Только клиентам, которым счёт уже выставлен, — это ожидаемое сообщение.
  • Заказ готов — для сервисных центров и мастерских: статус заказа сменился на «Готов к выдаче».
  • Акт сверки — файл по ссылке в ответ на запрос клиента.
  • Ответы клиентов — «оплатим в пятницу» ложится в регистр сведений или комментарий к контрагенту.

Как это устроено

Со стороны 1С отправка — это HTTPS-запрос из серверного кода: HTTPСоединение с ЗащищенноеСоединениеOpenSSL, HTTPЗапрос с телом JSON, собранным через ЗаписьJSON. Со стороны wapi.kz — POST /messages/send (документация): текст, фото или файл по публичной ссылке.

Где вызывать отправку — важнее самого кода. Не делайте это в ОбработкаПроведения: проведение идёт в транзакции, сетевой запрос его тормозит, а при откате сообщение уже уйдёт. Надёжнее так: при записи документа кладите задание в регистр-очередь, а регламентное задание раз в минуту отправляет и отмечает результат. Для разовых задач подойдёт внешняя обработка с кнопкой «Отправить».

Ответы клиентов можно получать двумя способами:

  • Вебхук — wapi.kz шлёт событие на HTTP-сервис вашей базы. Нужна публикация базы на веб-сервере с https и публичным адресом (про вебхуки).
  • Опрос — регламентное задание раз в несколько минут забирает новые входящие через GET /messages?direction=in&since=… (история). Публиковать базу не нужно — удобно для файловых и закрытых баз.

Настройка по шагам

  1. Подключите номер в wapi.kz и выпустите в карточке номера ключ номера: он работает только с этим номером, from не нужен.
  2. Сохраните ключ в константе (в примере — КлючWapi, тип «Строка») или безопасном хранилище базы — не в тексте модуля.
  3. Добавьте серверный общий модуль WhatsAppWapi с кодом ниже. В типовой конфигурации делайте это расширением, чтобы не снимать её с поддержки.
  4. Вызовите ОтправитьСообщение из регламентного задания или обработки, начните со своего номера.
  5. Если нужны ответы — опубликуйте HTTP-сервис и задайте его адрес вебхуком в кабинете или настройте задание-опрос.

Пример кода

Функция для платформы 8.3: текст или файл, телефон в любом формате, ошибки — в журнал регистрации.

1С
// Общий модуль WhatsAppWapi (сервер)
Функция ОтправитьСообщение(Знач Телефон, Знач Текст, Знач СсылкаНаФайл = "", Знач ИмяФайла = "") Экспорт

	Данные = Новый Структура("to", НормализоватьТелефон(Телефон));
	Если ПустаяСтрока(СсылкаНаФайл) Тогда
		Данные.Вставить("text", Текст);
	Иначе
		Данные.Вставить("file", Новый Структура("url, filename, caption", СсылкаНаФайл, ИмяФайла, Текст));
	КонецЕсли;

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

	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", "Bearer " + Константы.КлючWapi.Получить());
	Заголовки.Вставить("Content-Type", "application/json");

	Запрос = Новый HTTPЗапрос("/api/v1/messages/send", Заголовки);
	Запрос.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

	Попытка
		Соединение = Новый HTTPСоединение("wapi.kz", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
		Ответ = Соединение.ОтправитьДляОбработки(Запрос);
		Чтение = Новый ЧтениеJSON;
		Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
		Результат = ПрочитатьJSON(Чтение, Истина); // Соответствие
		Чтение.Закрыть();
	Исключение
		ЗаписьЖурналаРегистрации("wapi.kz", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
		Возврат 0;
	КонецПопытки;

	Если Ответ.КодСостояния = 200 Тогда
		Возврат Результат.Получить("id"); // id сообщения в истории wapi.kz
	КонецЕсли;
	ЗаписьЖурналаРегистрации("wapi.kz", УровеньЖурналаРегистрации.Предупреждение, , ,
		СтрШаблон("%1: %2", Результат.Получить("code"), Результат.Получить("error")));
	Возврат 0;

КонецФункции

Функция НормализоватьТелефон(Знач Телефон)
	Цифры = "";
	Для Индекс = 1 По СтрДлина(Телефон) Цикл
		Символ = Сред(Телефон, Индекс, 1);
		Если СтрНайти("0123456789", Символ) > 0 Тогда
			Цифры = Цифры + Символ;
		КонецЕсли;
	КонецЦикла;
	Если СтрДлина(Цифры) = 11 И Лев(Цифры, 1) = "8" Тогда
		Цифры = "7" + Сред(Цифры, 2);
	ИначеЕсли СтрДлина(Цифры) = 10 Тогда
		Цифры = "7" + Цифры;
	КонецЕсли;
	Возврат Цифры;
КонецФункции

Вызов для счёта с PDF (телефон контрагента берите так, как принято в вашей конфигурации — в типовых он в контактной информации):

1С
ИдСообщения = WhatsAppWapi.ОтправитьСообщение(Телефон,
	СтрШаблон("Счёт №%1 на %2 ₸ во вложении.", Счет.Номер, Формат(Счет.СуммаДокумента, "ЧДЦ=2")),
	"https://files.example.kz/invoices/" + Строка(Счет.УникальныйИдентификатор()) + ".pdf",
	"Счёт " + Счет.Номер + ".pdf");

Файл должен открываться по ссылке без авторизации — wapi.kz скачает его сам; размер — до 2 ГБ, это лимит WhatsApp. Уникальный идентификатор в адресе не даёт подобрать чужие счета. Подробнее — в гайде о фото и файлах.

Ограничения

  • Готовой обработки или расширения wapi.kz для типовых конфигураций нет — код встраивает ваш программист или мы по заявке.
  • Файлы от клиентов в событии не приходят: там hasMedia: true, а сам файл сохраняется у нас и через несколько секунд доступен по ссылке media.url в GET /messages/{id}.
  • Лимит — 1 сообщение в секунду с номера. В пакетной отправке делайте паузу между сообщениями, а код 429 rate_limited обрабатывайте повтором (лимиты).
  • Первые сообщения новым людям ограничены суточным потолком, а в первые 2 недели действует прогрев. Напоминания по всей базе контрагентов разом — плохая идея.
  • Вебхуки не повторяются: если база была недоступна, пропущенное заберите опросом истории.

Не хотите дорабатывать конфигурацию сами? Зарегистрируйтесь, подключите номер и оставьте заявку из кабинета — поможем встроить отправку. Номер стоит 9 900 ₸ в месяц, сообщения не тарифицируются (цены).

Частые вопросы

Нужна ли внешняя компонента или библиотека?

Нет. Хватает встроенных объектов платформы 8.3: HTTPСоединение, HTTPЗапрос, ЗащищенноеСоединениеOpenSSL и ЗаписьJSON.

Подойдёт ли это для файловой базы?

Для отправки — да, нужен только выход в интернет. Ответы клиентов удобнее забирать опросом GET /messages, а не вебхуком: публиковать базу не придётся. Учтите, что в файловой базе регламентные задания выполняются, пока открыт хотя бы один сеанс.

Почему не отправлять прямо при проведении документа?

Проведение идёт в транзакции: сетевой запрос замедлит его, а при откате сообщение уже уйдёт. Очередь и регламентное задание надёжнее.

Можно ли отправить счёт файлом, а не ссылкой?

Да, через поле file: файл должен лежать по публичной ссылке, мы скачаем его и отправим документом. Загрузки файла прямо из 1С в API нет.

С какого номера уйдут сообщения?

С того, к которому выпущен ключ. Для разных отделов — разные номера и ключи, подробнее в гайде о нескольких номерах.

Подключите WhatsApp к 1С

9 900 ₸ в месяц за номер, без платы за сообщения. Сервер в Казахстане, оплата Kaspi или счётом на ТОО/ИП. Подключение — около 5 минут.

Гайды по теме

Другие интеграции