Интеграция WhatsApp с 1С: счета, отгрузки и уведомления из базы
Обновлено
В 1С живут счета, отгрузки и долги — именно о них клиенту важнее всего узнать вовремя. wapi.kz даёт обычный HTTP API, поэтому 1С может отправлять сообщения WhatsApp сама, встроенными средствами платформы: без внешних компонент, библиотек и промежуточных сервисов.
Страница для программистов 1С и бухгалтерии, которая ставит им задачу. Ниже — сценарии, где вызывать отправку, готовая функция для 8.3 и два способа получать ответы клиентов.
- Документ записан в 1С
- регламентное задание или обработка
- POST /messages/send
- клиент в WhatsApp
- Клиент отвечает в WhatsApp
- вебхук или опрос GET /messages
- HTTP-сервис или задание 1С
- запись в базе
Что можно автоматизировать
- Счёт на оплату — после записи счёта клиенту уходит сообщение с суммой и 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=…(история). Публиковать базу не нужно — удобно для файловых и закрытых баз.
Настройка по шагам
- Подключите номер в wapi.kz и выпустите в карточке номера ключ номера: он работает только с этим номером,
fromне нужен. - Сохраните ключ в константе (в примере —
КлючWapi, тип «Строка») или безопасном хранилище базы — не в тексте модуля. - Добавьте серверный общий модуль
WhatsAppWapiс кодом ниже. В типовой конфигурации делайте это расширением, чтобы не снимать её с поддержки. - Вызовите
ОтправитьСообщениеиз регламентного задания или обработки, начните со своего номера. - Если нужны ответы — опубликуйте HTTP-сервис и задайте его адрес вебхуком в кабинете или настройте задание-опрос.
Пример кода
Функция для платформы 8.3: текст или файл, телефон в любом формате, ошибки — в журнал регистрации.
// Общий модуль 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 (телефон контрагента берите так, как принято в вашей конфигурации — в типовых он в контактной информации):
ИдСообщения = 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 минут.