Контекст
Рассмотрим торговую компанию с полевой командой: торговые представители, супервайзеры, руководство. Продажи, остатки и работа сотрудников учитываются в 1С. Отчёты в ней есть, но открыть их можно только с рабочего компьютера, а торговый большую часть дня проводит в дороге.
Поэтому отчёты просят у офиса: звонком, сообщением, письмом. Кто-то в офисе формирует отчёт, выгружает и пересылает. Мессенджер у сотрудников уже есть, и он открыт весь день.
Проблема
Отчёт зависит от человека в офисе. Супервайзер не может посмотреть продажи команды перед встречей, если некому их выгрузить.
Доступ к 1С вне офиса — это риск. Удалённый рабочий стол или веб-клиент для каждого торгового означает лицензии, пароли на телефонах и учётную систему, открытую в интернет.
Пересылка файлов не учитывает права. Выгруженный отчёт уходит дальше в чат, и проверить, кто его видел, уже нельзя.
Ограничения
Учётная система не должна становиться доступной из интернета: это первое, о чём спросит ответственный за безопасность. Отсюда следует, что все соединения должны инициироваться изнутри офиса.
Права должны совпадать с теми, что действуют в компании: торговый видит только свои продажи, супервайзер — свою команду, директор — всё. Проверка в интерфейсе бота не считается: её обходят подменой параметра.
Первый вход должен однозначно связать аккаунт мессенджера с сотрудником. Ввод номера телефона руками не подходит — так можно указать номер руководителя.
Диагностика
Инвентаризация отчётов. Какие отчёты нужны, кому, с какими фильтрами, сколько времени формируется каждый и можно ли сформировать его на сервере без открытия формы. Отчёт, который формируется дольше минуты, требует другой схемы обмена, и это нужно знать до оценки.
Источник ролей. Где в 1С определено, кто торговый, а кто супервайзер, и как описан состав команды. Если этого нет, роль придётся завести — это отдельная работа на стороне учётной системы.
Качество телефонов. Вход строится на номере телефона в карточке сотрудника. Устаревшие и общие номера всплывают на этом шаге, а не после запуска.
Сетевой путь. Есть ли у сервера 1С исходящий доступ и где разместить сервер бота. От ответа зависит, как устроен защищённый канал.
Предлагаемая архитектура
Бот — отдельный сервис. Он отвечает только за мессенджер: кнопки, диалог, выбор параметров, отправку файлов. Бизнес-логики в нём нет, данных он не хранит.
1С отвечает на несколько вопросов. Через HTTP-сервис учётная система сообщает, кто этот пользователь, какие отчёты ему доступны, какие значения можно выбрать в фильтрах, и формирует сам отчёт в PDF.
Меню строится по описанию из 1С. Учётная система отдаёт список отчётов с типами фильтров. Бот рисует кнопки по этому описанию, поэтому новый отчёт не требует правки бота.
Вход по контакту из мессенджера. Сотрудник нажимает системную кнопку «Поделиться номером». Бот принимает контакт, только если он принадлежит самому отправителю, и передаёт номер в 1С для поиска сотрудника.
Канал открывает офис. Сервер 1С сам поднимает защищённый туннель к серверу бота. HTTP-сервис доступен только внутри туннеля и под отдельной учётной записью с минимальными правами.
Реализация
Работа идёт параллельно с двух сторон. Описание обмена согласуется в первую очередь: по нему разработчик 1С делает HTTP-сервис, а бот разрабатывается на заглушке, не дожидаясь учётной системы. Стыковка — проверка готового описания, а не совместная отладка.
Так интерфейс выглядит для сотрудника. Ниже три сценария: отчёт по запросу, сводка по расписанию с кратким разбором и вопрос голосом с оповещением по порогу.
- 01Вход по номеру телефонаСотрудник нажимает «Поделиться номером». Бот принимает только собственный контакт пользователя — чужой номер подставить нельзя.
- 02Меню по роли1С узнаёт сотрудника и его роль. Супервайзер видит только положенные ему отчёты.
- 03Параметры кнопкамиПериод, бренд и сотрудник выбираются кнопками. В списке сотрудников — только его команда.
- 04PDF из 1СПосле подтверждения 1С формирует отчёт с ограничениями роли, бот присылает PDF.
- 01Отчёт по расписаниюУтром супервайзер получает сводку по команде за вчера. Без запроса.
- 02AI-разбор отчётаК PDF приходит короткий вывод: что изменилось к прошлому периоду и кто отклонился. Цифры берутся из 1С, модель их не вычисляет.
- 03Сразу к деталямИз вывода одной кнопкой открывается отчёт по нужному сотруднику.
- 01Вопрос голосомТорговый в дороге спрашивает голосом. Бот распознаёт речь и сам выбирает отчёт и параметры.
- 02Ответ из 1СБот отвечает цифрами из 1С и называет отчёт, из которого они взяты. PDF — по кнопке.
- 03Оповещение по порогуКогда остаток падает ниже нормы, 1С отмечает событие, и бот сам пишет ответственному.
Отчёты по расписанию и оповещения хранятся в 1С: кому какой отчёт присылать и какие пороги отслеживать, задаёт администратор учётной системы. Бот забирает их сам, поэтому направление соединений не меняется.
Краткий разбор к отчёту строится по цифрам, которые 1С отдаёт вместе с PDF. Модель формулирует вывод, но не вычисляет показатели: каждое число в разборе взято из учётной системы.
Надёжность и нештатные ситуации
- Отчёт формируется долго. Сотрудник видит, что отчёт готовится. Если формирование дольше допустимого, запрос переводится в очередь, и бот присылает файл по готовности.
- 1С недоступна. Бот отвечает понятным сообщением, а администратор получает оповещение. Запросы не теряются молча.
- Номер телефона у нескольких сотрудников. Привязка не выполняется, бот предлагает обратиться к администратору. Угадывать сотрудника нельзя.
- Сотрудник уволен или заблокирован. Статус проверяется в 1С при каждом обращении, поэтому доступ закрывается сразу, без отдельного действия в боте.
- Повторное нажатие кнопки. Пока отчёт формируется, второй такой же запрос от того же сотрудника не запускается.
- Ответ модели не по формату. Разбор не отправляется, сотрудник получает отчёт без него. Отчёт важнее комментария.
Безопасность и работа с данными
Бот не хранит отчёты и номера телефонов: файл передаётся сотруднику и не остаётся на сервере бота. Связь аккаунта с сотрудником, роли и журнал запросов живут в 1С.
Сервер бота закрыт снаружи: вход только по ключам, лишние порты закрыты, обновления безопасности ставятся автоматически. Ключи доступа к мессенджеру и к модели хранятся в окружении сервера и не попадают в репозиторий.
В модель уходят только итоговые цифры отчёта, доступные роли сотрудника, без персональных данных клиентов. Если требования компании не допускают внешний сервис, разбор отключается, а остальная часть бота работает без изменений.