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

Обмен - Интеграция с WEB

Интеграция Алисы и 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:\onecweb\filebase";usr="username";pwd="password""

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

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

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

 

Скачать файлы

Наименование Файл Версия Размер
Конфигурация с http сервисом для работы с Алисой (8.3.9)
.cf 31,26Kb
09.04.18
5
.cf 31,26Kb 5 Скачать
Скрипт на OneScript для работы с Алисой
.os 5,85Kb
07.04.18
4
.os 5,85Kb 4 Скачать

См. также

Комментарии
1. metal doctor (metmetmet) 56 09.04.18 21:10 Сейчас в теме
Не до конца понял как все настроено, но однозначно круть.
Я так понял, общение с Алисой происходит в приложении на телефоне, и каким-то образом настроен вебхук на http сервис 1c?
2. Иван Коротеев (kiv1c) 449 10.04.18 09:17 Сейчас в теме
(1) пока не через телефон, а через тестовый чат на платформе Яндекс-диалогов, и там да, вебхук - ссылка с https на которые Алиса делает POST запросы.
3. Ахмад Алиев (baracuda) 3 10.04.18 11:07 Сейчас в теме
В чем суть?? Алиса смогла 1с слово продажи а вы смогли это слово распознать и дать ответ в виду готового отчета?
6. Олег Медведев (olgerd666) 49 10.04.18 16:12 Сейчас в теме
(3)ну это примерно как с чат-ботами в телеграмм. там тоже даешь боту команду - он тебе отчет. тут фишка в голосовом управлении.
4. Юрий Дешин (blackhole321) 648 10.04.18 14:14 Сейчас в теме
Поясните пожалуйста, Вы проксируете ответы через OneScript или webhook напрямую настроен на 1С?
15. Иван Коротеев (kiv1c) 449 11.04.18 14:18 Сейчас в теме
(4) после добавления авторизации в default.vrd вебхук получилось настроить напрямую на 1с
16. Юрий Дешин (blackhole321) 648 11.04.18 14:22 Сейчас в теме
(15)А что с лицензиями? Одновременных запросов может быть приличное количество.
5. Владимир Бондаревский (bonv) 104 10.04.18 16:09 Сейчас в теме
(0) С учетом
использовать файловую базу 1С не самое лучшее решение. Да и в целом не все запросы можно обработать за такое время в 1С.
8. Юрий Лазаренко (TitanLuchs) 11.04.18 10:29 Сейчас в теме
(5) Файловая база вполне разумное решение при небольшом количество запросов. А 1,5 секунд для 1С это даже много, обычно за 200-300 мсек ответ возвращается.
9. Владимир Бондаревский (bonv) 104 11.04.18 10:54 Сейчас в теме
(8)
А 1,5 секунд для 1С это даже много, обычно за 200-300 мсек ответ возвращается.

Ну если возвращать "Привет Мир!", то да) Если добавить какую-то бизнес-логику, то время ответа сильно возрастет.
10. Юрий Лазаренко (TitanLuchs) 11.04.18 11:02 Сейчас в теме
(9) Это широко распространенное заблуждение
11. Владимир Бондаревский (bonv) 104 11.04.18 12:00 Сейчас в теме
(10) В чем заблуждение? Это же очевидно что время ответа "привет мир!" будет меньше, чем время ответа, например, информации о задолженности контрагента Иванова, которую получаем запросом
12. Канат Джумадылов (Fox-trot) 54 11.04.18 12:55 Сейчас в теме
13. Владимир Бондаревский (bonv) 104 11.04.18 13:05 Сейчас в теме
(12) не очевидно, что запрос к базе данных требует какое-то время? И это время больше, чем нулевое время когда мы запрос к базе данных не делаем?
14. Юрий Лазаренко (TitanLuchs) 11.04.18 14:12 Сейчас в теме
(13) То, что время будет больше, это, конечно же, очевидно. А вот про "нулевое время" вы зря. Так как при выполнении запросов к 1С через http-сервисы нулевого времени не бывает. На установление соединения (даже не первоначального, а повторного при переиспользовании сеансов) уходит очень много времени. Причем настолько много, что если просто "выдать в ответ "Привет, мир!"" займет Х миллисекунд, то это не значит, что "сходить за данными в БД и вернуть их" займет в разы больше времени: 2Х, 3Х или 10Х. Часто это бывает всего 1,1Х, и то при большом количество запросов к 1С. Фишка в том, что ~0,9Х от общего времени занимает само подключение к базе.
Fox-trot; +1 Ответить
17. Владимир Бондаревский (bonv) 104 11.04.18 15:22 Сейчас в теме
(14) "нулевое время" упоминалось мной только в контексте "когда мы запрос к базе данных не делаем". Очевидно, что вызов сервиса занимает не нулевое время.
Причем настолько много, что если просто "выдать в ответ "Привет, мир!"" займет Х миллисекунд, то это не значит, что "сходить за данными в БД и вернуть их" займет в разы больше времени: 2Х, 3Х или 10Х.

Запрос запросу рознь. Любой запрос к виртуальной таблице ОстаткиИОбороты регистра бухгалтерии выполняется в 10 и более раз дольше, чем просто ответить "Привет мир!". Да что уж там, задача "получить информацию о задолженности контрагента Иванова, используя регистр бухгалтерии, через Алису" без дополнительных таблиц нереализуема. Ибо время будет выходить за 1.5 сек почти всегда.
18. Юрий Лазаренко (TitanLuchs) 11.04.18 15:35 Сейчас в теме
(17)
задача "получить информацию о задолженности контрагента Иванова, используя регистр бухгалтерии, через Алису" без дополнительных таблиц нереализуема. Ибо время будет выходить за 1.5 сек почти всегда.


Она реализуема на 100% путем выполнения двух http-запросов. Первым инициируем начало формирования отчета, а вторым забираем результат. Забирать можно когда угодно - хоть через 1,5 секунды, хоть через 1,5 дня.
19. Владимир Бондаревский (bonv) 104 11.04.18 16:21 Сейчас в теме
(18)
- "Алиса, какая задолженность у контрагента Иванов?"
- "Приходите завтра"

Ну нормально чо)
20. Юрий Лазаренко (TitanLuchs) 11.04.18 17:46 Сейчас в теме
(19) Если у вас взаиморасчеты формируются полтора дня, то не нормально, а грустно.
21. Игорь Александрович (nporrep) 46 12.04.18 05:00 Сейчас в теме
(20) Здравствуйте. Как там у вас, в будущем?
22. Игорь Александрович (nporrep) 46 12.04.18 05:09 Сейчас в теме
(20)
Кроме шуток, грустно на самом деле то, что Вы не допускаете в свою голову мысль о гораздо больших масштабах оперативной информации, чем те, с которыми Вы привыкли работать. Много лет назад, однажды, я столкнулся с ограничением в Excel в количестве строк на листе и всё заверте... ODBC get, динамическое наблюдение + быстрый своп, параллелизм... если вы понимаете, о чем я =)
23. Юрий Лазаренко (TitanLuchs) 12.04.18 09:18 Сейчас в теме
(22) Я не знаю, какой объем оперативной информации для вас "большой". Если хотите конкретики, то в реальных проектах мы за 300-400 миллисекунд получали выборку из 50 записей регистра сведений, содержащего 100000000 (сто миллионов) записей и успешно отображали ее в виде таблицы html на сайте. Выполняли 900 http-запросов к 1С в секунду, из которых половина выполняет запись в БД. И такое условие, как ограничение в 1,5 секунды при выполнении запроса, выполняется более чем успешно независимо от масштаба оперативной информации.
25. Александр Буганов (buganov) 49 23.05.18 07:05 Сейчас в теме
(23) можно пруф? слабо верится, что 50 записей можно выбрать из 100КК за 400 мс. Сколько людей в базе находилось в это время? Какой размер базы? Железо и версия 1С и SQL?
27. Юрий Лазаренко (TitanLuchs) 23.05.18 10:37 Сейчас в теме
(25) Я не скажу ничего про размер базы, железо и версии 1С и SQL, потому что у меня нет этой информации. Мы делали этот функционал для gilev.ru, разрабатывали только веб-морду и модули 1С, которые берут за основу уже выбранные из базы данные, обеспечивают их отображение на странице сайта и интерактивность. А выборку данных, настройку серверов и прочее ускорение работы делали сотрудники gilev.ru. Поскольку они именно на этом специализируется, получилось так быстро. На разогретой базе запрос в среднем за 400 мсек. Спросите их, возможно они поделятся информацией.
Часть этого функционала можно посмотреть, например, здесь: http://www.gilev.ru/sqlsize/.
7. Антон Антонов (monkbest) 95 11.04.18 07:57 Сейчас в теме
А можно поподробнее принцип взаимодействия пользователь/Алиса/1с
если я своей Алисе скажу "продажи" она же не полезет к Вам на сервер :)

т.е. как Алиса узнает, что запросы именно вот этого пользователя надо перенаправлять куда-то?
24. Алекс Садов (user971612) 07.05.18 19:39 Сейчас в теме
А как сделать лишь запуск проводника адреса? К примеру игры. steam://rungameid/509980
26. Евгений Зорин (evn-zorin) 21 23.05.18 07:46 Сейчас в теме
29. Максим Шувалов (Maxisussr) 24.05.18 16:42 Сейчас в теме
(0)
Не совсем понял (может, плохо читал), в чем отличие от Telegram-бота по своей сути (результату)?
Оставьте свое сообщение