Всем привет! После начала публичного бета-тестирования API Алисы я не смог пройти мимо и загорелся идеей попробовать интегрировать её с 1С. В процессе получилось много боли, страданий, но в конце концов всё заработало! В этой статье я собираюсь рассмотреть процесс интеграции по шагам с простой самописной базой, из которой мы будем получать сумму продаж.
1) Итак, для начала нам нужен Windows сервер (я купил в ultravds за 780 руб.) и доменное имя. Залезаем в DNS редактор и делаем с помощью A записи, чтобы какой-либо поддомен указывал на IP нашего сервера. У меня это, например, выглядит вот так:
То есть, у меня появляется поддомен bott.mysite.ru который указывает на IP моего сервера.
Если вы всё сделали правильно и у вас на сервере уже запущен IIS (легко нагуглить как это сделать) то вы увидите следующую картинку при визите на bott.mysite.ru
Отлично. Теперь, для работы Алисы, нужно настроить на сайте https.
2) Для бесплатного приобретения валидного, не самоподписанного сертификата, мне помогла утилита PkiSharp-winacme. У нее простой консольный интерфейс, в котором легко разобраться.
Только не забудьте при ее использовании отключить IIS, потому что ей тоже нужен порт 80. После генерации сертификатов, она добавит их в реестр, что в дальнейшем облегчит нам настройку IIS. Просто при создании новой привязки на порт 443, сертификат уже будет в списке выбора.
3) Для общения с Алисой нам понадобится HTTP сервис, который будет отвечать на POST запросы. Добавляем его в конфигурацию (я сделал файловую на 8.3.9), пишем код (можно посмотреть в прикрепленном cf) и публикуем базу на веб-сервере IIS, не забыв поставить галочку "Публиковать HTTP сервисы". После этого нам понадобится какой-нибудь отладчик, чтобы делать POST запросы и проверить работу нашего сервиса. Я использовал Advanced REST client для Хрома. И вот-тут то я столкнулся с несколькими ошибками:
3а) долгое время у меня при запросе сервиса вылетала 500 ошибка. Оказывается, потому что я поставил платформу 8.3.6 и надо было в свойствах IIS разрешить 32х разрядные приложения. Помогла мне эта статья.
3б) Сервис через отладчик не хотел работать без авторизации. Пришлось прописывать url вида https://user:password@bott.site.ru/hs/def и только тогда всё работало. Позднее именно эта особенность доставила мне больше всего хлопот и потрепала изрядно нервов.
4) Для правильного ответа Алисе, согласно документации, надо отдать не просто json, а правильно включить в него поля запроса, такие как session_id, user_id, message_id. Поэтому надо написать код для разбора пришедшего от Алисы Json запроса и выдергивания из него нужных полей в ответ. Код можно посмотреть в приложенной cf в модуле hhtp сервиса. Получается все хорошо:
И тут я подумал что успех близок, однако оказалось что Алиса не принимает в качестве Webhook URL тот формат с пользователем и паролем, который прекрасно работал в отладчике. При попытке его ввести, все время появлялась ошибка "Ошибка в ответе Webhook", причем, согласно моим логам, запрос вообще не приходил. Я обратился в техподдержку Яндекса и в тикете Ticket#18032116321077218 от 29 марта мне обещали это починить, однако на 07.04 все еще такой формат URL не поддерживается.
Тут я приуныл, но вспомнил что есть еще такая штука как OneScript, которая тоже может в HTTP сервисы.
5) После некоторых плясок с бубном и настройки сервера под запуск OneScript, у меня получилось возвращать такой же верный ответ как и из 1С, что и неудивительно - код был такой же. URL стал вида https://bott.site.ru/bin/web.os и такой формат Алиса уже приняла без ошибки
И наконец-то заработал тестовый чат на вкладке навыка "Тестирование":
Я обрадовался, и решил что для получения данных из 1С достаточно перенаправить запрос в неё.
6) При переадресации из OneScript в 1С я написал вот такой код:
СтрокаСсылки = "http://user:password@localhost/dbz/hs/def/";
Соединение = Новый HTTPСоединение(СтрокаСсылки,80,"user","password");
тело= Запрос.ПолучитьТелоКакСтроку();
Запрос1 = Новый HTTPЗапрос;
Запрос1 .Заголовки.Вставить("Content-Type","application/json");
Запрос1.УстановитьТелоИзСтроки(тело);
Ответ1с = Соединение.ОтправитьДляОбработки(Запрос1);
Возврат Ответ1с;
Но оно не взлетело и все время возникала 500 ошибка. Тут я уже приуныл окончательно и решил что ничего не получится.
7) Однако, немного пояндексив про "http сервисы без авторизации" я нашел тему на Инфостарте, и, оказывается, параметры авторизации можно прописать прямо в default.vrd. В самом верху где у вас прописан первый тег point есть путь к ИБ (у меня файловая) и туда можно дописать юзера и пароль:
ib="File="C:\onecweb\filebase";usr="username";pwd="password""
Это помогло, и ссылка на http сервис без авторизации удовлетворила Алису.
8) Собственно, нужно же сделать что-то полезное по команде Алисы и я выбрал просто отправлять в ответ пользователю сумму продаж по регистру Продажи.Обороты. Иногда вылетает ошибка "url диалога недоступен", мне кажется это из-за того что у меня файловая база. Но все равно это успех!
9) Однако, что если мы хотим более сложное поведение - те же продажи за определенный период, по определенным организациям, складам, номенклатуре. Использовать все время СтрНайти для разбора команд не очень продуктивно, поэтому следующая тема для развития - какая-то нейросеть для извлечения фактов из текста. Чтобы ей можно было передать строку вида "отчет по продажам по организации ромашка со склада Основной за неделю" и она возвращала json с найденными фактами. У Яндекса есть для этого Томита парсер, возможно в комментариях мне подскажут еще хорошие варианты, и я дополню эту статью.