Я представляю небольшую компанию ПрогТехБизнес.
-
Нам уже больше 10 лет, но я до сих пор считаю, что мы – стартап. Ничего не меняется. Как 10 лет назад мы были стартапом, так и остаемся.
-
У нас достаточно высококвалифицированная команда, потому что люди, которые к нам приходят, проходят очень жесткий саркастический отбор путем того, что, если человек просто не выдерживает этого дикого сарказма по поводу качества его решений, он просто уходит. Получается, что команда – высококвалифицированная, но с ними невозможно работать. Они даже мне, руководителю, могут запросто сказать: «Ты тут сегодня такое написал – это надо выложить, чтобы все поржали».
-
И да, мы отвратительно представлены в интернете. Если вы найдете наш сайт, вам будет за него так же стыдно, как мне (есть такое понятие – испанский стыд).
Но что можно сказать о нас, как о разработчиках?
-
Мы глубоко интегрируемся в бизнес нашего клиента – это наше кредо, мы не делаем маленьких решений, не пишем маленькие разработки, мы всегда говорим о том, что если мы с вами работаем, то это надолго и всерьез. И дело не в деньгах, которые мы заработаем, а дело в понимании того, что мы для вас делаем и как мы ваш бизнес будем понимать.
-
Мы начали автоматизировать себя еще до того, как это стало мейнстримом. Когда компания ПрогТехБизнес только появилась, нас было всего двое, и никакой автоматизации двум человекам не нужно, потому что мы легко могли обо всем договориться. Но у нас уже тогда появилась система управления задачами, где мы начали что-то делать.
-
Но время шло, прошло 13 лет, и мы застряли. Объективно оценивая путь, который мы прошли – мы немного застряли в прошлом веке, мы не можем похвастаться тем, что у нас самые лучшие методики разработки. Но мы работаем в этом направлении, и я постараюсь про это тоже рассказать.
Кто я? В ИТ-мире меня знают как vandalsvq.
-
Я – Тони Старк без костюма, инженер, программист, руководитель.
-
На Инфостарте я представлен собственными разработками, которые, как правило, делались для нашей компании, а потом немного ушли в мир.
-
Некогда активно участвовал в сообществе 1С++ (если кто-то вообще помнит, что для 7.7 такое было).
-
И у меня тяжелая участь – я основной разработчик внутреннего инструментария в нашей компании. Как правило, я поднимаю руку и говорю: «Ребята, завтра у нас будет все по-новому».
Я открыт для обратной связи, ищите меня везде по нику vandalsvq. Люблю общаться с разносторонними людьми – это очень интересно.
5 минут про Slack
У всех вас наверняка есть Telegram, WhatsApp, Viber, Skype и т.д. Когда вы пользовались этими мессенджерами, у вас точно возникала ситуация – сначала в группе конструктивно общается 10 человек, а потом кто-то начинает разводить флейм, и в какой-то момент группа превращается в дикий треш и угар. Когда в этом большом полотне обсуждений начинают теряться важные вещи, ты уже перестаешь понимать, что вообще происходит.
У меня была такая история с моим предыдущим телефоном – ему было 10 лет, и он улетел об стену, потому что меня просто это все достало. Эти бесконечные уведомления, люди, пишущие ни о чем, в группах, на которые ты подписан из-за того, что там на 100 тысяч сообщений одно важное. В общем, телефон улетел в стену. Его просто нужно было поменять. Нашел хороший способ.
-
Slack – это отличная замена WhatsApp, Telegram и другим мессенджерам, потому что у него есть множество вариантов организации способов взаимодействия – публичные каналы, приватные каналы, личные сообщения. Вы скажете – а что тут нового? В Slack есть треды – ветки внутри сообщений. Когда вы создаете сообщение, и оно становится темой для последующего обсуждения – человек проваливается внутрь и начинает общаться в отдельной ветке. Тогда это полотно уже превращается в полотно важных сообщений, внутри которых идет общение. Правда, у вас будет сначала одна большая проблема – должен быть человек, который будет писать: «Идите в тред», потом удалять сообщения, переносить их в тред. Но со временем все привыкнут, поверьте.
-
Вторая вещь, которая мне очень понравилась, и я ее просто полюбил – это гибкая настройка уведомлений. Я ненавижу телефоны, ненавижу уведомления – я вообще ненавижу, когда меня трогают, и отключаю все, что только можно. Но Slack мне позволил подписаться на важные слова в уведомлениях, на пару важных каналов, замьютив их на определенных платформах – в телефон мне нужно присылать уведомления тогда-то, на десктоп – тогда-то и т.д. И мне это все помогло избавиться от множества фонового шума при том, что у нас в Slack общается множество людей – даже заказчики подключены, причем, они там такую вакханалию устраивают, что просто тихий ужас. Поэтому мне особенно нравится механизм «Не беспокоить».
-
Встроенные напоминания – тоже ничего нового, вы можете создавать напоминания в телефоне себе, в ToDo, где угодно. Когда я нахожу очень важное сообщение и хочу почитать этот тред, я его либо добавляю в избранное, либо в напоминания. И тихо вечером, когда все уснули, сижу и перечитываю то, что написали.
-
И мое любимое – открытые механизмы интеграции. Можно пользоваться интеграцией с G Suite. А мы написали свое приложение, где автоматизировали очень многие вопросы, связанные с управлением разработкой. Возможность построить собственную интеграцию – это та киллер-фича, которая отличает Slack от множества других мессенджеров. И, конечно, очень приятный момент, что те ограничения, которые есть в бесплатной версии, позволяют ей спокойно пользоваться в не очень крупных командах. Если, конечно, у вас команда на 100 человек, возможно, вам и не хватит 10 000 сообщений, которые хранятся в памяти и поиске, но нам пока хватает. Тем более что многие вещи потом переходят в задачи.
Slack – это не система учета задач. Это просто система общения. Мы поговорили, обсудили, приняли решение – на основе этого формируется задача, предпринимаются какие-то действия и т.д.
Тем не менее, давайте с вами поговорим о том, как построить собственную интеграцию. Или вообще, что такое приложение в Slack – что оно умеет.
Приложение в Slack
Slack дает нам множество возможностей:
-
Мы можем отправлять любые сообщения в разрешенные каналы, просто давая право боту писать в этот канал. Какие это могут быть сообщения – мы с вами поговорим чуть позже. В любом случае, это отличная система для построения каких-то важных оповещений.
-
Вторая, моя любимая тема – это slash-команды для директивного общения. Slash-команды – это отличный способ научить 30 человек говорить одинаково, потому что научить бота понимать 30 человек, если честно, намного сложнее. А 30 человек научить общаться похожим образом, запомнить какие-то команды, дать им подсказки – это очень легко.
-
Система подписок на события – отличная тема, позволяет вам в вашем приложении отслеживать, что вообще происходит в Slack – какие изменения происходят в каналах, какие пользователи в них вступают или, наоборот, покидают. Можно отслеживать, как меняются статусы – там есть игра «HeyTaco!», где в качестве благодарности можно выставлять друг другу такосы, и по общему количеству такосов у пользователя определяется, кто молодец. Конечно, это все баловство, тем не менее, там можно сделать приложение, которое подписывается на событие и ведет счетчик, когда кто-то поставил эмоджи к вашему сообщению.
-
Любое приложение для Slack – это, в первую очередь, еще и бот, который может писать и получать сообщения, и может немного притворяться человеком.
-
И интерактивные элементы сообщений – это то, чего нет в других мессенджерах. Это – возможность добавить в сообщение элементы взаимодействия, аналогичные полям ввода данных в 1С. Вы все их знаете – это поля выбора, выпадающие списки, флажки и т.д. Но об этом чуть позже. Так вот эти элементы сообщений – это то, чего нет в других мессенджерах. Они нам позволяют построить сообщения не только от пользователя к нашему приложению и от приложения к пользователю, но и еще вдобавок получить обратную связь.
Но давайте обо всем по порядку.
Механизмы интеграции
Чтобы все это получить, Slack нам дает 6 вариантов интеграции (7 вариант – это классическое API).
-
Первый вариант – это Incoming webhooks. Собственно, это и есть отправка произвольных сообщений в любые каналы.
-
Interactive messages – это возможность вставлять элементы, создавать интерактивные сообщения. Чуть позже я покажу скриншоты приложения, вы поймете, о чем я говорю.
-
Slash Commands – это те команды, которые начинаются с косой черты. Информация, переданная с помощью slash-команды, приходит к вам в приложение.
-
Bot users – он здесь помечен синим цветом, и почему это так, я расскажу позднее. Про боты у меня есть отдельное особое мнение, и, честно признаться, сначала я думал попытаться сделать что-то типа интересного «умного бота», но тут меня ждал определенный фейл.
-
Event Subscriptions – это возможность подписаться на любые изменения, которые происходят в Slack, про это я уже говорил раньше.
-
И последнее, красное, Real-time messaging. К сожалению, этот механизм взаимодействия со Slack для 1С недоступен без использования внешних компонент, потому что используются веб-сокеты, а с ними 1С работает только через ВК.
Но, опять-таки, как выбрать, чем пользоваться?
Выбор механизма интеграции
Есть схема по выбору механизма интеграции. Она когда-то была написана самим Slack для японцев на японском языке, и было весело пытаться ее перевести с японского. Слава Богу, я нашел вариант на английском и немного ее доработал для понимания, что происходит в 1С.
Схема остается классической, вы можете ее прочитать. Но, когда будете читать, обратите внимание на желтые квадратики. Это то, что 1С либо не умеет, либо есть альтернатива.
Для Real-time messaging есть альтернатива в виде веб API и подписки на события, но, к сожалению, если вы хотите знать все, что происходит к Slack по каждому чиху, вас тут ждет небольшое разочарование. Наверное, ничего не получится без ВК.
Легкий старт. Incoming Webhooks
Давайте теперь поговорим, насколько легко в этом во всем стартануть.
Допустим, вы хотите построить систему интерактивных уведомлений. С чего начать в этом случае:
-
Ставите Slack.
-
Переходите по адресу https://api.slack.com/.
-
Создаете свое собственное приложение, называете его, как вам нравится.
-
В настройках Slack включаете функциональность Incoming Webhooks.
-
И указываете, к какому каналу нужно привязать это приложение.
В результате получаете ссылку, по которой вы можете отправлять из вашей системы POST-запрос, чтобы что-то постить в Slack.
Что именно вы собираетесь сообщать из своей системы в Slack – это уже вопрос к вам. Лично мое мнение – устраивать из Slack систему уведомления о том, что изменился статус задач – это то еще удовольствие. Не потому, что это плохо, а потому, что, если вы безальтернативно не даете человеку отключиться от вашей нотификации – это, реально, достает. Поэтому дайте возможность отключить эту функциональность тем людям, которым эти уведомления получать не обязательно.
В любом случае, уведомления – это очень важно. Например, у вас работает сервер, у него прекрасные показатели работоспособности – он 99,9% времени работает, но в какой-то момент все падает. И этот 0,01% приходится на то время, когда вы отдыхаете с друзьями. Как об этом узнать? Кому-то такое сообщение удобно получать с помощью SMS, а кому-то в Slack. Это позволяет быстро среагировать и, возможно, что-то сделать.
Но когда мы дальше рассмотрим интерактивные сообщения, вы увидите, что можно не просто отреагировать, но и отдавать назад определенные команды, которые будут выполнены. В этом нам помогут slash-команды.
Slash-команды
Slash-команда – это кодовое слово, написанное через косую черту.
Свою автоматизацию в Slack мы начали с того, что у нас начали отмечать планируемые отсутствия сотрудника на рабочем месте.
У нас не регламентируется время, сколько ты находишься в офисе. Каждый человек волен самостоятельно принимать решение, где он работает. Задача должна быть выполнена, все остальное меня лично, как руководителя, не волнует. Главное – команда должна знать:
-
где ты находишься в данный момент – работаешь на удаленке или в офисе;
-
и как с тобой взаимодействовать – может быть, тебя вообще лучше не беспокоить.
Для этой цели мы ввели маленькую команду: /отсутствие и научили ее понимать такие аргументы: «сегодня» («завтра»), «с 10 до 17», «указание причины», «не беспокоить», «согласовать» (в этом случае отсутствие уйдет на согласование к руководителю проекта, менеджеру – к тому, кому это надо).
Конечно, даже такая маленькая команда у нас долго приживалась, но потом она так многими полюбилась, что внедрение других slash-команд дальше проходило намного проще. Люди привыкли, они поняли удобство, что не так сложно запомнить команду «/отсутствие сегодня». Это человекопонятный язык.
Что мы дальше стали делать? Мы написали ряд команд для нашей системы управления АСУП:
-
/asup connect – соединяет пользователя с программой;
-
/asup manage – позволяет управлять вашими настройками;
-
/asup create – позволяет создавать задачи;
-
/asup [номер задачи] [вид работ] [затраченное время] [описание] – либо посмотреть статусы, либо установить затраты, которые вы понесли.
-
/asup help (или /asup ?) – справка по возможностям бота
-
/asup list – увидеть все задачи
-
/asup commands – посмотреть, какие команды еще доступны.
Как это все включается? Все работает примерно так же, как и другие механизмы:
-
мы включаем механизм slash-команд;
-
создаем slash-команды, придумываем им короткое лаконичное простое очень понятное всем название;
-
и после этого нам нужно дать ссылку, куда Slack будет отправлять POST-запрос каждый раз, когда человек вводит эту команду;
-
для этого мы создаем в 1С HTTP-сервис;
-
создаем для него URL-шаблон;
-
задаем обработчик POST-события, и все – ничего сложного.
Маленький нюанс – конечно, при разработке вы, скорее всего, будете использовать localhost, потому что мало кто имеет дома белый IP, и выставлять наружу какие-то сервисы, которые могут заддосить ваш комп, подвесить его на время – сомнительное удовольствие.
Поэтому просто запомните – ngrok. Маленькая утилита, которая прокидывает туннель между псевдо-адресом в интернете и вашим localhost. Прекрасная утилита, решает проблему.
На слайде видно, что у команды Request URL ссылается на домен https://934e2eb6.ngrok.io. Это возможность прокинуть туннель между интернетом и вашим локалхостом.
После этого пишете обработчик события для POST-команды и решаете, что делать.
А по поводу «что делать и как правильно отвечать» – тут маленький нюанс.
Отвечать нужно быстро. В отличие от 1С мы не имеем права очень долго думать, у нас на то, чтобы ответить, установлен лимит три секунды. Что вы можете сделать за три секунды? Проверить авторизацию, узнать, что человек отправил правильную команду, и сказать: «Я вас понял, все будет сделано, шеф!».
Поэтому – немедленный ответ, подтверждение получения команды и дальше выполнение отложенных действий, если это требуется (с помощью фонового задания и выполнения в фоне).
Мои рекомендации:
-
вместо пустого ответа с кодом 200 лучше напишите любое слово, хотя бы просто: «Понял»;
-
если вы не хотите, чтобы все видели ответ, добавьте в него реквизит («response_type»: «in_channel»), тогда это будет личное сообщение – это очень хорошая возможность Slack, когда у вас в общем канале человеку приходит сугубо личное сообщение, которое видит только он;
-
добавьте команду help и в любой непонятной ситуации возвращайте предложение о помощи – это мастхев;
-
включите экранирование имен пользователей и каналов – не нужно вам в программе знать ничего кроме кода вашего пользователя;
-
и придумайте лаконичные и понятные имена всем вашим командам. При этом учитывайте, что это имя должно быть уникальным. Например, если вы придумаете команду todo, то вы совершенно случайно обнаружите, что Slack предлагает в своем магазине очень много приложений, которые реализуют эту команду. Нужно избегать дублирования, чтобы разграничивать наши и чужие приложения.
Кстати, все эти скриншоты взяты из нашей системы – это то, что наша система отвечает пользователям в случае, когда они к ней обращаются по определенным командам.
Интерактивные элементы
Интерактивные элементы – это самая главная фича. Пожалуйста, поля выбора из списка, поля ввода многострочного текста, флажки, переключатели, какие-то кнопки меню, поля для выбора даты и т.д.
Элементов достаточно, чтобы эмулировать практически любую форму ввода. Вы, наверное, можете даже попробовать себе бухучет построить в Slack. Будет забавно. Только зачем?
-
На слайде перечислены все доступные элементы, которые можно вставлять в сообщение. За маленьким исключением. Сообщение – это все-таки короткая строка, здесь не нужно вставлять много элементов.
-
Чтобы сделать полноценную форму, есть возможность создавать модальные формы – такие же, как мы привыкли видеть в 1С (выскакивает окошко, человек что-то вводит и т.д.).
-
Есть маленький нюанс – обработка событий по изменению этих реквизитов. Это отдельная история. О ней чуть позже.
-
Чтобы вам было удобно, Slack предусмотрел Block Builder Kit – заходите, играйтесь.
-
А мы, кроме этого, написали ряд библиотек, которые позволяют вам не задумываться о том, как эти элементы упаковываются в JSON-пакеты и создаются. Поэтому, когда все это будет выложено на Инфостарт, находите, берите, пользуйтесь – я буду только рад.
Чтобы мы смогли обработать ответ пользователя:
-
Должна быть включена функциональность Interactive Components (обработка событий интерактивных компонент). Мы ее включаем и указываем в качестве Request URL адрес POST-обработчика, который на стороне нашей системы получает изменение поля и как-то на это реагирует
-
Есть также очень полезная вещь – динамическое поле выбора. Если у вас справочник «Контрагенты» на 1000 полей, а вы хотите человеку дать выбор контрагента в сообщении, то, наверное, не стоит передавать JSON-пакет на все 1000 наименований. Это глупо. Достаточно реализовать простейший сценарий – человек вводит ИНН, наименование контрагента, и из справочника подбираются какие-то подходящие позиции. Для этого вы постите обработчик Select Menus и после этого можете совершенно спокойно получить этот запрос. Это как процедура ОбработкаВыбора() в менеджере справочника. Если проводить аналогии – ничего сверхъестественного в этом нет. Поэтому подписываемся на изменение элементов, подписываемся на выбор из меню.
-
И мы с вами можем привязывать к сообщению отдельные пункты меню – Actions. Например, вы хотите, чтобы из сообщения можно было сразу же создавать задачу – вы создаете пункт меню «Создать задачу в АСУП», и привязываете к нему обработчик. Вам придет текст сообщения, и вы сможете его обработать. Это точно так же обрабатывается в POST-запросе – точно так же делается HTTP-сервис, URL-шаблон и POST-обработчик к нему, в котором прописывается, куда Slack будет обращаться.
Но тут вас ждет маленький сюрприз. На слайде показано, как выглядит пример сообщения, когда у нас человек получает два поля и две кнопки.
В случае с 1С это у нас определяется контекстом – мы все знаем про элементы на форме. А когда пользователь что-то меняет в Slack, то Slack нам сообщает только про то, что поменялось это поле, при этом вы не узнаете, что есть другие поля, другие кнопки и т.д. Когда другое поле поменяется – вы узнаете, что оно поменялось. А когда пользователь нажмет кнопку ОК, вы узнаете, что кнопка ОК нажата, а что на этой форме еще находилось – вы понятия не имеете.
Но это легко решается. Когда вы отправляете подобные формы, создайте простой регистр сведений с измерениями «Ключ блока» и «Ключ элемента». И каждый раз, когда вам приходит такое уведомление с ключом блока и ключом элемента, вы будете туда по ключам элементов дописывать значение, которое человек ввел. А при нажатии на кнопку «Записать» вы сможете, обратившись к этому регистру сведений, эти данные получить. Ничего сложного.
Единственное, что я бы порекомендовал ввести в этом регистре сведений очистку по таймингу, чтобы данные по блоку через какое-то время автоматически удалялись. Иначе регистр просто переполнится – он вообще должен быть минимальным при условии, что у вас не так много таких сообщений.
Подписка на события
Следующий элемент, который позволяет вам взаимодействовать со Slack – это подписка на события. У подписки есть определенная особенность. Дело в том, что, когда вы включаете любой другой режим интеграции Slack и создаете для него ссылку, Slack эту ссылку не проверяет, верит вам на слово, что она где-то в интернете доступна, в нее можно отправить POST-запрос, и все будет хорошо.
Но при включении подписок на события Slack сначала просит вас подтвердить, что существует определенный обработчик, который будет готов принять подписку на событие.
Это все опять решается просто: вы точно так же делаете HTTP-сервис, точно так же создаете URL-шаблон и реализуете для него POST-обработчик. Но только сначала вам в POST-обработчике нужно сделать обработку первого запроса от Slack, чтобы подтвердить, что у вас все хорошо, и ваш URL работает. То есть если обычно вы заходите в Slack, что-то настраиваете, а потом возвращаетесь в 1С и допрограммируете, то здесь вы сначала программируете в 1С, потом настраиваете Slack, а потом опять продолжаете программировать в 1С.
Чем вам поможет подписка на событие?
-
Во-первых, вы можете узнать об упоминаниях вашего приложения. Это очень неплохой кейс.
-
Или вы можете реагировать на добавление в Slack нового пользователя. Когда в коллектив приходит новый человек, ему, как правило, тяжело сразу понять, что вообще происходит. Добавьте человека в Slack, и, если у вас настроена подписка на событие добавления нового пользователя, отправьте сообщение: «Добро пожаловать в нашу систему! Здесь у нас находится база знаний, а здесь еще что-то. Здесь у нас бухгалтер, а здесь программист. А этого человека лучше вообще никогда не трогай».
-
Или, например, можно парсить сообщения на присутствие в них знака «#», который означает номер задачи, над которой ведется работа. И в ответ выдавать информацию о том, в каком статусе эта задача сейчас находится, и что вообще с ней происходит. Например, вы пишете человеку: «Что с задачей #номер?». И Slack вам сам отвечает – задача находится у того-то в таком-то статусе.
Боты
А теперь про боты. Боты бывают либо тупые, либо умные.
Тупые боты пишутся очень легко, и они крайне просто заменяются slash-командами.
Например, тупые боты могут выдавать отчеты по выбору: «Я могу тебе дать: 1. Отчет А; 2. Отчет Б; 3. Отчет В». Вы выбираете. Потом он у вас спрашивает, какие вам нужны настройки и выдает список вариантов отчета. Вы опять выбираете, и после этого вам бот присылает отчет.
Но вы же могли сразу написать slash-команду «/отчет», чтобы Slack выдал список вариантов предопределенных настроек. Это намного проще, намного понятнее, намного эффективнее.
А умные боты – это уже другая история. Вы можете интегрироваться с Яндекс.Диалог, с TensorFlow – отдать туда текст и получить в ответ структуру, где данные разделены по городам, датам, каким-то другим признакам. А дальше у вас с этой нейросетью начинается новая веселая жизнь, где важен контекст, в рамках которого вы общаетесь, и вам нужно попытаться понять, что в этой структуре относится к вам, и что с этим делать. Это очень прекрасная тема, которая вас погрузит в то, что к 1С имеет очень мало отношения.
Поэтому боты умные – это дорого и долго. А тупые боты никому не нужны, потому что все предыдущие механизмы нам их спокойно заменяют.
Немного о разном
У Slack недавно появилась прекрасная вещь – это рабочие области вашего приложения. Это как главное окно в 1С, где выводится количество задач, запланированные на день события и т.д. Вы можете то же самое сделать в Slack. Здесь приведен пример, как Outlook ведет свое главное окно.
Кроме того, есть возможность обратиться к Slack через запрос к веб-API и сделать множество других полезных вещей.
Важно, что приложение для Slack можно сделать за пять минут. В ближайшее время (плановый срок – июнь 2021 года) мы планируем опубликовать на Инфостарте нашу конфигурацию с примерами взаимодействия. Если вы встроите ее общие модули к себе или построите на их основе расширение, вы сделаете приложение за пять минут. Чтобы его оформить красиво, вам понадобится полчаса. А после того, как вы попадете в этот мир, вас вряд ли отпустит, и вы всю жизнь будете это развивать. Это надолго и всерьез.
Ищите цикл статей «Полезный код для программистов 1С». Там есть еще и другие полезные лайфхаки.
Желающие могут присоединиться к разработке, рассматриваю любой способ взаимодействия, потому что одному в жизни немного тяжело.
*************
Данная статья написана по итогам доклада (видео), прочитанного на INFOSTART MEETUP Kazan.