add
This commit is contained in:
parent
1c3469395c
commit
1b85260b2e
@ -0,0 +1,192 @@
|
|||||||
|
# 📘 Инструкция по установке и обслуживанию Telegram JSON File Bot
|
||||||
|
|
||||||
|
## 🧩 Зависимости
|
||||||
|
|
||||||
|
- Python 3.9+
|
||||||
|
- `python3-venv`, `pip`
|
||||||
|
- Рабочий Telegram-бот (токен от @BotFather)
|
||||||
|
- URL HTTP-сервиса на стороне 1С
|
||||||
|
- Пользователь `god` на сервере
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 1. Установка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install python3 python3-pip python3-venv -y
|
||||||
|
```
|
||||||
|
|
||||||
|
Создаём директорию для проекта:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p ~/telegram_bot
|
||||||
|
cd ~/telegram_bot
|
||||||
|
```
|
||||||
|
|
||||||
|
Создаём виртуальное окружение и активируем:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
Устанавливаем зависимости:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install python-telegram-bot requests
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 2. Создание `bot.py`
|
||||||
|
|
||||||
|
Создай файл `bot.py`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano ~/telegram_bot/bot.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Вставь код (адаптируй токен и URL):
|
||||||
|
|
||||||
|
```python
|
||||||
|
import logging
|
||||||
|
import requests
|
||||||
|
from io import BytesIO
|
||||||
|
from telegram import Update
|
||||||
|
from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, filters
|
||||||
|
|
||||||
|
# Настройки
|
||||||
|
BOT_TOKEN = 'ТВОЙ_ТОКЕН'
|
||||||
|
TARGET_URL = 'http://IP_ИЛИ_ДОМЕН_1С/endpoint'
|
||||||
|
ALLOWED_USERS = {123456789} # замени на свой Telegram ID
|
||||||
|
HTTP_USERNAME = '1c_user' # если требуется Basic Auth
|
||||||
|
HTTP_PASSWORD = '1c_pass'
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
def is_authorized(user_id: int) -> bool:
|
||||||
|
return user_id in ALLOWED_USERS
|
||||||
|
|
||||||
|
async def handle_file(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
|
user_id = update.effective_user.id
|
||||||
|
|
||||||
|
if not is_authorized(user_id):
|
||||||
|
await update.message.reply_text("⛔ Доступ запрещён.")
|
||||||
|
return
|
||||||
|
|
||||||
|
document = update.message.document
|
||||||
|
if not document.file_name.endswith('.json') and not document.file_name.endswith('.txt'):
|
||||||
|
await update.message.reply_text("Отправьте .json или .txt файл.")
|
||||||
|
return
|
||||||
|
|
||||||
|
file = await document.get_file()
|
||||||
|
buffer = BytesIO()
|
||||||
|
await file.download_to_memory(out=buffer)
|
||||||
|
content_bytes = buffer.getvalue()
|
||||||
|
content_str = content_bytes.decode('utf-8', errors='replace')
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(
|
||||||
|
TARGET_URL,
|
||||||
|
data=content_str.encode('utf-8'),
|
||||||
|
headers={"Content-Type": "application/json"},
|
||||||
|
auth=(HTTP_USERNAME, HTTP_PASSWORD)
|
||||||
|
)
|
||||||
|
await update.message.reply_text(
|
||||||
|
f"✅ Файл отправлен.\n"
|
||||||
|
f"Статус: {response.status_code}\n"
|
||||||
|
f"Ответ:\n{response.text}"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
await update.message.reply_text(f"❌ Ошибка при отправке: {str(e)}")
|
||||||
|
|
||||||
|
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
|
await update.message.reply_text(f"👋 Привет! Твой Telegram ID: {update.effective_user.id}")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = ApplicationBuilder().token(BOT_TOKEN).build()
|
||||||
|
app.add_handler(MessageHandler(filters.Document.ALL, handle_file))
|
||||||
|
app.add_handler(MessageHandler(filters.TEXT & filters.Regex(r'^/start'), start))
|
||||||
|
app.run_polling()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠 3. Настройка systemd-сервиса
|
||||||
|
|
||||||
|
Создай файл:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/systemd/system/telegram-bot.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Содержимое:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Telegram JSON File Bot
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/home/god/telegram_bot
|
||||||
|
ExecStart=/home/god/telegram_bot/venv/bin/python /home/god/telegram_bot/bot.py
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
User=god
|
||||||
|
Environment=PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 4. Запуск и автозапуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl daemon-reexec
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable telegram-bot.service
|
||||||
|
sudo systemctl start telegram-bot.service
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧩 5. Обслуживание
|
||||||
|
|
||||||
|
### ▶ Запуск / остановка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl start telegram-bot.service
|
||||||
|
sudo systemctl stop telegram-bot.service
|
||||||
|
sudo systemctl restart telegram-bot.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📋 Статус
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl status telegram-bot.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📜 Просмотр логов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
journalctl -u telegram-bot.service -f
|
||||||
|
```
|
||||||
|
|
||||||
|
(Для выхода из `journalctl` нажми `Ctrl+C`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 Telegram ID
|
||||||
|
|
||||||
|
Чтобы узнать свой Telegram ID, отправь боту `/start`.
|
||||||
|
|
||||||
|
Бот ответит:
|
||||||
|
```
|
||||||
|
👋 Привет! Твой Telegram ID: 123456789
|
||||||
|
```
|
||||||
|
|
||||||
|
Добавь этот ID в список `ALLOWED_USERS`.
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,212 @@
|
|||||||
|
|
||||||
|
# Настройка обработки
|
||||||
|
|
||||||
|
Создаем новую **`внешнюю обработку`**
|
||||||
|
|
||||||
|
Создаем **`макет печатной формы`** и **`форму обработки`** для тестирования. **На форме ничего не делаем**
|
||||||
|
|
||||||
|
# Модуль формы
|
||||||
|
```bsl
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Не забудь забиндить событие формы ПриСозданииНаСервере к обработчику
|
||||||
|
// В обработчике ПриСозданииНаСервере нужно указать описание типов для списка объектов печати
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#Область ОбработчикиСобытийФормы
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||||||
|
|
||||||
|
ДополнительнаяОбработка = Неопределено;
|
||||||
|
ИдентификаторКоманды = "";
|
||||||
|
ОбъектыНазначения = Новый Массив;
|
||||||
|
|
||||||
|
Параметры.Свойство("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработка);
|
||||||
|
Параметры.Свойство("ИдентификаторКоманды", ИдентификаторКоманды);
|
||||||
|
Параметры.Свойство("ОбъектыНазначения", ОбъектыНазначения);
|
||||||
|
|
||||||
|
Если ТипЗнч(ОбъектыНазначения) <> Тип("Массив") Тогда
|
||||||
|
ВызватьИсключение "Неверный тип параметра ""Объекты назначения""";
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
ДобавляемыеРеквизиты = Новый Массив;
|
||||||
|
|
||||||
|
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ДополнительнаяОбработкаСсылка",
|
||||||
|
Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")));
|
||||||
|
|
||||||
|
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИдентификаторКоманды", ОбщегоНазначения.ОписаниеТипаСтрока(0)));
|
||||||
|
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ОбъектыНазначения", Новый ОписаниеТипов("СписокЗначений")));
|
||||||
|
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("СписокОбъектовПечати", Новый ОписаниеТипов("СписокЗначений")));
|
||||||
|
|
||||||
|
ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
|
||||||
|
|
||||||
|
ЭтотОбъект["ДополнительнаяОбработкаСсылка"] = ДополнительнаяОбработка;
|
||||||
|
ЭтотОбъект["ИдентификаторКоманды"] = ИдентификаторКоманды;
|
||||||
|
ЭтотОбъект["ОбъектыНазначения"].ЗагрузитьЗначения(ОбъектыНазначения);
|
||||||
|
|
||||||
|
НовыйЭлемент = Элементы.Добавить("СписокОбъектовПечати", Тип("ПолеФормы"), ЭтотОбъект);
|
||||||
|
НовыйЭлемент.Заголовок = "Список объектов печати";
|
||||||
|
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
|
||||||
|
НовыйЭлемент.ПутьКДанным = "СписокОбъектовПечати";
|
||||||
|
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "СписокОбъектовПечатиНачалоВыбора");
|
||||||
|
|
||||||
|
НоваяКоманда = ЭтотОбъект.Команды.Добавить("ТестПечати");
|
||||||
|
НоваяКоманда.Заголовок = "Тест печати";
|
||||||
|
НоваяКоманда.Действие = "ТестПечати";
|
||||||
|
|
||||||
|
НовыйЭлемент = Элементы.Добавить("КомандаТестПечати", Тип("КнопкаФормы"), КоманднаяПанель);
|
||||||
|
НовыйЭлемент.Заголовок = "Тест печати";
|
||||||
|
НовыйЭлемент.ИмяКоманды = "ТестПечати";
|
||||||
|
НовыйЭлемент.КнопкаПоУмолчанию = Истина;
|
||||||
|
|
||||||
|
// ================================================== ВАЖНО =========================================================
|
||||||
|
// Тут укажи нужжный тип
|
||||||
|
СписокДокументов = Новый СписокЗначений;
|
||||||
|
СписокДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСсылка.МойДокумент");
|
||||||
|
|
||||||
|
ЭтотОбъект["СписокОбъектовПечати"] = СписокДокументов;
|
||||||
|
// ==================================================================================================================
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область ОбработчикиКомандФормы
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура ТестПечати(Команда)
|
||||||
|
|
||||||
|
МассивДокументов = ЭтотОбъект["СписокОбъектовПечати"].ВыгрузитьЗначения();
|
||||||
|
МассивПечатныхФорм = СписокСформированныхПечатныхФорм(МассивДокументов);
|
||||||
|
УправлениеПечатьюКлиент.ПечатьДокументов(МассивПечатныхФорм, МассивДокументов ,ЭтотОбъект);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область СлужебныеПроцедурыИФункции
|
||||||
|
|
||||||
|
&НаКлиенте
|
||||||
|
Процедура Печать(ИмяКоманды, МассивОбъектов, ПараметрыПечати = Неопределено,
|
||||||
|
КоллекцияПечатныхФорм = Неопределено, ОбъектыПечати = Неопределено, ПараметрыВывода = Неопределено) Экспорт
|
||||||
|
|
||||||
|
ПараметрыИсточника = Новый Структура;
|
||||||
|
ПараметрыИсточника.Вставить("ИдентификаторКоманды", ЭтотОбъект["ИдентификаторКоманды"]);
|
||||||
|
ПараметрыИсточника.Вставить("ОбъектыНазначения", ЭтотОбъект["ОбъектыНазначения"]);
|
||||||
|
|
||||||
|
ПараметрыФормы = Новый Структура;
|
||||||
|
ПараметрыФормы.Вставить("ИсточникДанных", ЭтотОбъект["ДополнительнаяОбработкаСсылка"]);
|
||||||
|
ПараметрыФормы.Вставить("ПараметрыИсточника", ПараметрыИсточника);
|
||||||
|
|
||||||
|
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыФормы);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
&НаСервере
|
||||||
|
Функция СписокСформированныхПечатныхФорм(МассивДокументов)
|
||||||
|
|
||||||
|
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
|
||||||
|
|
||||||
|
// ТУТ ТОТ ЖЕ ИДЕНТИФИКАТОР, ЧТО И В МОДУЛЕ ОБЪЕКТА ОБРАБОТКИ
|
||||||
|
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ПФ_MXL_БиркаНесоответствующейПродукции");
|
||||||
|
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
|
||||||
|
|
||||||
|
ОбработкаОбъект.Печать(МассивДокументов, КоллекцияПечатныхФорм, МассивДокументов, ПараметрыВывода);
|
||||||
|
|
||||||
|
МассивПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
|
||||||
|
|
||||||
|
Возврат МассивПечатныхФорм;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
```
|
||||||
|
|
||||||
|
# Модуль объекта обработки
|
||||||
|
```bsl
|
||||||
|
#Область СлужебныйПрограммныйИнтерфейс
|
||||||
|
|
||||||
|
Функция СведенияОВнешнейОбработке() Экспорт
|
||||||
|
|
||||||
|
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
|
||||||
|
Представление = "Моя печатная форма. Это будет видеть пользователь";
|
||||||
|
Идентификатор = "УникальноеИмяКомандыКонкретноЭтойПечатнойФормы"; // произвольное имя. используется далее по коду и в модуле формы
|
||||||
|
|
||||||
|
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
|
||||||
|
ПараметрыРегистрации.Назначение = МассивНазначений();
|
||||||
|
ПараметрыРегистрации.Версия = "1.0";
|
||||||
|
ПараметрыРегистрации.БезопасныйРежим = Ложь;
|
||||||
|
ПараметрыРегистрации.Информация = "Это будет видно в карточке дополнительной обработки. Сюда пишем всякую полезную информацию";
|
||||||
|
|
||||||
|
Команда = ПараметрыРегистрации.команды.Добавить();
|
||||||
|
Команда.Представление = Представление;
|
||||||
|
Команда.Идентификатор = Идентификатор;
|
||||||
|
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
|
||||||
|
Команда.ПоказыватьОповещение = Истина;
|
||||||
|
Команда.Модификатор = "ПечатьMXL"; // ВАЖНО
|
||||||
|
|
||||||
|
Возврат ПараметрыРегистрации;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
|
||||||
|
|
||||||
|
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "УникальноеИмяКомандыКонкретноЭтойПечатнойФормы") Тогда
|
||||||
|
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
|
||||||
|
КоллекцияПечатныхФорм,
|
||||||
|
"УникальноеИмяКомандыКонкретноЭтойПечатнойФормы",
|
||||||
|
"Синоним макета",
|
||||||
|
СформироватьСобственнуюПечатнуюФорму(МассивОбъектов, ОбъектыПечати)); // тут вызов нашей функции, которая будет возвращать заполненный ТабДок
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
|
||||||
|
#Область СлужебныеПроцедурыИФункции
|
||||||
|
|
||||||
|
Функция МассивНазначений()
|
||||||
|
|
||||||
|
МассивНазначений = Новый Массив;
|
||||||
|
// Имя документа, для которого нацелена эта печатка. Пишем как в запросе
|
||||||
|
// Можно добавлять несколько назначений, но тогда нужно при получении данных для ПФ это учитывать
|
||||||
|
// Это назначение определяет, для каких документов будет выведена команда в группу "Печать"
|
||||||
|
МассивНазначений.Добавить("Документ.ПриобретениеТоваровУслуг");
|
||||||
|
Возврат МассивНазначений;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция СформироватьСобственнуюПечатнуюФорму(МассивОбъектов, ОбъектыПечати) Экспорт
|
||||||
|
|
||||||
|
ТабДок = Новый ТабличныйДокумент;
|
||||||
|
|
||||||
|
ДанныеДляПечати = ДанныеДляПечатиМоихДокументов(МассивОбъектов); // тут получаем данные для вывода
|
||||||
|
|
||||||
|
// Получаем данные, получаем макет, заполняем, возвращаем
|
||||||
|
|
||||||
|
ТабДок.Область("R1C1").Текст = "Пример вывода";
|
||||||
|
|
||||||
|
Возврат ТабДок;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
Функция ДанныеДляПечатиМоихДокументов(МассивОбъектов)
|
||||||
|
|
||||||
|
// Тут получаем данные
|
||||||
|
|
||||||
|
Запрос = Новый Запрос;
|
||||||
|
Запрос.Текст =
|
||||||
|
"ВЫБРАТЬ * Из Документ.ПриобретениеТоваровУслуг КАК Т ГДЕ Т.Ссылка В(&МассивОбъектов)";
|
||||||
|
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
|
||||||
|
|
||||||
|
Выборка = Запрос.Выполнить().Выбрать();
|
||||||
|
|
||||||
|
Возврат Выборка;
|
||||||
|
|
||||||
|
КонецФункции
|
||||||
|
|
||||||
|
#КонецОбласти
|
||||||
|
```
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user