1
0
mirror of https://github.com/BlizD/Tasks.git synced 2025-03-19 21:07:53 +02:00

Merge pull request #248 from GenVP/Task240

#240 Добавление текущего дела, вопроса, задачи через телеграмм
This commit is contained in:
Anton Ivanov 2020-09-12 08:20:03 +03:00 committed by GitHub
commit 0c24192ab6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 1445 additions and 584 deletions

View File

@ -523,9 +523,12 @@
КонецЕсли;
//- #190 SZ 16.03.2020
//+ #240 Пиганов Г.В. 2020-09-08
// +++ 79Vlad 20.12.2018
узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
//узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
// --- 79Vlad 20.12.2018
узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, Исполнитель);
//- #240 Пиганов Г.В. 2020-09-08
КонецПроцедуры
@ -613,9 +616,12 @@
КонецЕсли;
//- #190 SZ 16.03.2020
//+ #240 Пиганов Г.В. 2020-09-08
// +++ 79Vlad 20.12.2018
узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
//узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
// --- 79Vlad 20.12.2018
узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, СтарыйИсполнитель);
//- #240 Пиганов Г.В. 2020-09-08
КонецПроцедуры
@ -652,8 +658,11 @@
узОбщийМодульСервер.ОтправитьПисьмо(ДопПараметры);
//+ #240 Пиганов Г.В. 2020-09-08
//Павлюков
узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
//узТелеграммСервер.ВыполнитьРассылку(ДопПараметры);
узТелеграмБот.ОтправитьСообщение(ДопПараметры.ТекстПисьма, МассивНаблюдателей);
//- #240 Пиганов Г.В. 2020-09-08
КонецПроцедуры

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.10">
<CommonModule uuid="8f79d0f2-3bdc-43f6-ae0d-3393a1b1c89a">
<CommonModule uuid="a09a4d95-e432-43c6-b8ec-1e5fe87fb22b">
<Properties>
<Name>узТелеграммСервер</Name>
<Name>узТелеграмБот</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Уз телеграмм сервер</v8:content>
<v8:content>Уз телеграм бот</v8:content>
</v8:item>
</Synonym>
<Comment/>
@ -15,7 +15,7 @@
<Server>true</Server>
<ExternalConnection>false</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>true</ServerCall>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>

View File

@ -0,0 +1,640 @@
#Область ПрограммныйИнтерфейс
// #240 Пиганов Г.В. 2020-09-08
// Возвращает настройки бота
//
// Возвращаемое значение:
// Структура - структура с параметрами
// * ТокенБота - Строка - токен телеграмм-бота
// * ТекущийПрокси - Число,Неопределено - текущий индекс прокси. Заполняется в ЗаполнитьНастройкиПрокси
//
Функция НастройкиБота() Экспорт
НастройкиБота = Новый Структура;
НастройкиБота.Вставить("ТокенБота", Константы.узТелеграмм_ТокенБота.Получить());
НастройкиБота.Вставить("ТекущийПрокси", Неопределено);
Возврат НастройкиБота;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Добавляет в настройки бота данные прокси
//
// Параметры:
// НастройкиБота - Структура - структура настроек для заполнения
//
// Возвращаемое значение:
// НастройкиБота - Структура - входящие настройки бота
// * ТекущийПрокси - Число - Индекс текущего прокси. Равен 0 и изменяется при выполнении запросов
// * Прокси - Массив структур - Массив доступных прокси. Задаются в регистре сведений узПроксиСерверы
// ** Адрес - Строка - адрес прокси
// ** Порт - Число - порт прокси
// ** Логин - Строка - логин прокси
// ** Пароль - Строка - пароль прокси
//
Процедура ЗаполнитьНастройкиПрокси(НастройкиБота) Экспорт
Прокси = РегистрыСведений.узПроксиСерверы.ПолучитьМассивНастроекПроксиСерверов();
Если Прокси.Количество() > 0 Тогда
НастройкиБота.Вставить("Прокси", Прокси);
НастройкиБота.ТекущийПрокси = 0;
КонецЕсли;
КонецПроцедуры
// #240 Пиганов Г.В. 2020-09-08
// Возвращает новые сообщения относительно переданного ИД
//
// Параметры:
// MaxMessageID - Необязательное. Идентификатор последнего полученного сообщения (не номер в чате).
// Сообщения получаются после этого номера. Если не указано, то значение
// получается из элемента-константы ТелеграмMaxMessangeID.
// Ответ - HTTPОтвет - если указана переменная, то в нее помещается ответ, полученный при запросе
// НеПолучатьПовторно - Булево - Если Истина, то последний идентификатор сообщения
// будет сохранен в элемент-константу ТелеграмMaxMessangeID
//
// Возвращаемое значение:
// Массив структур - Данные полученных сообщений:
// * Номер - Строка - Номер сообщения в чате
// * ДатаУниверсальная - Дата и время - дата сообщения (UTC+0:00)
// * Дата - Дата и время - дата сообщения приведенная к текущему часовому поясу сеанса
// * ПользовательПредставление - Строка - представление пользователя в телеграмм
// * ПользовательИД - Строка - идентификатор пользователя телеграмм
// * ПользовательИмя - Строка - имя пользователя в телеграмм. Может быть пустым
// * Текст - Строка - Текст сообщения
// * Пользователь - СправочникСсылка.Пользователи - ссылка на пользователя, найденная по данным ПользовательИД
// * Файлы - Массив структур - Массив файлов сообщения:
// ** Имя - Строка - имя файла с расширением. Для фото не задано
// ** ИД - Строка - идентификатор файла. Используется для получения файла
// ** Размер - Число - размер файла
// ** Ширина - Число - ширина изображения. Задано только для фото
// ** Высота - Число - высота изображения. Задано только для фото
//
Функция ПолучитьНовыеСообщения(MaxMessageID = "", Ответ = Неопределено, НеПолучатьПовторно = Истина) Экспорт
ПолученныеСообщения = Новый Массив;
НастройкиБота = НастройкиБота();
Если ПустаяСтрока(НастройкиБота.ТокенБота) Тогда
Возврат ПолученныеСообщения;
КонецЕсли;
ЗаполнитьНастройкиПрокси(НастройкиБота);
Если ПустаяСтрока(MaxMessageID) Тогда
ИДПоследнегоПринятогоСообщения = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТелеграмMaxMessangeID", Тип("Строка"), , Ложь);
Иначе
ИДПоследнегоПринятогоСообщения = MaxMessageID;
КонецЕсли;
ПараметрыЗапроса = Новый Соответствие;
Если НЕ ПустаяСтрока(ИДПоследнегоПринятогоСообщения) Тогда
ПараметрыЗапроса.Вставить("offset", ИДПоследнегоПринятогоСообщения);
КонецЕсли;
Если НЕ ВыполнитьЗапросHTTP(НастройкиБота, "getUpdates", ПараметрыЗапроса, Ответ) Тогда
ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,,,
"Не смогли получить сообщения телеграм");
Возврат ПолученныеСообщения;
КонецЕсли;
ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
ОтветСоответствие = СоответствиеИзСтрокиJSON(ОтветСтрокаJSON);
Если ОтветСоответствие["ok"] <> Истина Тогда
Возврат ПолученныеСообщения;
КонецЕсли;
ИндексыКУдалению = Новый СписокЗначений;
ИндексыСообщений = Новый Соответствие;
ИндексСообщения = 0;
КэшПользователей = ВсеПользователиТелеграмм();
ОтборПользователя = Новый Структура("ПользовательИД");
Для Каждого Update Из ОтветСоответствие["result"] Цикл
ИДСообщения = Формат(Update["update_id"] + 1, "ЧГ=");
Если ИДПоследнегоПринятогоСообщения < ИДСообщения Тогда
ИДПоследнегоПринятогоСообщения = ИДСообщения;
КонецЕсли;
ДанныеСообщения = Новый Структура;
ДанныеСообщения.Вставить("Обработано", Ложь);
ДанныеСообщения.Вставить("ИД", ИДСообщения);
Message = Update["message"];
Если Message = Неопределено Тогда
EditedMessage = Update["edited_message"];
Если EditedMessage <> Неопределено Тогда
// Получено отредактированное сообщение
Message = EditedMessage;
ИндексИсходногоСообщения = ИндексыСообщений[Message["message_id"]];
Если ИндексИсходногоСообщения = Неопределено Тогда
// Исходное сообщение было в предыдущем запросе и уже обработано.
// При текущей реализации такие отредактированные сообщения не обрабатываем
Продолжить;
КонецЕсли;
// Отредактированные сообщения должны быть удалены после обработки
ИндексыКУдалению.Добавить(ИндексИсходногоСообщения);
КонецЕсли;
КонецЕсли;
Если Message <> Неопределено Тогда
msgChat = Message["chat"]; // данные чата пользователя
//msgFrom = Message["from"]; // данные пользователя сообщения
ДанныеСообщения.Вставить("Номер", Message["message_id"]);
ДанныеСообщения.Вставить("ДатаУниверсальная", '19700101' + Message["date"]);
// Преобразование универсальной даты в местное время сеанса
ДанныеСообщения.Вставить("Дата", МестноеВремя(ДанныеСообщения.ДатаУниверсальная));
ДанныеСообщения.Вставить("ПользовательПредставление", msgChat["last_name"] + " " + msgChat["first_name"]);
ДанныеСообщения.Вставить("ПользовательИД", msgChat["id"]);
ДанныеСообщения.Вставить("ПользовательИмя", msgChat["username"]);
ДанныеСообщения.Вставить("Текст", Строка(Message["text"]));
// Добавление артинок и файлов
ПрикрепленныеФайлы = Новый Массив;
msgPhoto = Message["photo"]; // прикрепленные фото
Если ТипЗнч(msgPhoto) = Тип("Массив") Тогда
// Если в массиве 3 картинки, то это "превью маленькое" 320*190, "настоящая картинка", "превью большое" 800*475
Если msgPhoto.Количество() = 3 Тогда
msgPhoto = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(msgPhoto[1]);
КонецЕсли;
Для Каждого msgPhotoSize Из msgPhoto Цикл
ДанныеФайла = Новый Структура;
ДанныеФайла.Вставить("Имя", "");
ДанныеФайла.Вставить("ИД", msgPhotoSize["file_id"]);
ДанныеФайла.Вставить("Ширина", msgPhotoSize["width"]);
ДанныеФайла.Вставить("Высота", msgPhotoSize["height"]);
ДанныеФайла.Вставить("Размер", msgPhotoSize["file_size"]);
ПрикрепленныеФайлы.Добавить(ДанныеФайла);
КонецЦикла;
КонецЕсли;
msgDocument = Message["document"]; // прикрепленные документы и картинки как файлы
Если ТипЗнч(msgDocument) = Тип("Соответствие") Тогда
ДанныеФайла = Новый Структура;
ДанныеФайла.Вставить("Имя", msgDocument["file_name"]);
ДанныеФайла.Вставить("ИД", msgDocument["file_id"]);
ДанныеФайла.Вставить("Размер", msgDocument["file_size"]);
ПрикрепленныеФайлы.Добавить(ДанныеФайла);
КонецЕсли;
Если ПрикрепленныеФайлы.Количество() > 0 Тогда
// Для файлов передается заголовок, а не текст
ДанныеСообщения.Текст = Строка(Message["caption"]);
КонецЕсли;
ДанныеСообщения.Вставить("Файлы", ПрикрепленныеФайлы);
// Поиск пользователя по ИД пользователя телеграмм
ПользовательСсылка = Неопределено;
ОтборПользователя.ПользовательИД = ДанныеСообщения.ПользовательИД;
НайденныеСтроки = КэшПользователей.НайтиСтроки(ОтборПользователя);
Если НайденныеСтроки.Количество() > 0 Тогда
ПользовательСсылка = НайденныеСтроки[0].Ссылка;
КонецЕсли;
ДанныеСообщения.Вставить("Пользователь", ПользовательСсылка);
КонецЕсли;
Если НЕ ПустаяСтрока(ДанныеСообщения.Текст) ИЛИ ДанныеСообщения.Файлы.Количество() > 0 Тогда
ПолученныеСообщения.Добавить(ДанныеСообщения);
ИндексыСообщений[ДанныеСообщения.Номер] = ИндексСообщения;
ИндексСообщения = ИндексСообщения + 1;
КонецЕсли;
КонецЦикла;
// Удаление исходных отредактированных сообщений
ИндексыКУдалению.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Для Каждого ЭлементСписка Из ИндексыКУдалению Цикл
ПолученныеСообщения.Удалить(ЭлементСписка.Значение);
КонецЦикла;
Если НеПолучатьПовторно Тогда
Справочники.узКонстанты.УстановитьЗначениеКонстанты("ТелеграмMaxMessangeID", ИДПоследнегоПринятогоСообщения);
КонецЕсли;
Возврат ПолученныеСообщения;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Скачивает и помещает во временное хранилище файл с указанным ИД
// Параметры:
// ИД - Строка - идентификатор файла телеграмм. Передается с сообщением.
// НастройкиБота - Структура - структура с настройками бота. Если передана
// не переменная, то в нее будут помещены настройки.
//
// Возвращаемое значение:
// Строка - адрес во временном хранилище с двоичными данными файла
//
Функция ПолучитьФайл(ФайлИД, НастройкиБота = Неопределено) Экспорт
Если НастройкиБота = Неопределено Тогда
НастройкиБота = НастройкиБота();
КонецЕсли;
ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("file_id", ФайлИД);
Ответ = Неопределено;
Если НЕ ВыполнитьЗапросHTTP(НастройкиБота, "getFile", ПараметрыЗапроса, Ответ) Тогда
ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,,
, "Не смогли получить файл телеграм");
Возврат Неопределено;
КонецЕсли;
ОтветСоответствие = СоответствиеИзСтрокиJSON(Ответ.ПолучитьТелоКакСтроку());
msgFile = ОтветСоответствие["result"];
ФайлURL = "https://api.telegram.org/file/bot" + НастройкиБота.ТокенБота + "/" + msgFile["file_path"];
ПараметрыПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.ПараметрыПолученияФайла();
ПараметрыПолучения.ЗащищенноеСоединение = Истина;
ДанныеФайла = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(ФайлURL, ПараметрыПолучения, Истина);
АдресФайла = ?(ДанныеФайла.Статус, ДанныеФайла.Путь, Неопределено);
Возврат АдресФайла;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Отправляет текстовое сообщение переданным пользователям
//
// Параметры:
// ТекстСообщения - Строка - Текст сообщения в формате markdown
// Получатели - Массив, СправочникСсылка.Пользователь - массив пользователей для получения сообщения.
// Сообщение отправляется только пользователям с заполненным ИД телеграмма
// и с установленным флагом "Использовать рассылку через телеграмм"
// Ответ - Структура или Соответствие - доп. параметры, которые должны быть переданы в параметры запроса
//
Процедура ОтправитьСообщение(ТекстСообщения, Получатели, УведомлятьПользователя = Ложь, Ответ = Неопределено) Экспорт
Ответ = Неопределено;
НастройкиБота = НастройкиБота();
Если ПустаяСтрока(НастройкиБота.ТокенБота) Тогда
Если УведомлятьПользователя Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Сообщение не отправлено, т.к. не задан токен телеграмм-бота");
КонецЕсли;
Возврат;
КонецЕсли;
Выборка = ВыборкаПользователейТелеграмДляОтправки(Получатели);
Если Выборка.Количество() = 0 Тогда
Если УведомлятьПользователя Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"Сообщение не отправлено, т.к. не заданы получатели или у получателей не включена рассылка через телеграмм");
КонецЕсли;
Возврат;
КонецЕсли;
ИспользоватьПрокси = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
"ТелеграммИспользоватьПроксиДляОтправки", Тип("Булево"), Ложь, Истина, Истина);
Если ИспользоватьПрокси Тогда
ЗаполнитьНастройкиПрокси(НастройкиБота);
КонецЕсли;
ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("parse_mode", "Markdown");
ПараметрыЗапроса.Вставить("disable_web_page_preview", "true");
ПараметрыЗапроса.Вставить("text", ТекстСообщения);
Пока Выборка.Следующий() Цикл
ПараметрыЗапроса.Вставить("chat_id", Формат(Выборка.ПользовательИД, "ЧГ="));
ОтветУспешен = ВыполнитьЗапросHTTP(НастройкиБота, "sendMessage", ПараметрыЗапроса, Ответ);
Если НЕ ОтветУспешен Тогда
ЗаписьЖурналаРегистрации("Телеграмм.Отправка", УровеньЖурналаРегистрации.Ошибка,,
, "Не смогли отправить пользователю <" + Выборка.ПользовательИД + ":" + Выборка.Пользователь + ">");
КонецЕсли;
Если УведомлятьПользователя Тогда
Если ОтветУспешен Тогда
ТекстСообщения = "Сообщение удачно отправлено" ;
Иначе
ТекстСообщения = "Не смогли отправить сообщение телеграм пользователю [" + Выборка.ПользовательИД + "]. Подробнее смотрите в журнале регистрации."
КонецЕсли;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// #240 Пиганов Г.В. 2020-09-08
// Заменяет в переданной строки символы для корректного отражения в строке URL
// Может быть использована при выполнении GET-запросов
//
Функция ЗаменитьЗарезервированныеСимволыURL(ОбрабатываемаяСтрока) Экспорт
Если ПустаяСтрока(ОбрабатываемаяСтрока) Тогда
Возврат ОбрабатываемаяСтрока;
КонецЕсли;
пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
"ТелеграммИспользоватьЗаменуСимволовВДругуюКодировку",Тип("Булево"),,Истина,Истина);
Если пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку Тогда
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(37),"%25"); // "%"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(33),"%21"); // "!"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(34),"%22"); // """ (кавычка)
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(35),"%23"); // "#"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(36),"%24"); // "$"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(38),"%26"); // "&"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(39),"%27"); // "'"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(42),"%2A"); // "*"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(44),"%2C"); // ","
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(58),"%3A"); // ":"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(59),"%3B"); // ";"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(60),"%3C"); // "<"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(61),"%3D"); // "="
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(62),"%3E"); // ">"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(63),"%3F"); // "?"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(91),"%5B"); // "["
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(93),"%5D"); // "]"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(94),"%5E"); // "^"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(96),"%60"); // "`"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(123),"%7B"); // "{"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(124),"%7C"); // "|"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(125),"%7D"); // "}"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(32),"%20"); // " " (пробел)
Иначе
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%25",Символ(37) ); // "%"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%21",Символ(33) ); // "!"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%22",Символ(34) ); // """ (кавычка)
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%23",Символ(35) ); // "#"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%24",Символ(36) ); // "$"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%26",Символ(38) ); // "&"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%27",Символ(39) ); // "'"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2A",Символ(42) ); // "*"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2C",Символ(44) ); // ","
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3A",Символ(58) ); // ":"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3B",Символ(59) ); // ";"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3C",Символ(60) ); // "<"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3D",Символ(61) ); // "="
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3E",Символ(62) ); // ">"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3F",Символ(63) ); // "?"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5B",Символ(91) ); // "["
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5D",Символ(93) ); // "]"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5E",Символ(94) ); // "^"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%60",Символ(96) ); // "`"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7B",Символ(123)); // "{"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7C",Символ(124)); // "|"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7D",Символ(125)); // "}"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%20",Символ(32) ); // " " (пробел)
КонецЕсли;
Возврат ОбрабатываемаяСтрока;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Выполняет HTTPЗапрос для телеграмм по переданным параметрам и с обходом доступных прокси, если они заданы
//
// Параметры:
// НастройкиБота - Структура - структура настроек бота
// * ТокенБота - Строка - токен бота телеграмм. Получается при создании бота
// * ТекущийПрокси - Строка,Неопределено - если Неопределено, то прокси не используется,
// иначе индекс прокси в массиве НастройкиБота.Прокси
// * Прокси - Массив структур - Необязательный. Массив настроек доступных прокси
// ** Адрес - Строка - Адрес прокси
// ** Порт - Число - Порт прокси
// ** Логин - Строка - Логи прокси
// ** Пароль - Строка - Пароль прокси
// Команда - Строка - команда телеграмм API
// ПараметрыЗапроса - Структура,Соответствие - дополнительные параметры запроса. Передаются в HTTPЗапрос
// Ответ - HTTPОтвет - переменная для получения результата запроса
// ЭтоЗапросPOST - Булево - Признак выполнения POST, а не GET запроса. При GET запросе параметры
// передаются в строке URL, а при POST передаюттся в теле запроса
//
// Возвращаемое значение:
// Булево - признак успешного выполнения запроса (код ответа 200 или 300)
//
Функция ВыполнитьЗапросHTTP(НастройкиБота, Команда, ПараметрыЗапроса, Ответ, ЭтоЗапросPOST = Истина) Экспорт
ЕстьПрокси = НастройкиБота.ТекущийПрокси <> Неопределено;
// Цикл обхода прокси, если они есть или запрос без прокси
Пока Истина Цикл
СоединениеHTTP = НовоеСоединениеHTTP(НастройкиБота);
Ресурс = "bot" + НастройкиБота.ТокенБота + "/" + Команда;
Если ЭтоЗапросPOST Тогда
// Запрос POST. Параметры в теле запроса
СтрокаJSON = СтрокаJSONИзСоответствия(ПараметрыЗапроса);
ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive");
ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json");
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJSON);
Попытка
Ответ = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
ЗаписьЖурналаРегистрации("Телеграмм.Отправка", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Ответ = Неопределено;
КонецПопытки;
Иначе
// Запрос GET. Параметры в строке URL запроса
Если ПараметрыЗапроса.Количество() > 0 Тогда
Ресурс = Ресурс + "?";
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
Ресурс = Ресурс + "&" + КлючИЗначение.Ключ + "=" + КлючИЗначение.Значение;
КонецЦикла;
КонецЕсли;
ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive");
Попытка
Ответ = СоединениеHTTP.Получить(ЗапросHTTP);
Исключение
Ответ = Неопределено;
КонецПопытки;
КонецЕсли;
ОтветУспешен = Ответ <> Неопределено И (Ответ.КодСостояния = 200 ИЛИ Ответ.КодСостояния = 300);
Если НЕ ЕстьПрокси Тогда
Прервать; // Ответ получен успешный или нет
КонецЕсли;
Если ОтветУспешен Тогда
ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
// прокси может уже не работать, или внесен в гос реестр
Если СтрНайти(НРег(ОтветСтрокаJSON), "<html>") = 0 Тогда
// Прокси успешно отработал
НастройкиПрокси = НастройкиБота.Прокси[НастройкиБота.ТекущийПрокси];
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, 1);
Прервать;
КонецЕсли;
КонецЕсли;
// Прокси не отработал
НастройкиПрокси = НастройкиБота.Прокси[НастройкиБота.ТекущийПрокси];
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
// Переход к следующему прокси
Если НастройкиБота.ТекущийПрокси + 1 = НастройкиБота.Прокси.Количество() Тогда
// Закончились рабочие прокси
НастройкиБота.ТекущийПрокси = 0;
ОтветУспешен = Ложь;
Ответ = Неопределено;
Прервать;
КонецЕсли;
НастройкиБота.ТекущийПрокси = НастройкиБота.ТекущийПрокси + 1;
КонецЦикла;
Возврат ОтветУспешен;
КонецФункции
#КонецОбласти
// #240 Пиганов Г.В. 2020-09-08
// Создает новое HTTPСоединение для бота телеграмм с учетом выбранного прокси
//
// Параметры:
// НастройкиБота - Структура - структура настроек бота
// * ТекущийПрокси - Строка,Неопределено - если Неопределено, то прокси не используется,
// иначе индекс прокси в массиве НастройкиБота.Прокси
// * Прокси - Массив структур - Необязательный. Массив настроек доступных прокси
// ** Адрес - Строка - Адрес прокси
// ** Порт - Число - Порт прокси
// ** Логин - Строка - Логи прокси
// ** Пароль - Строка - Пароль прокси
//
// Возвращаемое значение:
// HTTPСоединение - созданное соединение
//
Функция НовоеСоединениеHTTP(НастройкиБота)
Если НастройкиБота.ТекущийПрокси = Неопределено Тогда
ИнтернетПрокси = Неопределено;
Иначе
НастройкиПрокси = НастройкиБота.Прокси[НастройкиБота.ТекущийПрокси];
ИнтернетПрокси = Новый ИнтернетПрокси(Ложь);
ИнтернетПрокси.Установить("https", НастройкиПрокси.Адрес, НастройкиПрокси.Порт, НастройкиПрокси.Логин, НастройкиПрокси.Пароль, Ложь);
КонецЕсли;
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,, ИнтернетПрокси, 30, Новый ЗащищенноеСоединениеOpenSSL());
Возврат Соединение;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Используется в регламентном задании для получения и обработки сообщений
//
Процедура РегламентноеПолучениеИОбработкаСообщений() Экспорт
НастройкиБота = НастройкиБота();
Сообщения = ПолучитьНовыеСообщения();
Для Каждого Сообщение Из Сообщения Цикл
узТелеграмБотКоманды.ОбработатьКомандыСообщения(НастройкиБота, Сообщение);
КонецЦикла;
КонецПроцедуры
// #240 Пиганов Г.В. 2020-09-08
// Возвращает таблицу пользователей, у которых заполнен идентификатор пользователя телеграмм
//
// Возвращаемое значение:
// ТаблицаЗначений - Таблица пользователей
// * ПользовательИД - Строка - идентификатор пользователя телеграмм
// * Ссылка - СправочникСсылка.Пользователи - ссылка на пользователя
//
Функция ВсеПользователиТелеграмм()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.узИДПользователяТелеграмм КАК ПользовательИД,
| МАКСИМУМ(Пользователи.Ссылка) КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.узИДПользователяТелеграмм <> 0
|
|СГРУППИРОВАТЬ ПО
| Пользователи.узИДПользователяТелеграмм";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Возвращает выборку из запроса с пользователями с учетом отбора, для которых разрешена
// отправка сообщений в телеграмм и у которых заполнен идентификатор пользователя телеграмм
//
// Параметры:
// Пользователи - Массив, СправочникСсылка.Пользователь - массив или один пользователь
//
// Возвращаемое значение:
// ВыборкаИзРезультатаЗапроса - выборка пользователей
// * Пользователь - СправочникСсылка.Пользователь - Ссылка на пользователя
// * ПользовательИД - идентификатор пользователя телеграмм
//
Функция ВыборкаПользователейТелеграмДляОтправки(Пользователи)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Ссылка КАК Пользователь,
| Пользователи.узИДПользователяТелеграмм КАК ПользовательИД
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.Ссылка В(&Пользователи)
| И Пользователи.узИспользоватьРассылкуЧерезТелеграмм
| И Пользователи.узИДПользователяТелеграмм <> 0";
Запрос.УстановитьПараметр("Пользователи", Пользователи);
Возврат Запрос.Выполнить().Выбрать();
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Преобразует строку JSON в соответствие типовым сериализатором 1С
//
// Параметры:
// СтрокаJSON - Строка - строка JSON для преобразования
//
// Возвращаемое значение:
// Соответствие - результат преобразования
//
Функция СоответствиеИзСтрокиJSON(СтрокаJSON) Экспорт
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ОтветСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Возврат ОтветСоответствие;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
// Преобразует соответствие в строку JSON типовым сериализатором 1С
//
// Параметры:
// СоответствиеДанных - Соответствие - данные для преобразования
//
// Возвращаемое значение:
// Строка - результат преобразования
//
Функция СтрокаJSONИзСоответствия(СоответствиеДанных) Экспорт
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, СоответствиеДанных);
Возврат ЗаписьJSON.Закрыть();
КонецФункции

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.10">
<CommonModule uuid="090c5973-fdd3-499f-a4b7-e6199117b0f9">
<Properties>
<Name>узТелеграмБотКоманды</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>уз телеграм бот правила</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>false</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@ -0,0 +1,332 @@

// #240 Пиганов Г.В. 2020-09-08
// Обрабатывает команды в переданном сообщении
//
// Параметры:
// Текст - Строка - Текст или заголовок сообшения. Может быть изменен при обработке
// Обработано - Булево - Признак обработки команды. Имеет смысл при обработке
// команд в расширении до стандартных комманд
// ДатаУниверсальная - Дата и время - дата сообщения (UTC+0:00)
// Дата - Дата и время - Дата сообщения в текущем часовом поясе сеанса
// Пользователь - СправочникСсылка.Пользователи - Ссылка на пользователя
// ПользовательИД - Строка- ИД пользователя телеграмм
// ПользовательИмя - Строка - имя пользователя телеграмм
// ПользовательНаименование - Строка - представление пользователя телеграмм
// Номер - Строка - номер текущего сообщения в чате телеграмм
// Файлы - Массив структур - массив файлов или фото в сообщении
// * ИД - Строка - идентификатор файла в телеграмм. Для получения файла через узТелеграммБот.ПолучитьФайл()
// * Имя - Строка - имя файла с расширением. Для фото не заполнено
//
// Возвращаемое значение:
// Булево - Истина, если команда обработана
//
Процедура ОбработатьКомандыСообщения(Сообщение) Экспорт
НастройкиБота = Неопределено; // Для сохранения настроек при необходимости
Если ПроверитьСправка(Сообщение) Тогда
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Сообщение.Пользователь) Тогда
Возврат; // Неизвестный пользователь
КонецЕсли;
Если ПроверитьНовоеДело(Сообщение)
ИЛИ ПроверитьНовыйВопрос(Сообщение) Тогда
Возврат;
КонецЕсли;
// Команды связанные с указанной задачей в начале сообщения
ЗадачаСсылка = Неопределено;
Если НачинаетсяСНомераЗадачи(Сообщение, ЗадачаСсылка) Тогда
Если ПроверитьНовыйФайл(Сообщение, ЗадачаСсылка, НастройкиБота)
ИЛИ ПроверитьНовуюЗадачу(Сообщение, ЗадачаСсылка)
ИЛИ ПроверитьНовыйВопрос(Сообщение, ЗадачаСсылка)
ИЛИ ПроверитьНовыйКомментарий(Сообщение, ЗадачаСсылка) Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ПроверитьНовуюЗадачу(Сообщение);
КонецПроцедуры
// #247 Пиганов Г.В. 2020-09-10
// Возвращает доступные команды. Может быть переопределена в расширении
//
Функция ДоступныеКоманды()
ДоступныеКоманды = Новый Массив;
ДоступныеКоманды.Добавить("!ТекстОписания - новое дело");
ДоступныеКоманды.Добавить("?ТекстОписания - новый вопрос");
ДоступныеКоманды.Добавить("#ТекстОписания - новая задача");
ДоступныеКоманды.Добавить("#НомерЗадачи ТекстКомментария - новый комментарий к задаче");
ДоступныеКоманды.Добавить("#НомерЗадачи ?ТекстВопроса - новый вопрос к задаче");
ДоступныеКоманды.Добавить("#НомерЗадачи #ТекстОписания - новая подзадача к задаче");
ДоступныеКоманды.Добавить("#НомерЗадачи в заголовке файла/фото - новай файл к задаче");
Возврат ДоступныеКоманды;
КонецФункции
// #247 Пиганов Г.В. 2020-09-10
Функция ПроверитьСправка(Сообщение)
Если Сообщение.Обработано Тогда
Возврат Истина;
КонецЕсли;
Если СокрП(Сообщение.Текст) <> "/help" Тогда
Возврат Ложь;
КонецЕсли;
//Справка - "/help"
ТекстСообщения = "Доступные команды:";
Для Каждого ОписаниеКоманды Из ДоступныеКоманды() Цикл
ТекстСообщения = ТекстСообщения + Символы.ПС + ОписаниеКоманды;
КонецЦикла;
узТелеграмБот.ОтправитьСообщение(ТекстСообщения, Сообщение.Пользователь);
Сообщение.Обработано = Истина;
Возврат Истина;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
Функция ПроверитьНовоеДело(Сообщение)
Если Сообщение.Обработано Тогда
Возврат Истина;
КонецЕсли;
//НовоеДело - "!ТекстОписания"
Если СтрНачинаетсяС(Сообщение.Текст, "!") Тогда
Сообщение.Текст = СокрЛ(Сред(Сообщение.Текст, 2));
Иначе
Возврат Ложь;
КонецЕсли;
ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент();
ТекущиеДелаОбъект.Автор = Сообщение.Пользователь;
ТекущиеДелаОбъект.ТекстСодержания = СокрЛ(Сообщение.Текст);
ТекущиеДелаОбъект.Записать();
Возврат Истина;
Конецфункции
// #240 Пиганов Г.В. 2020-09-08
Функция ПроверитьНовыйВопрос(Сообщение, ЗадачаСсылка = Неопределено)
Если Сообщение.Обработано Тогда
Возврат Истина;
КонецЕсли;
//НовыйВопрос - "?ТекстВопроса"
//НовыйВопросКЗадаче - "#НомерЗадачи ?ТекстВопроса"
Если СтрНачинаетсяС(Сообщение.Текст, "?") Тогда
Сообщение.Текст = СокрЛ(Сред(Сообщение.Текст, 2));
Иначе
Возврат Ложь;
КонецЕсли;
// Новый вопрос
ВопросОбъект = Справочники.узВопросыОтветы.СоздатьЭлемент();
ВопросОбъект.Задача = ЗадачаСсылка;
ВопросОбъект.Автор = Сообщение.Пользователь;
ВопросОбъект.Вопрос = Сообщение.Текст;
ВопросОбъект.ДатаСоздания = Сообщение.Дата;
ВопросОбъект.Наименование = Сообщение.Текст;
ВопросОбъект.Записать();
Возврат Истина;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
Функция ПроверитьНовыйФайл(Сообщение, ЗадачаСсылка, НастройкиБота = Неопределено)
Если Сообщение.Обработано Тогда
Возврат Истина;
КонецЕсли;
Если Сообщение.Файлы.Количество() = 0 Тогда
Возврат Ложь;
КонецЕсли;
Если НастройкиБота = Неопределено Тогда
НастройкиБота = узТелеграмБот.НастройкиБота();
КонецЕсли;
Для Каждого ДанныеФайла Из Сообщение.Файлы Цикл
АдресФайла = узТелеграмБот.ПолучитьФайл(ДанныеФайла.ИД, НастройкиБота);
Если АдресФайла <> Неопределено Тогда
Если ПустаяСтрока(ДанныеФайла.Имя) Тогда
// Картинка добавленная как фото не имеет имени
ИмяБезРасширения = СтрЗаменить(Новый УникальныйИдентификатор(), "-", "");
Картинка = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайла));
КартинкаФормат = Картинка.Формат();
Если КартинкаФормат = ФорматКартинки.PNG Тогда
РасширениеБезТочки = "png";
ИначеЕсли КартинкаФормат = ФорматКартинки.GIF Тогда
РасширениеБезТочки = "gif";
ИначеЕсли КартинкаФормат = ФорматКартинки.JPEG Тогда
РасширениеБезТочки = "jpeg";
ИначеЕсли КартинкаФормат = ФорматКартинки.SVG Тогда
РасширениеБезТочки = "svg";
ИначеЕсли КартинкаФормат = ФорматКартинки.TIFF Тогда
РасширениеБезТочки = "tiff";
Иначе
РасширениеБезТочки = "";
КонецЕсли;
Иначе
// Файл добавленный как документ
ПозТочки = СтрНайти(ДанныеФайла.Имя, ".", НаправлениеПоиска.СКонца);
Если ПозТочки = 0 Тогда
ИмяБезРасширения = Лев(ДанныеФайла.Имя, ПозТочки - 1);
РасширениеБезТочки = Сред(ДанныеФайла.Имя, ПозТочки + 1);
Иначе
ИмяБезРасширения = ДанныеФайла.Имя;
РасширениеБезТочки = "";
КонецЕсли;
КонецЕсли;
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Сообщение.Пользователь);
ПараметрыФайла.Вставить("ВладелецФайлов", ЗадачаСсылка);
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Сообщение.ДатаУниверсальная);
ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяБезРасширения);
ПараметрыФайла.Вставить("РасширениеБезТочки", РасширениеБезТочки);
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайла);
КонецЕсли;
КонецЦикла;
Сообщение.Обработано = Истина;
Возврат Истина;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
Функция ПроверитьНовуюЗадачу(Сообщение, ЗадачаСсылка = Неопределено)
//НоваяЗадача - "#ТекстОписания"
//НоваяПодзадача - "#НомерЗадачи #ТекстОписания"
Если Сообщение.Обработано Тогда
Возврат Истина;
КонецЕсли;
Если СтрНачинаетсяС(Сообщение.Текст, "#") Тогда
Сообщение.Текст = СокрЛ(Сред(Сообщение.Текст, 2));
//ИначеЕсли СтрНачинаетсяС(Сообщение.Текст, "/#") Тогда
// ТекстСообщения = Сред(Сообщение.Текст, 3);
Иначе
Возврат Ложь;
КонецЕсли;
ЗадачаОбъект = Справочники.узЗадачи.СоздатьЭлемент();
ЗадачаОбъект.Автор = Сообщение.Пользователь;
ЗадачаОбъект.ДатаСоздания = Сообщение.Дата;
ЗадачаОбъект.ТекстСодержания = Сообщение.Текст;
ЗадачаОбъект.Наименование = Сообщение.Текст;
ЗадачаОбъект.ОформлениеТекста = Перечисления.узОформлениеТекста.Текст;
ЗадачаОбъект.Статус = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("СтатусЗадачиПоУмолчанию", Тип("СправочникСсылка.узСтатусыЗадачи"), , Ложь);
ЗадачаОбъект.Родитель = ЗадачаСсылка;
ЗадачаОбъект.Записать();
Сообщение.Обработано = Истина;
Возврат Истина;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
Функция ПроверитьНовыйКомментарий(Сообщение, ЗадачаСсылка)
Если Сообщение.Обработано Тогда
Возврат Истина;
КонецЕсли;
Если ПустаяСтрока(Сообщение.Текст) Тогда
// Пустой комментарий - был указан только номер задачи
Возврат Ложь;
КонецЕсли;
//НовыйКомментарий - #НомерЗадачи ТекстКомментария"
ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
// Ключ строки нового комментария
НовыйКлючСтроки = 1;
Если ЗадачаОбъект.Комментарии.Количество() = 0 Тогда
НовыйКлючСтроки = 1;
Иначе
ТЗ = ЗадачаОбъект.Комментарии.Выгрузить();
ТЗ.Сортировать("КлючСтроки УБЫВ");
НовыйКлючСтроки = ТЗ[0].КлючСтроки + 1;
Конецесли;
// Новый комментарий
СтрокаКомментария = ЗадачаОбъект.Комментарии.Добавить();
СтрокаКомментария.КлючСтроки = НовыйКлючСтроки;
СтрокаКомментария.ДатаКомментария = Сообщение.Дата;
СтрокаКомментария.Автор = Сообщение.Пользователь;
СтрокаКомментария.Комментарий = Сообщение.Текст;
ЗадачаОбъект.Записать();
Сообщение.Обработано = Истина;
Возврат Истина;
КонецФункции
// #240 Пиганов Г.В. 2020-09-08
Функция НачинаетсяСНомераЗадачи(Сообщение, ЗадачаСсылка)
ТекстСообщения = Сообщение.Текст;
НомерЗадачи = "";
Если Лев(ТекстСообщения, 1) = "#" Тогда
Для ПозЧисла = 2 По СтрДлина(ТекстСообщения) Цикл
КодСимволаЧисла = КодСимвола(ТекстСообщения, ПозЧисла);
Если КодСимволаЧисла < 48 ИЛИ КодСимволаЧисла > 57 Тогда // "0" - "9"
Если НЕ ПустаяСтрока(Символ(КодСимволаЧисла)) ИЛИ НомерЗадачи = "" Тогда
// Если после номера найден не пробельный символ или пробельный при
// пустом номере задачи, то сообщение начинается не с номера задачи
НомерЗадачи = "";
ИначеЕсли ПозЧисла > 1 Тогда
// Удаление из текста сообщения номера задачи
Сообщение.Текст = СокрЛ(Сред(ТекстСообщения, ПозЧисла));
КонецЕсли;
Прервать;
КонецЕсли;
НомерЗадачи = НомерЗадачи + Символ(КодСимволаЧисла);
КонецЦикла;
КонецЕсли;
Если НомерЗадачи = "" Тогда
Возврат Ложь;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| узЗадачи.Ссылка КАК Ссылка
|ИЗ
| Справочник.узЗадачи КАК узЗадачи
|ГДЕ
| узЗадачи.Код = &НомерЗадачи";
Запрос.УстановитьПараметр("НомерЗадачи", Число(НомерЗадачи));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗадачаСсылка = Выборка.Ссылка;
КонецЕсли;
Возврат Истина;
КонецФункции

View File

@ -1,186 +0,0 @@

Функция ПолучитьМассивПолучателей(МассивПользователейКому) Экспорт
МассивПолучателейТелеграмм = Новый Массив();
Для Каждого пПользователь из МассивПользователейКому Цикл
Если НЕ пПользователь.узИспользоватьРассылкуЧерезТелеграмм Тогда
Продолжить;
Конецесли;
Если НЕ ЗначениеЗаполнено(пПользователь.узИДПользователяТелеграмм) Тогда
Продолжить;
Конецесли;
НастройкаТелеграмм = Новый Структура();
НастройкаТелеграмм.Вставить("ИД",пПользователь.узИДПользователяТелеграмм);
НастройкаТелеграмм.Вставить("узИДПользователяТелеграмм",пПользователь.узИДПользователяТелеграмм);
НастройкаТелеграмм.Вставить("Пользователь",пПользователь);
МассивПолучателейТелеграмм.Добавить(НастройкаТелеграмм);
КонецЦикла;
Возврат МассивПолучателейТелеграмм;
КонецФункции
Процедура ВыполнитьРассылку(ДопПараметры) Экспорт
ТокенБота = Константы.узТелеграмм_ТокенБота.Получить();
Если Не ЗначениеЗаполнено(ТокенБота) Тогда
Возврат;
КонецЕсли;
Если НЕ ДопПараметры.Свойство("МассивПользователейКому") Тогда
Если ДопПараметры.Свойство("ПользовательКому") Тогда
МассивПользователейКому = Новый Массив();
МассивПользователейКому.Добавить(ДопПараметры.ПользовательКому);
ДопПараметры.Вставить("МассивПользователейКому",МассивПользователейКому);
Конецесли;
Конецесли;
МассивПользователейДляОтправки = ПолучитьМассивПолучателей(ДопПараметры.МассивПользователейКому);
Если МассивПользователейДляОтправки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// +++ Григорьев 12.12.2018
//ТекстПисьма = СтрЗаменить(ДопПараметры.ТекстПисьма, "#", "");
ТекстПисьма = ЗаменитьЗарезервированныеСимволы(ДопПараметры.ТекстПисьма);
// --- Григорьев 12.12.2018
ВТДопПараметры = Новый Структура();
Для каждого ЭлДопПараметры из ДопПараметры Цикл
ВТДопПараметры.Вставить(ЭлДопПараметры.Ключ, ЭлДопПараметры.Значение);
КонецЦикла;
ВТДопПараметры.Вставить("МассивПользователейДляОтправки",МассивПользователейДляОтправки);
ВТДопПараметры.Вставить("ТекстПисьма",ТекстПисьма);
ВТДопПараметры.Вставить("ТокенБота",ТокенБота);
ИспользоватьПроксиДляОтправки = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
"ТелеграммИспользоватьПроксиДляОтправки",Тип("Булево"),Ложь,Истина,Истина);
Если ИспользоватьПроксиДляОтправки Тогда
ВыполнитьРассылку_ЧерезПрокси(ВТДопПараметры);
Иначе
ВыполнитьРассылку_БезПрокси(ВТДопПараметры);
Конецесли;
КонецПроцедуры
Процедура ВыполнитьРассылку_ЧерезПрокси(ДопПараметры)
МассивПользователейДляОтправки = ДопПараметры.МассивПользователейДляОтправки;
ТекстПисьма = ДопПараметры.ТекстПисьма;
ТемаПисьма = ДопПараметры.ТемаПисьма;
пОбработка = Обработки.узРаботаСТелеграм.Создать();
пОбработка.ОтправитьСообщениеTelegram(ТекстПисьма, МассивПользователейДляОтправки);
КонецПроцедуры
Процедура ВыполнитьРассылку_БезПрокси(ДопПараметры)
МассивПользователейДляОтправки = ДопПараметры.МассивПользователейДляОтправки;
ТекстПисьма = ДопПараметры.ТекстПисьма;
ТемаПисьма = ДопПараметры.ТемаПисьма;
ТокенБота = ДопПараметры.ТокенБота;
Для Каждого элемПолучатель Из МассивПользователейДляОтправки Цикл
Ресурс = "bot" + ТокенБота + "/sendMessage?chat_id=" + Формат(элемПолучатель.ИД, "ЧГ=") + "&text=" + ТекстПисьма+"&parse_mode=Markdown&disable_web_page_preview=true";
//Ресурс = "bot" + ТокенБота + "/sendMessage?chat_id=" + Формат(элемПолучатель.ИД, "ЧГ=") + "&text=" + ТекстПисьма+"&disable_web_page_preview=true";
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,30,Новый ЗащищенноеСоединениеOpenSSL());
ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(ЗапросHTTP);
Если Не Ответ.КодСостояния = 200 Тогда
ЗаписьЖурналаРегистрации("Телеграмм.Отправка", УровеньЖурналаРегистрации.Ошибка,,
, "Не смогли отправить пользователю <"+элемПолучатель.ИД+":"+элемПолучатель.Пользователь+">");
КонецЕсли;
КонецЦикла;
КонецПроцедуры // +++ Григорьев 12.12.2018
////////////////////////////////////////////////////////////////////////////////
//
// Функция ЗаменитьЗарезервированныеСимволы
//
// Описание:
// Выполняет замену основных зарезервированных символов для протокола URL
//
// Параметры:
// ОбрабатываемаяСтрока - <Тип.Строка> - исходная строка для обработки
//
// Возвращаемое значение:
// Результат - <Тип.Строка> - обработанная строка
//
Функция ЗаменитьЗарезервированныеСимволы(ОбрабатываемаяСтрока = Неопределено) Экспорт
Если ОбрабатываемаяСтрока = Неопределено или НЕ ЗначениеЗаполнено(ОбрабатываемаяСтрока) Тогда
Возврат ОбрабатываемаяСтрока;
КонецЕсли;
пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
"ТелеграммИспользоватьЗаменуСимволовВДругуюКодировку",Тип("Булево"),,Истина,Истина);
Если пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку Тогда
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(37),"%25"); // "%"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(33),"%21"); // "!"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(34),"%22"); // """ (кавычка)
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(35),"%23"); // "#"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(36),"%24"); // "$"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(38),"%26"); // "&"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(39),"%27"); // "'"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(42),"%2A"); // "*"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(44),"%2C"); // ","
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(58),"%3A"); // ":"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(59),"%3B"); // ";"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(60),"%3C"); // "<"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(61),"%3D"); // "="
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(62),"%3E"); // ">"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(63),"%3F"); // "?"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(91),"%5B"); // "["
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(93),"%5D"); // "]"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(94),"%5E"); // "^"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(96),"%60"); // "`"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(123),"%7B"); // "{"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(124),"%7C"); // "|"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(125),"%7D"); // "}"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(32),"%20"); // " " (пробел)
Иначе
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%25",Символ(37) ); // "%"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%21",Символ(33) ); // "!"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%22",Символ(34) ); // """ (кавычка)
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%23",Символ(35) ); // "#"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%24",Символ(36) ); // "$"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%26",Символ(38) ); // "&"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%27",Символ(39) ); // "'"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2A",Символ(42) ); // "*"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2C",Символ(44) ); // ","
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3A",Символ(58) ); // ":"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3B",Символ(59) ); // ";"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3C",Символ(60) ); // "<"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3D",Символ(61) ); // "="
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3E",Символ(62) ); // ">"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3F",Символ(63) ); // "?"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5B",Символ(91) ); // "["
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5D",Символ(93) ); // "]"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5E",Символ(94) ); // "^"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%60",Символ(96) ); // "`"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7B",Символ(123)); // "{"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7C",Символ(124)); // "|"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7D",Символ(125)); // "}"
ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%20",Символ(32) ); // " " (пробел)
Конецесли;
Возврат ОбрабатываемаяСтрока;
КонецФункции //ЗаменитьЗарезервированныеСимволы // --- Григорьев 12.12.2018

View File

@ -1005,8 +1005,9 @@
<CommonModule>узОбновлениеИнформационнойБазы</CommonModule>
<CommonModule>узОбщийМодульКлиент</CommonModule>
<CommonModule>узОбщийМодульСервер</CommonModule>
<CommonModule>узТелеграммСервер</CommonModule>
<CommonModule>узРаботаСБуферомОбменаКлиент</CommonModule>
<CommonModule>узТелеграмБот</CommonModule>
<CommonModule>узТелеграмБотКоманды</CommonModule>
<ExchangePlan>ОбновлениеИнформационнойБазы</ExchangePlan>
<XDTOPackage>ApplicationExtensionsManifest_1_0_0_1</XDTOPackage>
<XDTOPackage>EnterpriseData_1_2_3</XDTOPackage>
@ -1138,6 +1139,7 @@
<ScheduledJob>узСозданиеТекущихДелПоРегламенту</ScheduledJob>
<ScheduledJob>узФормированиеФайлаЛистаЗадач</ScheduledJob>
<ScheduledJob>УстановкаПериодаРассчитанныхИтогов</ScheduledJob>
<ScheduledJob>узПолучениеИОбработкаСообщенийТелеграммБота</ScheduledJob>
<SettingsStorage>ХранилищеВариантовОтчетов</SettingsStorage>
<FunctionalOption>АктуальнаяДатаОбновленияПовторноИспользуемыхЗначенийМРО</FunctionalOption>
<FunctionalOption>ВариантыВерсионированияОбъектов</FunctionalOption>

View File

@ -1,401 +1,402 @@

Функция ПолучитьНастройкиДляРаботыСТелеграм()
пНастройкиДляРаботыСТелеграм = Новый Структура;
//ТокенТелеграмБота = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТокенТелеграмБота",
// Тип("Строка"),,Ложь);
//Если Не ЗначениеЗаполнено(ТокенТелеграмБота) Тогда
// Возврат;
//КонецЕсли;
пВсеНастройкиПолучены = Истина;
пТокенТелеграмБота = Константы.узТелеграмм_ТокенБота.Получить();
Если Не ЗначениеЗаполнено(пТокенТелеграмБота) Тогда
пВсеНастройкиПолучены = Ложь;
КонецЕсли;
// #240 Пиганов Г.В. 2020-09-08
//Функция ПолучитьНастройкиДляРаботыСТелеграм()
//
// пНастройкиДляРаботыСТелеграм = Новый Структура;
//
// //ТокенТелеграмБота = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТокенТелеграмБота",
// // Тип("Строка"),,Ложь);
// //Если Не ЗначениеЗаполнено(ТокенТелеграмБота) Тогда
// // Возврат;
// //КонецЕсли;
//
// пВсеНастройкиПолучены = Истина;
// пТокенТелеграмБота = Константы.узТелеграмм_ТокенБота.Получить();
// Если Не ЗначениеЗаполнено(пТокенТелеграмБота) Тогда
// пВсеНастройкиПолучены = Ложь;
// КонецЕсли;
пМассивНастроекПроксиСерверов = РегистрыСведений.узПроксиСерверы.ПолучитьМассивНастроекПроксиСерверов();
пМассивНастроекПроксиСерверовКоличество = пМассивНастроекПроксиСерверов.Количество();
// + #232 Ruflex @RomanUpworksTeam
//Если пМассивНастроекПроксиСерверовКоличество = 0 Тогда
// пВсеНастройкиПолучены = Ложь;
//КонецЕсли;
// - #232 Ruflex @RomanUpworksTeam
пНастройкиДляРаботыСТелеграм.Вставить("ТокенТелеграмБота", пТокенТелеграмБота);
пНастройкиДляРаботыСТелеграм.Вставить("МассивНастроекПроксиСерверов", пМассивНастроекПроксиСерверов);
пНастройкиДляРаботыСТелеграм.Вставить("НомерТекущейНастройкиПрокси", 0);
пНастройкиДляРаботыСТелеграм.Вставить("ВсеНастройкиПолучены", пВсеНастройкиПолучены);
Если пВсеНастройкиПолучены = Ложь Тогда
ЗаписьЖурналаРегистрации("Телеграмм.Настройки", УровеньЖурналаРегистрации.Ошибка,,
, "Не смогли получить настройки телеграм");
//
// пМассивНастроекПроксиСерверов = РегистрыСведений.узПроксиСерверы.ПолучитьМассивНастроекПроксиСерверов();
// пМассивНастроекПроксиСерверовКоличество = пМассивНастроекПроксиСерверов.Количество();
// // + #232 Ruflex @RomanUpworksTeam
// //Если пМассивНастроекПроксиСерверовКоличество = 0 Тогда
// // пВсеНастройкиПолучены = Ложь;
// //КонецЕсли;
// // - #232 Ruflex @RomanUpworksTeam
//
// пНастройкиДляРаботыСТелеграм.Вставить("ТокенТелеграмБота", пТокенТелеграмБота);
// пНастройкиДляРаботыСТелеграм.Вставить("МассивНастроекПроксиСерверов", пМассивНастроекПроксиСерверов);
// пНастройкиДляРаботыСТелеграм.Вставить("НомерТекущейНастройкиПрокси", 0);
// пНастройкиДляРаботыСТелеграм.Вставить("ВсеНастройкиПолучены", пВсеНастройкиПолучены);
// Если пВсеНастройкиПолучены = Ложь Тогда
// ЗаписьЖурналаРегистрации("Телеграмм.Настройки", УровеньЖурналаРегистрации.Ошибка,,
// , "Не смогли получить настройки телеграм");
КонецЕсли;
Возврат пНастройкиДляРаботыСТелеграм;
КонецФункции
// КонецЕсли;
//
// Возврат пНастройкиДляРаботыСТелеграм;
//
//КонецФункции
Процедура ПрочитатьСообщенияTelegram() Экспорт
НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм();
Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(MaxMessangeID) Тогда
ИДПоследнегоПринятогоСообщения = MaxMessangeID;
Иначе
ИДПоследнегоПринятогоСообщения = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТелеграмMaxMessangeID", Тип("Строка"),,Ложь);
КонецЕсли;
Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/getUpdates" + ?(ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения), "?offset=" + ИДПоследнегоПринятогоСообщения, "");
ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive");
Ответ = Неопределено;
ВыполнитьЗапросHTTP_Telegram(Ответ,
ЗапросHTTP,
НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов,
НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси,
Истина);
Если Ответ = Неопределено
Или Ответ.КодСостояния < 200
Или Ответ.КодСостояния >= 300 Тогда
//Процедура ПрочитатьСообщенияTelegram() Экспорт
//
// НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм();
// Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда
// Возврат;
// КонецЕсли;
//
// Если ЗначениеЗаполнено(MaxMessangeID) Тогда
// ИДПоследнегоПринятогоСообщения = MaxMessangeID;
// Иначе
// ИДПоследнегоПринятогоСообщения = Справочники.узКонстанты.ПолучитьЗначениеКонстанты("ТелеграмMaxMessangeID", Тип("Строка"),,Ложь);
// КонецЕсли;
//
//
// Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/getUpdates" + ?(ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения), "?offset=" + ИДПоследнегоПринятогоСообщения, "");
// ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
// ЗапросHTTP.Заголовки.Вставить("Content-type", "keep-alive");
//
// Ответ = Неопределено;
// ВыполнитьЗапросHTTP_Telegram(Ответ,
// ЗапросHTTP,
// НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов,
// НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси,
// Истина);
//
// Если Ответ = Неопределено
// Или Ответ.КодСостояния < 200
// Или Ответ.КодСостояния >= 300 Тогда
ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,,
, "Не смогли получить сообщения телеграм");
Возврат;
КонецЕсли;
// ЗаписьЖурналаРегистрации("Телеграм.ПолучениеСообщений", УровеньЖурналаРегистрации.Ошибка,,
// , "Не смогли получить сообщения телеграм");
// Возврат;
// КонецЕсли;
ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
HTTPОтвет = ОтветСтрокаJSON;
пЧтениеJSON = Новый ЧтениеJSON;
пЧтениеJSON.УстановитьСтроку(ОтветСтрокаJSON);
ОтветСоответсвие = ПрочитатьJSON(пЧтениеJSON, Истина);//(пЧтениеJSON, Ложь, , , "ФункцияВосстановленияJSON", ЭтотОбъект);
пЧтениеJSON.Закрыть();
Если ОтветСоответсвие["ok"] <> Истина Тогда
Возврат;
КонецЕсли;
МассивResult = ОтветСоответсвие["result"];
ИДПоследнегоПринятогоСообщения = Неопределено;
//
// ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
// HTTPОтвет = ОтветСтрокаJSON;
// пЧтениеJSON = Новый ЧтениеJSON;
// пЧтениеJSON.УстановитьСтроку(ОтветСтрокаJSON);
// ОтветСоответсвие = ПрочитатьJSON(пЧтениеJSON, Истина);//(пЧтениеJSON, Ложь, , , "ФункцияВосстановленияJSON", ЭтотОбъект);
// пЧтениеJSON.Закрыть();
//
// Если ОтветСоответсвие["ok"] <> Истина Тогда
// Возврат;
// КонецЕсли;
//
// МассивResult = ОтветСоответсвие["result"];
// ИДПоследнегоПринятогоСообщения = Неопределено;
ТЗПользователиТелеграмм = ПолучитьТЗПользователиТелеграмм();
Для Каждого СоответсвиеMessange Из МассивResult Цикл
ИДПоследнегоПринятогоСообщения = Формат(СоответсвиеMessange["update_id"] + 1, "ЧГ=");
СоответсвиеMessange_message = СоответсвиеMessange.Получить("message");
Если СоответсвиеMessange_message = Неопределено Тогда
Продолжить;
КонецЕсли;
ДатаСообщения = '19700101' + СоответсвиеMessange_message["date"] +7*60*60;
СоответсвиеFrom = СоответсвиеMessange_message["from"];
пLastName = СоответсвиеFrom["last_name"];
пFirstName = СоответсвиеFrom["first_name"];
пСhatИД = Формат(СоответсвиеMessange_message["chat"]["id"], "ЧГ=");
Если СоответсвиеMessange_message.Получить("text") <> Неопределено Тогда
MessageText = СоответсвиеMessange_message.Получить("text");
// ТЗПользователиТелеграмм = ПолучитьТЗПользователиТелеграмм();
//
// Для Каждого СоответсвиеMessange Из МассивResult Цикл
//
// ИДПоследнегоПринятогоСообщения = Формат(СоответсвиеMessange["update_id"] + 1, "ЧГ=");
// СоответсвиеMessange_message = СоответсвиеMessange.Получить("message");
// Если СоответсвиеMessange_message = Неопределено Тогда
// Продолжить;
// КонецЕсли;
// ДатаСообщения = '19700101' + СоответсвиеMessange_message["date"] +7*60*60;
// СоответсвиеFrom = СоответсвиеMessange_message["from"];
// пLastName = СоответсвиеFrom["last_name"];
// пFirstName = СоответсвиеFrom["first_name"];
// пСhatИД = Формат(СоответсвиеMessange_message["chat"]["id"], "ЧГ=");
// Если СоответсвиеMessange_message.Получить("text") <> Неопределено Тогда
// MessageText = СоответсвиеMessange_message.Получить("text");
// + Иванов А.Б. 2020-07-11
// Если Найти(MessageText, "/addwork") <> 0 Тогда
// Запрос = Новый Запрос;
// Запрос.Текст =
// "ВЫБРАТЬ ПЕРВЫЕ 1
// | Пользователи.Ссылка КАК Пользователь
// |ИЗ
// | Справочник.Пользователи КАК Пользователи
// |ГДЕ
// | Пользователи.узИДПользователяТелеграмм = &узИДПользователяТелеграмм";
//
// Запрос.УстановитьПараметр("узИДПользователяТелеграмм", Число(пСhatИД));
//
// РезультатЗапроса = Запрос.Выполнить();
// Если РезультатЗапроса.Пустой() Тогда
// Продолжить;
// КонецЕсли;
//
// Выборка = РезультатЗапроса.Выбрать();
// Пока Выборка.Следующий() Цикл
// ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент();
// ТекущиеДелаОбъект.Автор = Выборка.Пользователь;
// ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", "");
// ТекущиеДелаОбъект.Записать();
// КонецЦикла;
//
// КонецЕсли;
Если Найти(MessageText, "/addwork") = 0 Тогда
Продолжить;
КонецЕсли;
пузИДПользователяТелеграмм = Число(пСhatИД);
ПараметрыОтбора=Новый Структура();
ПараметрыОтбора.Вставить("узИДПользователяТелеграмм",пузИДПользователяТелеграмм);
НайденныеСтроки = ТЗПользователиТелеграмм.НайтиСтроки(ПараметрыОтбора);
ВсегоНайденныеСтроки = НайденныеСтроки.Количество();
ТекстОшибки = "";
Если ВсегоНайденныеСтроки = 1 тогда
СтрокаТЗПользователиТелеграмм = НайденныеСтроки[0];
ИначеЕсли ВсегоНайденныеСтроки > 1 Тогда
ТекстОшибки = "Ошибка! Найдено более 1 строки";
Иначе
ТекстОшибки = "Ошибка! Не найдена строка";
Конецесли;
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
ТекстОшибки = ТекстОшибки
+" в ""ТЗПользователиТелеграмм"" для ";
Для каждого ЭлементОтбора из ПараметрыОтбора цикл
ТекстОшибки = ТекстОшибки
+" "+ ЭлементОтбора.Ключ + " = ["+ЭлементОтбора.Значение+"]";
Конеццикла;
ВызватьИсключение ТекстОшибки;
Конецесли;
ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент();
ТекущиеДелаОбъект.Автор = СтрокаТЗПользователиТелеграмм.Пользователь;
ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", "");
ТекущиеДелаОбъект.Записать();
// - Иванов А.Б. 2020-07-11
ИначеЕсли СоответсвиеMessange_message.Получить("photo") <> Неопределено Тогда
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения) Тогда
Справочники.узКонстанты.УстановитьЗначениеКонстанты("ТелеграмMaxMessangeID", ИДПоследнегоПринятогоСообщения);
MaxMessangeID = ИДПоследнегоПринятогоСообщения;
КонецЕсли;
КонецПроцедуры
// // + Иванов А.Б. 2020-07-11
// // Если Найти(MessageText, "/addwork") <> 0 Тогда
// // Запрос = Новый Запрос;
// // Запрос.Текст =
// // "ВЫБРАТЬ ПЕРВЫЕ 1
// // | Пользователи.Ссылка КАК Пользователь
// // |ИЗ
// // | Справочник.Пользователи КАК Пользователи
// // |ГДЕ
// // | Пользователи.узИДПользователяТелеграмм = &узИДПользователяТелеграмм";
// //
// // Запрос.УстановитьПараметр("узИДПользователяТелеграмм", Число(пСhatИД));
// //
// // РезультатЗапроса = Запрос.Выполнить();
// // Если РезультатЗапроса.Пустой() Тогда
// // Продолжить;
// // КонецЕсли;
// //
// // Выборка = РезультатЗапроса.Выбрать();
// // Пока Выборка.Следующий() Цикл
// // ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент();
// // ТекущиеДелаОбъект.Автор = Выборка.Пользователь;
// // ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", "");
// // ТекущиеДелаОбъект.Записать();
// // КонецЦикла;
// //
// // КонецЕсли;
//
// Если Найти(MessageText, "/addwork") = 0 Тогда
// Продолжить;
// КонецЕсли;
//
// пузИДПользователяТелеграмм = Число(пСhatИД);
//
// ПараметрыОтбора=Новый Структура();
// ПараметрыОтбора.Вставить("узИДПользователяТелеграмм",пузИДПользователяТелеграмм);
// НайденныеСтроки = ТЗПользователиТелеграмм.НайтиСтроки(ПараметрыОтбора);
// ВсегоНайденныеСтроки = НайденныеСтроки.Количество();
// ТекстОшибки = "";
// Если ВсегоНайденныеСтроки = 1 тогда
// СтрокаТЗПользователиТелеграмм = НайденныеСтроки[0];
// ИначеЕсли ВсегоНайденныеСтроки > 1 Тогда
// ТекстОшибки = "Ошибка! Найдено более 1 строки";
// Иначе
// ТекстОшибки = "Ошибка! Не найдена строка";
// Конецесли;
//
// Если ЗначениеЗаполнено(ТекстОшибки) Тогда
// ТекстОшибки = ТекстОшибки
// +" в ""ТЗПользователиТелеграмм"" для ";
// Для каждого ЭлементОтбора из ПараметрыОтбора цикл
// ТекстОшибки = ТекстОшибки
// +" "+ ЭлементОтбора.Ключ + " = ["+ЭлементОтбора.Значение+"]";
// Конеццикла;
// ВызватьИсключение ТекстОшибки;
// Конецесли;
//
// ТекущиеДелаОбъект = Справочники.узТекущиеДела.СоздатьЭлемент();
// ТекущиеДелаОбъект.Автор = СтрокаТЗПользователиТелеграмм.Пользователь;
// ТекущиеДелаОбъект.ТекстСодержания = СтрЗаменить(MessageText, "/addwork", "");
// ТекущиеДелаОбъект.Записать();
// // - Иванов А.Б. 2020-07-11
//
//
// ИначеЕсли СоответсвиеMessange_message.Получить("photo") <> Неопределено Тогда
//
// КонецЕсли;
//
// КонецЦикла;
//
//
// Если ЗначениеЗаполнено(ИДПоследнегоПринятогоСообщения) Тогда
// Справочники.узКонстанты.УстановитьЗначениеКонстанты("ТелеграмMaxMessangeID", ИДПоследнегоПринятогоСообщения);
// MaxMessangeID = ИДПоследнегоПринятогоСообщения;
// КонецЕсли;
//
//КонецПроцедуры
Функция ПолучитьТЗПользователиТелеграмм()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(Пользователи.Ссылка) КАК Пользователь,
| Пользователи.узИДПользователяТелеграмм КАК узИДПользователяТелеграмм
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.узИДПользователяТелеграмм <> 0
|
|СГРУППИРОВАТЬ ПО
| Пользователи.узИДПользователяТелеграмм";
ТЗПользователиТелеграмм = Запрос.Выполнить().Выгрузить();
Возврат ТЗПользователиТелеграмм;
КонецФункции
//Функция ПолучитьТЗПользователиТелеграмм()
//
// Запрос = Новый Запрос;
// Запрос.Текст = "ВЫБРАТЬ
// | МАКСИМУМ(Пользователи.Ссылка) КАК Пользователь,
// | Пользователи.узИДПользователяТелеграмм КАК узИДПользователяТелеграмм
// |ИЗ
// | Справочник.Пользователи КАК Пользователи
// |ГДЕ
// | Пользователи.узИДПользователяТелеграмм <> 0
// |
// |СГРУППИРОВАТЬ ПО
// | Пользователи.узИДПользователяТелеграмм";
//
// ТЗПользователиТелеграмм = Запрос.Выполнить().Выгрузить();
//
// Возврат ТЗПользователиТелеграмм;
//
//КонецФункции
Процедура ОтправитьСообщениеTelegram(ТекстСообщения, МассивПользователейДляОтправки, УведомлятьОРезультате = Ложь) Экспорт
Если МассивПользователейДляОтправки.Количество() = 0 Тогда
// ++ 79Vlad 20.06.2019 #174 \\
Если УведомлятьОРезультате Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сообщение не отправлено, т.к. не указан получатель.";
Сообщение.Сообщить();
КонецЕсли;
// -- 79Vlad 20.06.2019 #174
Возврат;
КонецЕсли;
НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм();
Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда
// ++ 79Vlad 20.06.2019 #174 \\
Если УведомлятьОРезультате Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сообщение не отправлено, т.к. не смогли получить настройки телеграм.";
Сообщение.Сообщить();
КонецЕсли;
// -- 79Vlad 20.06.2019 #174
Возврат;
КонецЕсли;
//Процедура ОтправитьСообщениеTelegram(ТекстСообщения, МассивПользователейДляОтправки, УведомлятьОРезультате = Ложь) Экспорт
//
// Если МассивПользователейДляОтправки.Количество() = 0 Тогда
// // ++ 79Vlad 20.06.2019 #174 \\
// Если УведомлятьОРезультате Тогда
// Сообщение = Новый СообщениеПользователю;
// Сообщение.Текст = "Сообщение не отправлено, т.к. не указан получатель.";
// Сообщение.Сообщить();
// КонецЕсли;
// // -- 79Vlad 20.06.2019 #174
// Возврат;
// КонецЕсли;
//
// НастройкиДляРаботыСТелеграм = ПолучитьНастройкиДляРаботыСТелеграм();
// Если НастройкиДляРаботыСТелеграм.ВсеНастройкиПолучены = Ложь Тогда
// // ++ 79Vlad 20.06.2019 #174 \\
// Если УведомлятьОРезультате Тогда
// Сообщение = Новый СообщениеПользователю;
// Сообщение.Текст = "Сообщение не отправлено, т.к. не смогли получить настройки телеграм.";
// Сообщение.Сообщить();
// КонецЕсли;
// // -- 79Vlad 20.06.2019 #174
// Возврат;
// КонецЕсли;
Для Каждого Пользователь Из МассивПользователейДляОтправки Цикл
ИДПользователяТелеграм = Пользователь.узИДПользователяТелеграмм;
Если Не ЗначениеЗаполнено(ИДПользователяТелеграм) Тогда
Продолжить;
КонецЕсли;
//ТекстСообщения = СтрЗаменить(ТекстСообщения, "#", "");
СообщениеОтправлено = Ложь;
// Для Каждого Пользователь Из МассивПользователейДляОтправки Цикл
//
// ИДПользователяТелеграм = Пользователь.узИДПользователяТелеграмм;
//
// Если Не ЗначениеЗаполнено(ИДПользователяТелеграм) Тогда
// Продолжить;
// КонецЕсли;
//
// //ТекстСообщения = СтрЗаменить(ТекстСообщения, "#", "");
// СообщениеОтправлено = Ложь;
// Данные =
// "{
//|""chat_id"":"""+Формат(Выборка.ИДПользователяТелеграмм, "ЧГ=")+""",
//|""text"":""Текст"",
//|""reply_markup"": {
//| ""inline_keyboard"": [
//| [{
//| ""text"": ""ОбъектСогласования"",
//| ""url"":""http://192.168.13.130/BPS/ru_RU/#e1cib/data/Справочник.бпсПредметыСогласований?ref=838318dbf213445c11e8e41681645d42""
//| }]
//|]
//|}
//|} ";
// // Данные =
// // "{
// //|""chat_id"":"""+Формат(Выборка.ИДПользователяТелеграмм, "ЧГ=")+""",
// //|""text"":""Текст"",
// //|""reply_markup"": {
// //| ""inline_keyboard"": [
// //| [{
// //| ""text"": ""ОбъектСогласования"",
// //| ""url"":""http://192.168.13.130/BPS/ru_RU/#e1cib/data/Справочник.бпсПредметыСогласований?ref=838318dbf213445c11e8e41681645d42""
// //| }]
// //|]
// //|}
// //|} ";
Структура = Новый Соответствие;
Структура.Вставить("chat_id",Формат(ИДПользователяТелеграм, "ЧГ="));
Структура.Вставить("text", ТекстСообщения);
// ++ 79Vlad 20.06.2019 #174 \\
Структура.Вставить("parse_mode","Markdown");
Структура.Вставить("disable_web_page_preview","true");
// -- 79Vlad 20.06.2019 #174
Массив_reply_markup = Новый Массив;
//Пример создания конпки в телеграм
//Если ЗначениеЗаполнено(Выборка.ОбъектБД)
// И ЗначениеЗаполнено(АдресПубликации) Тогда
//
// Структура_inline_keyboard = Новый Структура;
// Структура_inline_keyboard.Вставить("text", Строка(Выборка.ОбъектБД));
// Структура_inline_keyboard.Вставить("url", АдресПубликации + "#" + ПолучитьНавигационнуюСсылку(Выборка.ОбъектБД));
//
// Массив_reply_markup.Добавить(Структура_inline_keyboard);
//КонецЕсли;
//Массив_inline_keyboard = Новый Массив;
//Массив_inline_keyboard.Добавить(Массив_reply_markup);
//
//Структура_reply_markup = Новый Структура;
//Структура_reply_markup.Вставить("inline_keyboard",Массив_inline_keyboard);
//
//Структура.Вставить("reply_markup", Структура_reply_markup);
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, Структура);
Данные = ЗаписьJSON.Закрыть();
Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/sendMessage";
ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json");
ЗапросHTTP.УстановитьТелоИзСтроки(Данные);
// Структура = Новый Соответствие;
// Структура.Вставить("chat_id",Формат(ИДПользователяТелеграм, "ЧГ="));
// Структура.Вставить("text", ТекстСообщения);
//
// // ++ 79Vlad 20.06.2019 #174 \\
// Структура.Вставить("parse_mode","Markdown");
// Структура.Вставить("disable_web_page_preview","true");
// // -- 79Vlad 20.06.2019 #174
//
// Массив_reply_markup = Новый Массив;
//
// //Пример создания конпки в телеграм
// //Если ЗначениеЗаполнено(Выборка.ОбъектБД)
// // И ЗначениеЗаполнено(АдресПубликации) Тогда
// //
// // Структура_inline_keyboard = Новый Структура;
// // Структура_inline_keyboard.Вставить("text", Строка(Выборка.ОбъектБД));
// // Структура_inline_keyboard.Вставить("url", АдресПубликации + "#" + ПолучитьНавигационнуюСсылку(Выборка.ОбъектБД));
// //
// // Массив_reply_markup.Добавить(Структура_inline_keyboard);
// //КонецЕсли;
// //Массив_inline_keyboard = Новый Массив;
// //Массив_inline_keyboard.Добавить(Массив_reply_markup);
// //
// //Структура_reply_markup = Новый Структура;
// //Структура_reply_markup.Вставить("inline_keyboard",Массив_inline_keyboard);
// //
// //Структура.Вставить("reply_markup", Структура_reply_markup);
//
// ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON;
// ЗаписьJSON = Новый ЗаписьJSON;
// ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
// ЗаписатьJSON(ЗаписьJSON, Структура);
// Данные = ЗаписьJSON.Закрыть();
//
// Ресурс = "bot" + НастройкиДляРаботыСТелеграм.ТокенТелеграмБота + "/sendMessage";
// ЗапросHTTP = Новый HTTPЗапрос(Ресурс);
// ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json");
// ЗапросHTTP.УстановитьТелоИзСтроки(Данные);
Ответ = Неопределено;
ВыполнитьЗапросHTTP_Telegram(Ответ,
ЗапросHTTP,
НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов,
НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси);
Если Ответ = Неопределено
Или Ответ.КодСостояния < 200
Или Ответ.КодСостояния >= 300 Тогда
ЗаписьЖурналаРегистрации("Телеграм.ОтправкаСообщений", УровеньЖурналаРегистрации.Ошибка,,
, "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]");
Иначе
СообщениеОтправлено = Истина;
КонецЕсли;
// ++ 79Vlad 20.06.2019 #174 \\
Если УведомлятьОРезультате Тогда
ТекстУведомления = "Сообщение удачно отправлено" ;
Если НЕ СообщениеОтправлено Тогда
ТекстУведомления = "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]. Подробнее смотрите в журнале регистрации."
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстУведомления;
Сообщение.Сообщить();
КонецЕсли;
// -- 79Vlad 20.06.2019 #174
КонецЦикла;
// Ответ = Неопределено;
// ВыполнитьЗапросHTTP_Telegram(Ответ,
// ЗапросHTTP,
// НастройкиДляРаботыСТелеграм.МассивНастроекПроксиСерверов,
// НастройкиДляРаботыСТелеграм.НомерТекущейНастройкиПрокси);
// Если Ответ = Неопределено
// Или Ответ.КодСостояния < 200
// Или Ответ.КодСостояния >= 300 Тогда
//
// ЗаписьЖурналаРегистрации("Телеграм.ОтправкаСообщений", УровеньЖурналаРегистрации.Ошибка,,
// , "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]");
// Иначе
// СообщениеОтправлено = Истина;
// КонецЕсли;
//
// // ++ 79Vlad 20.06.2019 #174 \\
// Если УведомлятьОРезультате Тогда
// ТекстУведомления = "Сообщение удачно отправлено" ;
// Если НЕ СообщениеОтправлено Тогда
// ТекстУведомления = "Не смогли отправить сообщение телеграм пользователю [" + Пользователь.узИДПользователяТелеграмм+"]. Подробнее смотрите в журнале регистрации."
// КонецЕсли;
// Сообщение = Новый СообщениеПользователю;
// Сообщение.Текст = ТекстУведомления;
// Сообщение.Сообщить();
// КонецЕсли;
// // -- 79Vlad 20.06.2019 #174
//
// КонецЦикла;
КонецПроцедуры
//КонецПроцедуры
Процедура ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON = Ложь)
Ответ = Неопределено;
// + #232 Ruflex @RomanUpworksTeam
///+Ruflex
///-Ruflex
//Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) ) Тогда
// Возврат;
//КонецЕсли;
Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда
Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) Тогда
Возврат;
КонецЕсли;
НастройкиПрокси = МассивНастроекПроксиСерверов[НомерТекущейНастройкиПрокси];
ИнтернетПрокси = Новый ИнтернетПрокси(Ложь);
ИнтернетПрокси.Установить("https",НастройкиПрокси.Адрес,НастройкиПрокси.Порт,НастройкиПрокси.Логин,НастройкиПрокси.Пароль,Ложь);
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,ИнтернетПрокси,30,Новый ЗащищенноеСоединениеOpenSSL());
Иначе
Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,30,Новый ЗащищенноеСоединениеOpenSSL());
КонецЕсли;
// + #232 Ruflex @RomanUpworksTeam
//Процедура ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON = Ложь)
//
// Ответ = Неопределено;
//
// // + #232 Ruflex @RomanUpworksTeam
// ///+Ruflex
// ///-Ruflex
// //Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) ) Тогда
// // Возврат;
// //КонецЕсли;
//
// Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда
//
// Если (НомерТекущейНастройкиПрокси >= МассивНастроекПроксиСерверов.Количество()) Тогда
// Возврат;
// КонецЕсли;
//
// НастройкиПрокси = МассивНастроекПроксиСерверов[НомерТекущейНастройкиПрокси];
// ИнтернетПрокси = Новый ИнтернетПрокси(Ложь);
// ИнтернетПрокси.Установить("https",НастройкиПрокси.Адрес,НастройкиПрокси.Порт,НастройкиПрокси.Логин,НастройкиПрокси.Пароль,Ложь);
// Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,ИнтернетПрокси,30,Новый ЗащищенноеСоединениеOpenSSL());
//
// Иначе
//
// Соединение = Новый HTTPСоединение("api.telegram.org", 443,,,,30,Новый ЗащищенноеСоединениеOpenSSL());
//
// КонецЕсли;
// // + #232 Ruflex @RomanUpworksTeam
Попытка
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния >= 300 Тогда
НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
Ответ = Неопределено;
ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
Возврат;
КонецЕсли;
ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
// Попытка
//
// Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
// Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния >= 300 Тогда
// НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
// Ответ = Неопределено;
// ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
// Возврат;
// КонецЕсли;
//
// ОтветСтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
Если ВОтветОжидаемJSON
И СтрНайти(НРег(ОтветСтрокаJSON), "<html>") <> 0 Тогда //прокси может уже не работать, или внесен в гос реестр
НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
Ответ = Неопределено;
ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
Возврат;
Иначе
// Если ВОтветОжидаемJSON
// И СтрНайти(НРег(ОтветСтрокаJSON), "<html>") <> 0 Тогда //прокси может уже не работать, или внесен в гос реестр
//
// НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
// Ответ = Неопределено;
// ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
// Возврат;
//
// Иначе
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, 1);
Возврат;
КонецЕсли;
Исключение
// + #232 Ruflex @RomanUpworksTeam
//НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
//РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
//ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда
// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, 1);
// Возврат;
//
// КонецЕсли;
//
// Исключение
//
// // + #232 Ruflex @RomanUpworksTeam
// //НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
// //РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
// //ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
//
// Если (МассивНастроекПроксиСерверов.Количество()>0) Тогда
НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
Конецесли;
// - #232 Ruflex @RomanUpworksTeam
КонецПопытки
КонецПроцедуры
// НомерТекущейНастройкиПрокси = НомерТекущейНастройкиПрокси + 1;
// РегистрыСведений.узПроксиСерверы.ИзменитьОценкуРаботоспособностиПроксиСервера(НастройкиПрокси.Адрес, НастройкиПрокси.Порт, -1);
// ВыполнитьЗапросHTTP_Telegram(Ответ, ЗапросHTTP, МассивНастроекПроксиСерверов, НомерТекущейНастройкиПрокси, ВОтветОжидаемJSON);
//
// Конецесли;
// // - #232 Ruflex @RomanUpworksTeam
// КонецПопытки
//
//КонецПроцедуры

View File

@ -2,18 +2,21 @@
&НаСервере
Процедура ОтправитьСообщениеНаСервере()
//+ #240 Пиганов Г.В. 2020-09-08
//+ #174 Кравцов А.В. 2019-06-06
//МассивПользователейДляОтправки = Новый Массив;
//МассивПользователейДляОтправки.Добавить(ЭтотОбъект.ПользовательДляОтправки);
МассивПользователейКому = Новый Массив;
МассивПользователейКому.Добавить(ЭтотОбъект.ПользовательДляОтправки);
МассивПользователейДляОтправки = узТелеграммСервер.ПолучитьМассивПолучателей(МассивПользователейКому);
//МассивПользователейКому = Новый Массив;
//МассивПользователейКому.Добавить(ЭтотОбъект.ПользовательДляОтправки);
//МассивПользователейДляОтправки = узТелеграммСервер.ПолучитьМассивПолучателей(МассивПользователейКому);
//- #174 Кравцов А.В. 2019-06-06
пОбъект = РеквизитФормыВЗначение("Объект");
//пОбъект = РеквизитФормыВЗначение("Объект");
// ++ 79Vlad 20.06.2019 #174 \\
//пОбъект.ОтправитьСообщениеTelegram(ЭтотОбъект.ТескстСообщенияДляОтправки, МассивПользователейДляОтправки);
пОбъект.ОтправитьСообщениеTelegram(ЭтотОбъект.ТескстСообщенияДляОтправки, МассивПользователейДляОтправки,Истина);
//пОбъект.ОтправитьСообщениеTelegram(ЭтотОбъект.ТескстСообщенияДляОтправки, МассивПользователейДляОтправки,Истина);
// -- 79Vlad 20.06.2019 #174
узТелеграмБот.ОтправитьСообщение(ЭтотОбъект.ТескстСообщенияДляОтправки, ЭтотОбъект.ПользовательДляОтправки, Истина);
//- #240 Пиганов Г.В. 2020-09-08
КонецПроцедуры
@ -25,9 +28,17 @@
&НаСервере
Процедура ПрочитатьСообщенияНаСервере()
пОбъект = РеквизитФормыВЗначение("Объект");
пОбъект.ПрочитатьСообщенияTelegram();
ЗначениеВРеквизитФормы(пОбъект, "Объект");
//+ #240 Пиганов Г.В. 2020-09-08
//пОбъект = РеквизитФормыВЗначение("Объект");
//пОбъект.ПрочитатьСообщенияTelegram();
//ЗначениеВРеквизитФормы(пОбъект, "Объект");
Ответ = Неопределено;
НовыеСообщения = узТелеграмБот.ПолучитьНовыеСообщения(Объект.MaxMessangeID, Ответ);
Объект.HTTPОтвет = Ответ.ПолучитьТелоКакСтроку();
Для Каждого Сообщение Из НовыеСообщения Цикл
узТелеграмБотКоманды.ОбработатьКомандыСообщения(Сообщение);
КонецЦикла;
//- #240 Пиганов Г.В. 2020-09-08
КонецПроцедуры

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.10">
<ScheduledJob uuid="a74b8747-cfb3-453f-95d3-5a670b55554d">
<Properties>
<Name>узПолучениеИОбработкаСообщенийТелеграммБота</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Обработка сообщений телеграмм бота</v8:content>
</v8:item>
</Synonym>
<Comment/>
<MethodName>CommonModule.узТелеграмБот.РегламентноеПолучениеИОбработкаСообщений</MethodName>
<Description/>
<Key/>
<Use>false</Use>
<Predefined>true</Predefined>
<RestartCountOnFailure>3</RestartCountOnFailure>
<RestartIntervalOnFailure>10</RestartIntervalOnFailure>
</Properties>
</ScheduledJob>
</MetaDataObject>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<JobSchedule xmlns="http://v8.1c.ru/8.3/xcf/extrnprops" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.10">
<Schedule BeginDate="0001-01-01" EndDate="0001-01-01" BeginTime="00:00:00" EndTime="00:00:00" CompletionTime="00:00:00" CompletionInterval="0" RepeatPeriodInDay="900" RepeatPause="0" WeekDayInMonth="0" DayInMonth="0" WeeksPeriod="1" DaysRepeatPeriod="1">
<ent:WeekDays>1 2 3 4 5 6 7</ent:WeekDays>
<ent:Months>1 2 3 4 5 6 7 8 9 10 11 12</ent:Months>
</Schedule>
</JobSchedule>

View File

@ -16,7 +16,7 @@
<Picture/>
<Content>
<xr:Item xsi:type="xr:MDObjectRef">Constant.узТелеграмм_ТокенБота</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.узТелеграммСервер</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">8f79d0f2-3bdc-43f6-ae0d-3393a1b1c89a</xr:Item>
</Content>
</Properties>
<ChildObjects/>