Пример отправки оповещений из 1с windows 10 notification


Данная статья показывает пример интеграции 1с(клиентской части) и python (socket server).
Данная статья может быть полезна администраторам, программистам, но в основном интеграторам(например реализация интеграции со сторонним приложением, работа с ком портом, либо низкоуровневые действия за пределами 1с).

Код Клиента:

    АдресСервера = "localhost";
Порт = 13050;

HTTPСоединение = Новый HTTPСоединение(АдресСервера, Порт);

Сообщение = Новый Структура;

Сообщение.Вставить("title", "from 1c");
Сообщение.Вставить("text", "it`s works"+Символы.ПС+Строка(ТекущаяДата()));

ТелоЗапроса = JSON.лЗаписатьJSON(Сообщение);

HTTPЗапрос = Новый HTTPЗапрос();

HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);

HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Код Сервера:

import socket
import json
import win10toast

def send_answer(conn, data="", status="200 OK", typ="text/plain; charset=utf-8"):

data = data.encode("utf-8")

conn.send(b"HTTP/1.1 " + status.encode("utf-8") + b"
")
conn.send(b"Server: simplehttp
")
conn.send(b"Connection: close
")
conn.send(b"Content-Type: " + typ.encode("utf-8") + b"
")
conn.send(b"Content-Length: " + bytes(len(data)) + b"
")
conn.send(b"
")
conn.send(data)

def parse(conn, addr):

data = b""
print('1')
while not b"
" in data:
tmp = conn.recv(1024)
if not tmp:
break
else:
data += tmp

if not data:
return

udata = data.decode("utf-8")
print('2')
method, address, protocol = udata.split(" ", 2)
if method != "POST":
send_answer(conn, status="503 MethodError", data="Не найдено")
return

udata = udata.split("
", 1)[1]
print('3')
host, user_agent, accept, content_type, content_len, var6, data = udata.split("
", 6)

message = json.loads(data)

toaster = win10toast.ToastNotifier()
toaster.show_toast(message['title'], message['text'], duration=5, threaded=True)
print('4')
send_answer(conn, data='s_ok')


sock = socket.socket()
sock.bind(("", 13050))
sock.listen(5)

try:
while 1:
conn, addr = sock.accept()
try:
parse(conn, addr)
except:
print('except')
send_answer(conn, status="503 MethodError", data="Не найдено")
finally:
conn.close()
finally: sock.close()

1с отправляет пост запрос с данными ввиде json объекта серверу.

сервер слушает сокет, получает данные, парсит json, вызывает функцию оповещения windows 10.

Скриншот примера вызова из 1с:

апдейт(для справки):

пи скрипты возможно обернуть в  бинарь(ехе) и запускать без установленного интерпретатора, и зависимостей(пакетов)

12 Comments

  1. deutsch2008

    а что делать с файлом «.py» ?

    Reply
  2. dmarenin

    запустить

    Reply
  3. Infactum

    Native ВК была бы более правильным решением в данном случае.

    Reply
  4. Kalam

    Зачем было писать свой сервер, если win10toast сразу выводит окно?

    можно было запихать .py в макеты и открывать, передавая текст через параметры.

    1 строчка на 1С и 10 на питоне.

    Reply
  5. ivanleb

    Хорошо бы ещё функцию выложить: лЗаписатьJSON()

    Reply
  6. dmarenin

    (3) это альтернативный пример интеграции, его можно использовать не только для вывода сообщений.

    (4) можно смотри (3)

    (5) лЗаписатьJSON и сам модуль json, можно использовать стандартный(платформенный) либо вообще стрзаменить по шаблону

    Reply
  7. login1020

    (4) А можно поподробнее?

    Reply
  8. Kalam

    (7) в смысле подробнее?

    вот в 1с

    вр = ПолучитьИмяВременногоФайла(«.py»);
    мак = ПолучитьМакет(«pyf»);
    мак.Записать(вр);
    ЗапуститьПриложение(«python «+вр+» «+заголовок+» «+сообщ,,Ложь);
    

    в макет закидываем как двоичные данные пай файл

    from win10toast import ToastNotifier
    import sys
    
    if __name__ == ‘__main__’:
    t = sys.argv[1]
    m = sys.argv[2]
    q= ToastNotifier()
    q.show_toast(title=t, msg=m)
    

    Показать

    ВСЁ!

    Reply
  9. login1020

    (8) а чтобы сообщение вышло не на своём, а на определённом компьютере сети?

    Reply
  10. dmarenin

    (9) статья же об этом как раз

    Reply
  11. Kalam

    (9)

    (10) так и задумано что сообщение будет выводиться только на сервере?

    Reply
  12. dmarenin

    (11) не задумано, а применение разделения логика. да на любом пк где запущен сокет-сервер(в сети за натом порты пробросить нужно будет, это и без меня понятно)

    Reply

Leave a Comment

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