[расширение] Добавление работ в 1С:Документооборот с использованием inline-бота telegram

15.12.18

Интеграция - Мессенджеры и боты

Заполнение ежедневных отчетов 1С:Документооборот используя бота telegram, реализованного на python. расширение для 8.3.11

Скачать исходный код

Наименование Файл Версия Размер
TelegramIntegration.cfe
.cfe 160,30Kb
2
.cfe 160,30Kb 2 Скачать
Добавление работ в 1С:Документооборот используя inline-бота telegram CentOS 6
.zip 52,39Kb
1
.zip 52,39Kb 1 Скачать
Добавление работ в 1С:Документооборот используя inline-бота telegram CentOS 7
.7z 51,69Kb
2
.7z 51,69Kb 2 Скачать

upd 2018.12.14

  1. Развернул на самом дешевом VPS DigitalOcean.com на центос 7 и бот продолжил свою работу
  2. Немного подправил код 

upd 2018.03.08

1. Добавил реализацию для развертки на CentOS 7
2. Переписал с python-telegram-bot на другую библиотеку pyTelegramBotAPI
3. Время на переписки/разговоры с заказчиками при сдаче работ существенно сократилось - на вопрос как доказать выполнение работ обычно достаточно просто форварднуть сообщение с подписью пользователя

upd 2017.12.21

1. Добавил сортировку проектов на стороне ДО по убыванию количества фактических часов за прошедшие 3 месяца
2. Кнопки убираются после проведения записи в ежедневный отчет

upd 2017.11.25

В связи с выходом 8.3.11 переделал на расширение для 1С:Документооборот

В нашей организации применяется почасовка, и в документообороте необходимо каждый день вбивать описание сделанных работ в ежедневный отчёт. Менеджер в конце периода собирает все, что туда запостили сотрудники, и рассылает на согласование заказчикам. Поэтому, чтобы не возникало лишних вопросов от заказчика, желательно максимально подробно описать то, что было сделано.

Вроде все логично, но заполнять эти отчёты жутко лень. И это заполнение откладывается на последние дни перед закрытием. И вот в момент заполнения уже и особо не помнишь, что там было сделано.

Плюс периодически и заказчик может пойти в отказ. Типа не делалось это, а если и делалось, то не два часа, а пятнадцать минут.

Пробовал вести записи на каждый день, пока едешь в метро. Но и это если и помогало, то недолго. И не решало проблемы с заказчиками, которые отказывались подписывать эти работы.

Для решения вышеперечисленных проблем решил сделать инлайн бота в telegram.

Выглядеть это должно было примерно следующим образом:
1. Пишешь в чатике с заказчиком, что сделано
2. Ставишь часы
3. Указываешь проект
4. Просишь заказчика подписать сразу же
5. По нажатию "провести" запись попадает в мой ежедневный отчет

Исходя из задачи от ДО мне надо:
1. Получить список проектов по пользователю
2. Записать проект часы в документ ежедневный отчёт

Эту задачу решил подняв http-сервис. Вдохновением была статья с курсов-по-1с.

Бот должен делать следующее:
1. Из инлайн команды создавать сообщение
2. Читать список проектов из http-сервиса ДО
3. Позволять редактировать затраченное время
4. Иметь возможность фиксировать подпись заказчика
5. Постить результат в ДО используя http-сервис

Бота решил писать на python

Для решения решил задействовать поднятый у нас разработческий сервер на CentOS 6.

Для теста создал простейшую базу на 1С и опубликовал ее через Apache

Общение с api telegram происходит с использованием telegram-bot-api. В момент написания первого бота использовал эту статью.

#!/usr/bin/python
import gstdobot2config #файл с настройками
import telebot
import time
import sys
from telebot import types
import json, requests

bot = telebot.TeleBot(gstdobot2config.token)
messagedata = {}
timebutton = [u"+1ч", u"+30м", u"+15м", u"-15м", u"-30м", u"-1ч"]
timevalues = [60*60,    60*30,   60*15,  -60*15,  -60*30, -60*60]

def getmessagetext(data):
    return '<b>{0}</b>\n{1}\n<b>{2}</b>\n{3}\n<b>{4}</b>\n{5} ч\n<b>{6}</b>\n{7}\n<b>{8}</b>\n{9}\n<b>{10}</b>\n{11}'.format(
		u"Описание работы:", data['WorkDescription'],
		u"Сотрудник:", data['UserID'],
		u"Затрачено времени:", data['Duration']/60/60,
		u"Проект:", data['Project']['Name'],
		u"Подписано:", data['Signed'],
		u"Проведено:", data['Posted'])	

def getkeyboard(dataid, userid, start, stop):
    try:
        getTimeIKB = lambda name: types.InlineKeyboardButton(name, callback_data='t:'+str(timebutton.index(name))+':'+dataid)
        projects = requests.get(gstdobot2config.urlProjects + userid,auth=(gstdobot2config.login, gstdobot2config.password)).json()
        getProjectIKB = lambda project: types.InlineKeyboardButton(project['Name'], callback_data='p:'+str(projects.index(project))+':'+dataid)
        back    = types.InlineKeyboardButton('U92;', callback_data='g:0:'+dataid)
        forward = types.InlineKeyboardButton('U94;', callback_data='g:1:'+dataid)
        btns = []
        if start == 1:
            btns = list(map(getProjectIKB, projects))[:5] + [forward]
        elif stop == len(projects)-1:
            btns = [back] + list(map(getProjectIKB, projects))[-5:] 
        else :
            btns = [back] + list(map(getProjectIKB, projects))[start:stop] + [forward] 
        keyboard = types.InlineKeyboardMarkup()
        keyboard.row(*btns)
        btns = list(map(getTimeIKB, timebutton))
        keyboard.row(*btns)
        keyboard.row(types.InlineKeyboardButton(u"Подписать", callback_data='s:0:'+dataid), types.InlineKeyboardButton(u"Провести", callback_data='w:0:'+dataid))
        return keyboard
    except Exception as e:
        print(e)
		
@bot.inline_handler(lambda query: len(query.query) > 10)
def query_text(inline_query):
    try:
        data = {'Project': {'Name':'','Code':''},
            'UserID': str(inline_query.from_user.id),
            'WorkType': u"ПУСТО",
            'Duration': 0,
            'Start': 1,
            'Stop': 5,
            'Signed': [],
            'Posted': u"НЕТ",
            'WorkDescription': inline_query.query}
        dataid = inline_query.id
        messagedata[dataid] = data
        keyboard = getkeyboard(dataid, data['UserID'], data['Start'], data['Stop'])
        result = types.InlineQueryResultArticle(
		    id=inline_query.id,
			title=inline_query.query, description="Описание работы",
			input_message_content=types.InputTextMessageContent(message_text=getmessagetext(data), parse_mode='HTML'),
			reply_markup = keyboard
			)
        bot.answer_inline_query(inline_query.id, [result])
    except Exception as e:
        print(e)
		
@bot.callback_query_handler(func=lambda cmd: True)
def inline(cmd):
    try:
        buttontype, buttonid, messageid = cmd.data.split(':')
        data = messagedata[messageid]
        projects = requests.get(gstdobot2config.urlProjects + data['UserID'],auth=(gstdobot2config.login, gstdobot2config.password)).json()
        if buttontype == 't':
            data['Duration'] = data['Duration'] + timevalues[int(buttonid)]
        elif buttontype == 'p':
            data['Project'] = projects[int(buttonid)]
        elif buttontype == 'g' and buttonid == '0':
            data['Start'] = max(1, data['Start']-4)
            data['Stop'] = max(5,data['Start']+4)
        elif buttontype == 'g' and buttonid == '1':
            data['Stop'] = min(len(projects)-1, data['Stop']+4)
            data['Start'] = min(len(projects)-5, data['Stop']-4)
        elif buttontype == 'w':
            writedata = {'WorkType': 'общие'}
            writedata['UserID'] = data['UserID']
            writedata['WorkDescription'] = data['WorkDescription']
            writedata['ProjectCode'] = data['Project']['Code']
            writedata['Duration'] = data['Duration']
            r = requests.post(gstdobot2config.urlPost, json=writedata,auth=(gstdobot2config.login, gstdobot2config.password))
            data['Posted'] = u"ДА"
        elif buttontype == 's':
            voter = str(cmd.from_user.first_name) + ' ' + str(cmd.from_user.last_name);
            if not voter in set(data['Signed']):
                data['Signed'].append(voter)
        content = getmessagetext(data)
        bot.edit_message_text(
            inline_message_id=cmd.inline_message_id,
            text=content, parse_mode="HTML"
        )
        if data['Posted'] == u"НЕТ":
            bot.edit_message_reply_markup(
                inline_message_id=cmd.inline_message_id,
                reply_markup=getkeyboard(messageid, data['UserID'], data['Start'], data['Stop'])
            )
    except Exception as e:
        print(e)

		
def main_loop():
    bot.polling(True)
    while 1:
        time.sleep(3)


if __name__ == '__main__':
    try:
        main_loop()
    except KeyboardInterrupt:
        print >> sys.stderr, '\nExiting by user request.\n'
        sys.exit(0)

Еще надо было создать службу что бы она запускалась. Это для CentOS 6:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          gst-do-telegram-bot
# Required-Start:    $local_fs $network $named $time $syslog
# Required-Stop:     $local_fs $network $named $time $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       gst do telegram bot
### END INIT INFO

SCRIPT='/usr/bin/python3 /usr/local/bin/gstdobot.py'
RUNAS=root

PIDFILE=/var/run/gst-do-telegram-bot.pid
LOGFILE=/var/log/gst-do-telegram-bot.log

start() {
  if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then
    echo 'Service already running' >&2
    return 1
  fi
  echo 'Starting service…' >&2
  local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
  su -c "$CMD" $RUNAS > "$PIDFILE"
  echo 'Service started' >&2
}

stop() {
  if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
    echo 'Service not running' >&2
    return 1
  fi
  echo 'Stopping service…' >&2
  kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
  echo 'Service stopped' >&2
}

uninstall() {
  echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] "
  local SURE
  read SURE
  if [ "$SURE" = "yes" ]; then
    stop
    rm -f "$PIDFILE"
    echo "Notice: log file is not be removed: '$LOGFILE'" >&2
    update-rc.d -f gst-do-telegram-bot remove
    rm -fv "$0"
  fi
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  uninstall)
    uninstall
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|uninstall}"
esac

А это для CentOS 7:

[Unit]
Description=GST support DO telegram bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/bin/gstdobot
ExecStart=/usr/bin/python3 /usr/local/bin/gstdobot/gstdobot2.py
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

Из моментов, которые реализованы откровенно плохо
1. При печати сообщения в инлайн запоминаются лишние итерации, побороть можно фиксируя нужную итерацию при посте этого сообщения, но как это сделать, пока не разобрался.
2. Нет сортировки проектов, хочу сделать на стороне ДО сортировать по убыванию количества запощенных часов
3. Не убираются кнопки после проведения записи в ежедневный отчет

Использую бота уже неделю, пока заполнять не так обломно, как лезть в ДО или восстанавливать свои сокращения перед выставлением счетов.

Посмотрим, что будет с заказчиками которые любили резать часы.

Содержание архива для CentOS 6: 

gst-do-telegram-bot - файл для запуска сервиса разместил на CentOS 6 в каталоге /etc/init.d
gstdobot.py - бот на питоне разместил на CentOS 6 в каталоге /usr/local/bin/
gstdobotconfig.py - конфиг файл где, кто, куда разместил на CentOS 6 в каталоге /usr/local/bin/
telegram-http-service.dt - пример реализации со стороны 1С:Предприятия - для работы с ботом должна быть опубликована и видна из инета - (логин:пароль - X:1qaz2wsx)

Содержание архива для CentOS 7: 

gst-do-telegram-bot.service - файл для запуска сервиса разместил на CentOS 7 в каталоге /etc/systemd/system/
gstdobot2.py - бот на питоне разместил на CentOS 7 в каталоге /usr/local/bin/gstdobot/
gstdobot2config.py - конфиг файл где, кто, куда разместил на CentOS 7 в каталоге /usr/local/bin/gstdobot/
telegram-http-service.dt - пример реализации со стороны 1С:Предприятия - для работы с ботом должна быть опубликована и видна из инета - (логин:пароль - X:1qaz2wsx)

Документооборот telegram python http-сервисы бот расширение

См. также

SALE! 25%

Конструктор ботов Телеграм, редакция 2

Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Развитие популярного решения для интеграции мессенджера Telegram с нашей любимой 1С.

15000 11250 руб.

18.06.2021    61030    296    269    

351

SALE! 25%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    34558    87    161    

183

Интеграция WhatsApp c 1С:УНФ, УТ, КА, ERP, Бухгалтерия 3

Мессенджеры и боты Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Интеграция мессенджера WhatsApp и 1С: УНФ, УТ, КА, ERP - отправка и получение сообщений, картинок, файлов и видео прямо в 1С. Расширение работает с сервисом GreenApi.

15600 руб.

23.06.2023    6172    41    11    

20

Платформа интеграции 1С с чат-ботами (Telegram, Viber, WhatsApp, Instagram, Skype, ICQ, Facebook, ВКонтакте, Одноклассники, Яндекс.Алиса, Verbox, Jivochat, Avito)

Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Мощный модуль для интеграции 1С с чат-ботами: Telegram, Viber, WhatsApp, WhatsApp Business, Instagram, ICQ, Facebook, Vkontakte, Skype, Одноклассники, Яндекс.Алиса, Avito а так же виджеты чата для сайтов: Verbox, Jivochat. Это универсальное и эффективное решение с большими возможностями, простым интерфейсом, наличием визуального конструктора, базовыми сценариями поведения из коробки, позволяющий запустить чат-ботов в течении 1-го дня.

65000 руб.

08.10.2019    57945    32    0    

152

Легкий документооборот (+чат-бот для Telegram)

Документооборот и делопроизводство (СЭД) Мессенджеры и боты Учет документов Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 Платные (руб)

Расширение для согласования справочников и документов в конфигурациях "1С: Бухгалтерия 3.0", "Управление нашей фирмой", "1С ERP Управление предприятием", "Бухгалтерия государственного учреждения". Ролевая адресация, условная маршрутизация, последовательное и параллельное согласование, уведомление о новых задачах на почту, блокировка объектов в зависимости от статуса, запрет проведения в зависимости от статуса, автозапуск процессов согласования, отчеты по исполнительской дисциплине. Не требуется снятие конфигурации с поддержки. Настройка без программирования. Версия для 1cfresh.com. Сертификат 1С-Совместимо.

14900 руб.

15.11.2018    28374    29    48    

61

Рассылки из 1С через Email, SMS, Telegram - Директ Маркетинг

Управление взаимоотношениями с клиентами (CRM) Мессенджеры и боты SMS рассылки Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Полный набор инструментов для качественных транзакционных и маркетинговых Email, SMS, Telegram рассылок из 1С. Даже простые уведомления об оплате счетов способны существенно упростить сбор дебиторской задолженности. Применение всех возможностей прямого маркетинга выводит коммуникацию с клиентами, уровень сервиса и лояльность на новый уровень.

7788 руб.

07.04.2014    84449    43    193    

129

Личный кабинет сотрудника для 1С:Документооборот 2.1 в Telegram

Мессенджеры и боты Учет документов Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Сделайте взаимодействие сотрудников компании быстрым и удобным. В Личном кабинете в Телеграм сотрудники могут получать и выполнять задачи используя популярный мессенджер

11520 руб.

29.12.2022    6934    5    11    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rpgshnik 3660 30.09.17 06:45 Сейчас в теме
Скоро телеграмм прикроют...
2. bxz 418 30.09.17 10:19 Сейчас в теме
(1) рановато хороните
sdwggg; CyberCerber; rpgshnik; +3 Ответить
3. Armando 1400 30.09.17 11:36 Сейчас в теме
Прикрепленные файлы:
Lyolik; bxz; sdwggg; CyberCerber; rpgshnik; +5 Ответить
4. sdwggg 02.10.17 08:42 Сейчас в теме
(1) Дуров ни ВК не слил, и Телеграм не сдаст!
5. avalakh 563 16.08.18 12:59 Сейчас в теме
Добрый день!
скачал TelegramIntegration.cfe
там ничего про telegram нет, вообще модулей нет - только реквизиты из конфы(((
6. bxz 418 14.12.18 23:18 Сейчас в теме
(5) основная суть расширения в HTTP-сервисе ti_TelegramExchange
Прикрепленные файлы:
Оставьте свое сообщение