Простая и пошаговая интеграция Яндекс-Алисы и 1С










Интеграция Алисы и 1С через http сервис на платформе 8.3.9. Используем виртуальный сервер, сертификат от letsencrypt, и делаем простые запросы к базе из Алисы.

Всем привет! После начала публичного бета-тестирования 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:onecwebfilebase";usr="username";pwd="password""

Это помогло, и ссылка на http сервис без авторизации удовлетворила Алису.

8) Собственно, нужно же сделать что-то полезное по команде Алисы и я выбрал просто отправлять в ответ пользователю сумму продаж по регистру Продажи.Обороты. Иногда вылетает ошибка "url диалога недоступен", мне кажется это из-за того что у меня файловая база. Но все равно это успех!

9) Однако, что если мы хотим более сложное поведение — те же продажи за определенный период, по определенным организациям, складам, номенклатуре. Использовать все время СтрНайти для разбора команд не очень продуктивно, поэтому следующая тема для развития — какая-то нейросеть для извлечения фактов из текста. Чтобы ей можно было передать строку вида "отчет по продажам по организации ромашка со склада Основной за неделю" и она возвращала json с найденными фактами. У Яндекса есть для этого Томита парсер, возможно в комментариях мне подскажут еще хорошие варианты, и я дополню эту статью.

 

33 Comments

  1. metmetmet

    Не до конца понял как все настроено, но однозначно круть.

    Я так понял, общение с Алисой происходит в приложении на телефоне, и каким-то образом настроен вебхук на http сервис 1c?

    Reply
  2. kiv1c

    (1) пока не через телефон, а через тестовый чат на платформе Яндекс-диалогов, и там да, вебхук — ссылка с https на которые Алиса делает POST запросы.

    Reply
  3. baracuda

    В чем суть?? Алиса смогла 1с слово продажи а вы смогли это слово распознать и дать ответ в виду готового отчета?

    Reply
  4. blackhole321

    Поясните пожалуйста, Вы проксируете ответы через OneScript или webhook напрямую настроен на 1С?

    Reply
  5. bonv

    (0) С учетом

    использовать файловую базу 1С не самое лучшее решение. Да и в целом не все запросы можно обработать за такое время в 1С.

    Reply
  6. olegmedvedev

    (3)ну это примерно как с чат-ботами в телеграмм. там тоже даешь боту команду — он тебе отчет. тут фишка в голосовом управлении.

    Reply
  7. monkbest

    А можно поподробнее принцип взаимодействия пользователь/Алиса/1с

    если я своей Алисе скажу «продажи» она же не полезет к Вам на сервер 🙂

    т.е. как Алиса узнает, что запросы именно вот этого пользователя надо перенаправлять куда-то?

    Reply
  8. TitanLuchs

    (5) Файловая база вполне разумное решение при небольшом количество запросов. А 1,5 секунд для 1С это даже много, обычно за 200-300 мсек ответ возвращается.

    Reply
  9. bonv

    (8)

    А 1,5 секунд для 1С это даже много, обычно за 200-300 мсек ответ возвращается.

    Ну если возвращать «Привет Мир!», то да) Если добавить какую-то бизнес-логику, то время ответа сильно возрастет.

    Reply
  10. TitanLuchs

    (9) Это широко распространенное заблуждение

    Reply
  11. bonv

    (10) В чем заблуждение? Это же очевидно что время ответа «привет мир!» будет меньше, чем время ответа, например, информации о задолженности контрагента Иванова, которую получаем запросом

    Reply
  12. Fox-trot

    (11) не очевидно

    Reply
  13. bonv

    (12) не очевидно, что запрос к базе данных требует какое-то время? И это время больше, чем нулевое время когда мы запрос к базе данных не делаем?

    Reply
  14. TitanLuchs

    (13) То, что время будет больше, это, конечно же, очевидно. А вот про «нулевое время» вы зря. Так как при выполнении запросов к 1С через http-сервисы нулевого времени не бывает. На установление соединения (даже не первоначального, а повторного при переиспользовании сеансов) уходит очень много времени. Причем настолько много, что если просто «выдать в ответ «Привет, мир!»» займет Х миллисекунд, то это не значит, что «сходить за данными в БД и вернуть их» займет в разы больше времени: 2Х, 3Х или 10Х. Часто это бывает всего 1,1Х, и то при большом количество запросов к 1С. Фишка в том, что ~0,9Х от общего времени занимает само подключение к базе.

    Reply
  15. kiv1c

    (4) после добавления авторизации в default.vrd вебхук получилось настроить напрямую на 1с

    Reply
  16. blackhole321

    (15)А что с лицензиями? Одновременных запросов может быть приличное количество.

    Reply
  17. bonv

    (14) «нулевое время» упоминалось мной только в контексте «когда мы запрос к базе данных не делаем». Очевидно, что вызов сервиса занимает не нулевое время.

    Причем настолько много, что если просто «выдать в ответ «Привет, мир!»» займет Х миллисекунд, то это не значит, что «сходить за данными в БД и вернуть их» займет в разы больше времени: 2Х, 3Х или 10Х.

    Запрос запросу рознь. Любой запрос к виртуальной таблице ОстаткиИОбороты регистра бухгалтерии выполняется в 10 и более раз дольше, чем просто ответить «Привет мир!». Да что уж там, задача «получить информацию о задолженности контрагента Иванова, используя регистр бухгалтерии, через Алису» без дополнительных таблиц нереализуема. Ибо время будет выходить за 1.5 сек почти всегда.

    Reply
  18. TitanLuchs

    (17)

    задача «получить информацию о задолженности контрагента Иванова, используя регистр бухгалтерии, через Алису» без дополнительных таблиц нереализуема. Ибо время будет выходить за 1.5 сек почти всегда.

    Она реализуема на 100% путем выполнения двух http-запросов. Первым инициируем начало формирования отчета, а вторым забираем результат. Забирать можно когда угодно — хоть через 1,5 секунды, хоть через 1,5 дня.

    Reply
  19. bonv

    (18)

    — «Алиса, какая задолженность у контрагента Иванов?»

    — «Приходите завтра»

    Ну нормально чо)

    Reply
  20. TitanLuchs

    (19) Если у вас взаиморасчеты формируются полтора дня, то не нормально, а грустно.

    Reply
  21. nporrep

    (20) Здравствуйте. Как там у вас, в будущем?

    Reply
  22. nporrep

    (20)

    Кроме шуток, грустно на самом деле то, что Вы не допускаете в свою голову мысль о гораздо больших масштабах оперативной информации, чем те, с которыми Вы привыкли работать. Много лет назад, однажды, я столкнулся с ограничением в Excel в количестве строк на листе и всё заверте… ODBC get, динамическое наблюдение + быстрый своп, параллелизм… если вы понимаете, о чем я =)

    Reply
  23. TitanLuchs

    (22) Я не знаю, какой объем оперативной информации для вас «большой». Если хотите конкретики, то в реальных проектах мы за 300-400 миллисекунд получали выборку из 50 записей регистра сведений, содержащего 100000000 (сто миллионов) записей и успешно отображали ее в виде таблицы html на сайте. Выполняли 900 http-запросов к 1С в секунду, из которых половина выполняет запись в БД. И такое условие, как ограничение в 1,5 секунды при выполнении запроса, выполняется более чем успешно независимо от масштаба оперативной информации.

    Reply
  24. user971612

    А как сделать лишь запуск проводника адреса? К примеру игры. steam://rungameid/509980

    Reply
  25. buganov

    (23) можно пруф? слабо верится, что 50 записей можно выбрать из 100КК за 400 мс. Сколько людей в базе находилось в это время? Какой размер базы? Железо и версия 1С и SQL?

    Reply
  26. evn-zorin

    чем бы дитя не тешилось

    Reply
  27. TitanLuchs

    (25) Я не скажу ничего про размер базы, железо и версии 1С и SQL, потому что у меня нет этой информации. Мы делали этот функционал для gilev.ru, разрабатывали только веб-морду и модули 1С, которые берут за основу уже выбранные из базы данные, обеспечивают их отображение на странице сайта и интерактивность. А выборку данных, настройку серверов и прочее ускорение работы делали сотрудники gilev.ru. Поскольку они именно на этом специализируется, получилось так быстро. На разогретой базе запрос в среднем за 400 мсек. Спросите их, возможно они поделятся информацией.

    Часть этого функционала можно посмотреть, например, здесь: http://www.gilev.ru/sqlsize/.

    Reply
  28. Maxisussr

    (0)

    Не совсем понял (может, плохо читал), в чем отличие от Telegram-бота по своей сути (результату)?

    Reply
  29. SiAl

    Слышал байку, что уже есть WMS с голосовым управлением. Типа, ходит кладовщик с гарнитурой и через Алису запрашивает по номеру заказа на сборку что собирать и где, а та отвечает. Потом также кладовщик голосом фиксирует окончание сбора через Алису. Типа тогда руки свободны от бумаг, планшета, ТСД и бегать к компу нет надобности постоянно. Но что-то не могу найти через поисковики такое решение. Наверно все-таки это пока байка.

    Reply
  30. acanta

    Как много девушек хороших готовы поработать вместо Алисы. Блютус, мобилка и громкая связь.

    Reply
  31. olo_lo4

    Ребят, а есть продолжение этой по настоящему бомбической темы ?

    Reply
  32. kiv1c

    (33) а что бы вы хотели видеть в продолжении? у меня пока идей новых нет)

    Reply
  33. xyzet

    Эпловская Сири на очереди следующая или у нее нет возможности подобного взаимодействия?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *