Согласование задач из Outlook

Публикация № 1118471

Разработка - Системная интеграция - Внешние источники данных

47
Согласование задач непосредственно из почтовой программы, в моем случае Outlook 2013 без каких-либо дополнительных настроек. Из почты отправляется GET запрос к HTTP-сервису 1С, который в свою очередь выполняет задачу.

Есть у меня такая недобрая система, но с таким добрым названием АИСТ - Автоматизированная информационная система табелирования. Одной из функций которой является, согласования времени отсутствия на рабочем месте с руководителем. Изначально руководителю приходило письмо в формате HTML с краткой информацией и ссылкой на задачу, но т.к. ссылка открывается из почты в браузере, а браузер с 1С бывает жутко тормозит, особенно если в нем уже открыто 100500 страничек, нужно было как то это порешать, так и возникла идея не открывать 1С.

Кратко опишу реализацию:

  1. В письмо были добавлены ссылки - типа кнопки. 
Процедура ДобавитьКнопкиСогласования(ТекстСообщения, Источник) Экспорт
	
	СсылкаСКУД = СформироватьСсылкаСКУД("HTTP");
	
	ИДЗадачи = XMLСтрока(Источник);
		
	ПараметрыЗапроса = "?method=AcceptTask&ID=" +ИДЗадачи;
		
	СсылкаСогласовать =  СсылкаСКУД + ПараметрыЗапроса + "&Accept=true";    
	СсылкаОтклонить   =  СсылкаСКУД + ПараметрыЗапроса + "&Accept=false";   
	
	ТекстСообщения = ТекстСообщения +"
	|<p>
    |<a href=""" + СсылкаСогласовать + """ style=""width:150px;white-space:normal;word-break:break-all;background:#4da211;text-shadow: 0 -1px 0 #4da211;border-color:#4da211;margin-bottom:5px;margin-right:5px;font-size:14px;font-family:Arial,Helvetica,sans-serif;line-height:20px;color:#ffffff;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;border: 8px solid #4da211;text-decoration:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-weight:bold;text-align:center;"">СОГЛАСОВАТЬ</a>
	|<a href=""" + СсылкаОтклонить +   """ style=""width:150px;white-space:normal;word-break:break-all;background:#fd5e53;text-shadow: 0 -1px 0 #fd5e53;border-color:#fd5e53;margin-bottom:5px;margin-right:5px;font-size:14px;font-family:Arial,Helvetica,sans-serif;line-height:20px;color:#ffffff;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;border: 8px solid #fd5e53;text-decoration:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-weight:bold;text-align:center;"">ОТКЛОНИТЬ</a>
	|</p>
	|";

КонецПроцедуры	
  1. За основу HTTP-сервиса взял Шаблон http-сервиса для вашего проекта. Добавил в HTTP-сервис метод GET. Обработчик метода пришлось переделать, постарался сохранить универсальность, чтобы можно было передавать произвольные параметры.
    Функция ОбработатьЗапросGet(Запрос)
    	
    	ОбработкиМенеджер = Обработки.Обработчик_HTTP_Запросов;
    	СтруктураЗапроса    = Новый Структура;
    	
    	//Для Каждого ТекПараметр Из Запрос.ПараметрыURL Цикл	
    	//КонецЦикла;
    	
    	Для Каждого ТекПараметр Из Запрос.ПараметрыЗапроса Цикл	
    		
    		Если ТекПараметр.Ключ = "method" Тогда
    			СтруктураЗапроса.Вставить(ТекПараметр.Ключ,ТекПараметр.Значение);
    		КонецЕсли;	
    							
    	КонецЦикла;
    	
    	СтруктураЗапроса.Вставить("params",Запрос.ПараметрыЗапроса);	
    
    	ТелоЗапросаСтрокой = HTTPServ_ОбщийМодуль.ПолучитьЗапросJSON(СтруктураЗапроса);
    	
    	РезультатОбработки = ОбработкиМенеджер.ОбработатьЗапрос(ТелоЗапросаСтрокой);
    	
    	Заголовки = РезультатОбработки.Заголовки;
    	ТекстОтвета = РезультатОбработки.ТекстОтвета;
    	Статус = РезультатОбработки.Статус;
    	
    	Ответ =	Новый HTTPСервисОтвет(Статус,, Заголовки);
    	
    	Если ТипЗнч(ТекстОтвета) = Тип("Строка") Тогда
    		Ответ.УстановитьТелоИзСтроки(ТекстОтвета);
    	ИначеЕсли ТипЗнч(ТекстОтвета) = Тип("ДвоичныеДанные") Тогда
    		Ответ.УстановитьТелоИзДвоичныхДанных(ТекстОтвета);
    	КонецЕсли;
    	
    	Возврат Ответ;
    	
    КонецФункции
    

    Пример запроса https://iis.mydomen.int/hrm_copy_hs/hs/cit/?method=AcceptTask;ID=b4232fed-cf1f-11e9-bb46-0cc47a283ff1;Accept=false

        Параметры идут после ? и должны соответствовать формату method=[ИмяМетода];[ИмяПараметра1]=[Значение1];[ИмяПараметраN]=[ЗначениеN]

        method=[ИмяМетода] - ОБЯЗАТЕЛЬНЫЙ ПАРАМЕТР

  1. Обработчик сервиса, обрабатывает параметры, находит задачу, выполняет и возвращает результат. За вызов функции и передачу параметров отвечает Шаблон http-сервиса для вашего проекта.
Функция AcceptTask(Параметры)
	
	ОбязательныеПараметры = Новый Массив;
	ОбязательныеПараметры.Добавить("ID");
	ОбязательныеПараметры.Добавить("Accept");
	ПроверитьПараметры(Параметры, ОбязательныеПараметры);
	
	МассивЗадач = Новый Массив;
	Если ТипЗнч(Параметры.ID) = Тип("Массив") Тогда 
		Для Каждого ИДЗадача Из Параметры.ID Цикл
			Задача = Задачи.ЗадачаИсполнителя.ПолучитьСсылку(Новый УникальныйИдентификатор(ИДЗадача));
			МассивЗадач.Добавить(Задача);
		КонецЦикла;
	ИначеЕсли ТипЗнч(Параметры.ID) = Тип("Строка") Тогда
		Задача = Задачи.ЗадачаИсполнителя.ПолучитьСсылку(Новый УникальныйИдентификатор(Параметры.ID));
		МассивЗадач.Добавить(Задача);
	КонецЕсли;
	
	СтрЗадачи      = "";
	Абзац = "";
	Для Каждого Задача Из МассивЗадач Цикл
		
		ЗадачаОбъект =  Задача.ПолучитьОбъект();
		Если ЗадачаОбъект = Неопределено Тогда
			ТекстИсключения = "Задач согласования не найдена.";
			ВызватьИсключение ТекстИсключения; 
		КонецЕсли;
		
		ЗадачаОбъект.Выполнена  = ИСТИНА;
		ЗадачаОбъект.Решение    = ?(Параметры.Accept = "true",ИСТИНА, ЛОЖЬ);
		ЗадачаОбъект.Записать();
		
		СтрЗадачи = СтрЗадачи + Абзац + Задача; 
		Абзац = "<p>";		
		
	КонецЦикла;	
	
	
	ТекстРезультат = "";
	РешениеHTML = ?(Параметры.Accept = "true",
	                 "<font color=""#008000"" size=""5""><strong><u></u>СОГЛАСОВАНО</strong></font>", 
	                 "<font color=""#ff0000"" size=""5""><strong><u></u>ОТКЛОНЕНО</strong></font>");

	
	ТекстРезультат = " 
		|<html><head>
		|<meta charset=""utf-8"">
		|<title>АИСТ</title>
		|<style>
		|  .okno {
		|    width: 400px;
		|    height: 90px;
		|    text-align: center;
		|    padding: 15px;
		|    border: 3px solid #0000cc;
		|    border-radius: 10px;
		|    color: #0000cc;
		|  }
		| </style>
		| </head>
		|  <body>
		|   <table>
		|     <tbody>
		|      <tr>
		|         <td><p align=""center""><font color=""#676767"">Автоматизированная Информационная Система Табелирования</font></p></td>
		|      </tr>
		|      <tr>
		|         <td><div class=""okno""><p align=""center"">" +СтрЗадачи+ "</p></div></td> 
		|      </tr>  
		|      <tr>
		|         <td><p align=""center""><font color=""#ff0000"" size=""5""><strong><u></u>" +РешениеHTML+ "</strong></font></p></td>
		|      </tr>
		|     </tbody>
		|    </table>
		|  </body></html>";

	
	Возврат ТекстРезультат;
	
КонецФункции

 

Немного про публикацию на Вэб-сервере. У меня база была опубликована на сервере, и сначала я просто добавил в публикацию вэб-сервисы расширения (сервис у меня в рвсширении).  Но тут начались проблемы, связанные с авторизацией, сервис не работает для пользователей с отключенной доменной авторизацией и пользователи  у которых браузер по умолчанию Mozilla. Копать в этом направлении не стал, а создал вторую публикацию для HTTP-сервиса и настроил авторизацию в настройках сайта на Вэб-сервере. Это отдельная тема, в моем случае это IIS и я подправил файл default.vrd, в строку добавил текст

ib="Srvr=&quot;db4&quot;;Ref=&quot;skud&quot;;Usr=&quot;AcceptTask&quot;;Pwd=&quot;AcceptTask&quot;;"

Разработано на версии платформы 1С:Предприятие 8.3 (8.3.13.1809) на других почтовых программах не тестировалось, но повторюсь, я не вносил никаких изменений в Outlook, более того наделен правами обычного пользователя.  

В загрузках практически Шаблон http-сервиса для вашего проекта в виде расширения конфигурации. обработка сервиса в составе расширения, добавлена обработка GET - запросов

47

Скачать файлы

Наименование Файл Версия Размер
Согласование задач в Outlook
.cfe 19,47Kb
05.09.19
5
.cfe 19,47Kb 5 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. pavlov_dv 06.09.19 05:22 Сейчас в теме
Спасибо, отличная идея!
Положил в свой бэклог для реализации.
2. EliasShy 48 06.09.19 08:08 Сейчас в теме
Тоже с подобным сталкивались, пришлось отказаться, т.к. не тривиальная проверка по безопасности получается с проверкой ссылки - нужно вводить токены, лимиты времению
Silenser; +1 Ответить
3. blackhole321 1036 06.09.19 08:26 Сейчас в теме
(2)В случае использования AD и соответствующей настройки проверки подлинности все намного упрощается
4. EliasShy 48 06.09.19 10:01 Сейчас в теме
(3)
на словах это так, но на практике как "соответствующая" проверка подлинности выглядит?

Начиная с того, что апач не умеет AD пробрасывать - ограничиваемся IIS
Как решите проблему с "устаревшими" согласованиями?
5. blackhole321 1036 06.09.19 10:17 Сейчас в теме
(4)
на словах это так, но на практике как "соответствующая" проверка подлинности выглядит?

Windows-проверка подлинности в настройках IIS и информационной базы

Начиная с того, что апач не умеет AD пробрасывать - ограничиваемся IIS

Ну и в чем Вы видите проблему? Вроде как логично использовать "родные" средства.

Как решите проблему с "устаревшими" согласованиями?

Ну в запросе же передается id задачи, анализируйте на актуальность.
6. arsvlg 06.09.19 14:08 Сейчас в теме
Как идея - интересно.

Маленькая поправка:
По тексту публикации написано "но т.к. ссылка открывается из почты в браузере " - не обязательно в браузере.
Можно реализовать, чтобы по клике на ссылку из Outlook открывалась форма задачи, которую необходимо выполнить, в тонком клиенте.
8. duhh 185 06.09.19 14:38 Сейчас в теме
(6)Есть способ открывать ссылки в тонком клиенте (способ с настройками реестра видел)? Поделитесь, мне бы было очень интересно.
7. torch 45 06.09.19 14:19 Сейчас в теме
По-моему все это лучше организовывать через Telegramm:
- как через почтовик организовать документооборот, когда задачу утвердить/отклонить могут несколько человек?
- что делать, если у процесса согласованию должны быть "супервайзеры" - пользователи, которые сами ничего не утверждают, но следят за процессом?
9. duhh 185 06.09.19 14:43 Сейчас в теме
(7)Видимо мне должно быть стыдно, но я не пользуюсь телеграмом, вероятно лучше.
maxopik2; +1 Ответить
10. duhh 185 06.09.19 21:55 Сейчас в теме
(7)В контексте моего примера для нескольких согласующих можно в ссылку добавить адрес почты или(и) ИД пользователя (физлица). Шаблон легко с этим справится и передаст в обработчик сервиса эти параметры.
11. dock 35 10.09.19 09:04 Сейчас в теме
Хороший пример, одобряем.
Но бросим камушек в огород: в 1С Документооборот есть типовой функцинал: выполнение задач по почте. Где настраивается - смотрим вложение первую картинку.

Немного отличается подход/реализация.

1) На почту приходит письмо, внутри ссылки (здесь всё как и в статье)

2) При нажатии на ссылку, формируется письмо ответа, которое отправляется обратно в ДО. Смотрим вторую картинку
обратите внимание именно на тему письма - в ней и содержится ссылка на выполняемую задачу и результат "согласования"

3) профит - задача выполнена.

В чем "бонус" данного подхода ? как раз решается вопрос безопасности :)
Прикрепленные файлы:
12. duhh 185 10.09.19 09:48 Сейчас в теме
(11) В общих чертах )мне был известен подход в документообороте, но за картинки спасибо. А что за вопрос безопасности? В обоих случаях нажатие ссылки, с передачей Идентификатора задачи только разными способами. Видимо если бы у меня был документооборот, и статьи бы не было.
13. dock 35 11.09.19 09:57 Сейчас в теме
(12)
Опубликованный web-сервис - это прямой доступ к базе.

1) проверка подлинности при подключении к web-сервису весьма не тривиальная задача: судя по комментариям, с этим многие столкнулись.
2) работа с "внешними" пользователями: требуется публикация база в интернете, если вдруг пользователю захочется согласовать документ "из любого места".

Web-сервисы классная штука, но имеет и свои недостатки.
14. duhh 185 11.09.19 10:19 Сейчас в теме
(13) А чем опасен HTTP-сервис (база не опубликована), который может делать только согласование задач? То же самое можно сказать и про почтовое сообщение, отправленное на определенный адрес с определенным содержанием. Вероятно документооборот проверяет и отправителя, но его тоже вроде можно подменить.
15. dock 35 11.09.19 11:46 Сейчас в теме
(14) В саму первую очередь - "криворукостью" программиста. Любим мы замудрить что-нибудь эдакое, универсальное, удобное...
например:
Пара универсальных веб-функций для получения данных из 1С

В письме то будет содержаться ссылка на веб сервис, а вот уже по этой ссылке можно получить дополнительную информацию: ведь может быть опубликован не только один сервис...

Во вторую очередь, ошибками самой платформы: "дыры" есть везде, просто мы их еще не обнаружили.
Но говорить о безопасности самого протокола HTTP я не готов - всё-таки я не вебер и не сетевик, а 1С-ник.

В подходе из ДО: в письме есть только внутренний идентификатор задачи - меньше информации, выше безопасность.
И этот подход проще "продвинуть" через свой отдел безопасности: публикация требует дополнительных "действий", а почта в 99% случаев уже есть.

З.Ы. Про безопасность есть замечательное утверждение:
Всегда есть два человека: один имеет доступ к данным, а второй хочет получить эти данные. Остается только ратовать, что бы эти два человека не познакомились и не договорились.
16. duhh 185 11.09.19 13:23 Сейчас в теме
(15)Предлагаю вопрос про безопасность закрыть, пусть его обсуждают специалисты в темах про безопасность HTTP протокола и дырах платформы. На мой взгляд документооборот (обмен почтовыми сообщениями) хорош тем, что там можно передать текст или вложить файл.

Поговорим лучше про "криворукость". Я в разработке придерживаюсь универсальности, придумываю что нибудь эдакое и удобное. Ничего не вижу "криворукого" в приведенном вами примере, хороший подход в определенных условиях. Так можно и разработчиков БСП назвать "криворукими", зачем они разрабатывают универсальные вещи. Вероятно я преувеличиваю, но для себе считаю некорректным приводить в пример "криворукость" других авторов.
17. dock 35 11.09.19 15:43 Сейчас в теме
(16)
1) По безопасности - полностью согласен.

2) "криворукость" - специально взял в кавычки, потому что каждый отдельный случай нужно рассматривать применительно к задаче. Применительно к одной задаче - это красивое и правильное решение, а применительно к другой - баг. :)

Но хотелось бы пояснить по приведенному примеру: универсальный веб-сервис, который выполняет запрос из полученного параметра - это всё-таки хорошая такая "дыра". И такой веб-сервис публиковать "наружу" уж точно не стоит.
Хотя именно такой веб-сервис, обросший целым модулем по формированию входящих параметров и возвращаемому результату, используется на текущей работе. Много времени экономит :)

3.Ы. В публикации предложен один подход, в ДО используется немного другой. Оба подхода работоспособны, имеют свои преимущества и недостаки. И какой использовать - уже решать конечному исполнителю.

За публикацию плюс однозначный!
Оставьте свое сообщение