Документооборот: Перепоручить задачу из почты

Опубликовал Алексей Богачев (aabogachev) в раздел Программирование - Практика программирования

Смысл доработки - в письмах-командах добавляется команда-ссылка "Перепоручить". При клике создается письмо, если в копию поставить email пользователей СЭД и отправить письмо, то данная задача будет перепоручена данным пользователям. Удобно для линейных руководителей - получив задачу от СЭД в почту, достаточно двух кликов, чтобы не заходя в 1С, поручить дело подчиненному.

1. Необходимо сделать новый элемент Перечисления "ВариантыВыполненияПроцессовИЗадач" со значением "Перепоручить"

2. В модуле менеджера Бизнес-процесса "Исполнение" добавить в

Функцию ВариантыОтветовДляВыполненияЗадачиПоПочте 

в этом месте

Если ТочкаМаршрута = ТочкиМаршрута.Исполнить
        ИЛИ ТочкаМаршрута = ТочкиМаршрута.ОтветственноеИсполнение Тогда
        
        Результат.СписокВариантовОтветов.Добавить(
            Перечисления.ВариантыВыполненияПроцессовИЗадач.Положительно,
            НСтр("ru = 'Исполнено'"));         
            
        Результат.ИспользоватьКомментарий = Истина;
            
    ИначеЕсли ТочкаМаршрута = ТочкиМаршрута.Контролировать Тогда

добавить пару строчек таким образом

Если ТочкаМаршрута = ТочкиМаршрута.Исполнить
		ИЛИ ТочкаМаршрута = ТочкиМаршрута.ОтветственноеИсполнение Тогда
		
		Результат.СписокВариантовОтветов.Добавить(
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Положительно,
			НСтр("ru = 'Исполнено'"));
			
		//-код для вставки-	
		Результат.СписокВариантовОтветов.Добавить(
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Перепоручить,
			НСтр("ru = 'Перепоручить'"));			
		//-конец кода для вставки-
			
		Результат.ИспользоватьКомментарий = Истина;
			
	ИначеЕсли ТочкаМаршрута = ТочкиМаршрута.Контролировать Тогда

3. В модуле менеджера Бизнес-процесса "Ознакомление" добавить в

Функцию ВариантыОтветовДляВыполненияЗадачиПоПочте 

в этом месте

Если ТочкаМаршрута = ТочкиМаршрута.Ознакомиться Тогда
		Результат.СписокВариантовОтветов.Добавить(
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Положительно,
			НСтр("ru = 'Ознакомился'"));
						
		Результат.ИспользоватьКомментарий = Истина;
КонецЕсли;

добавить так:

Если ТочкаМаршрута = ТочкиМаршрута.Ознакомиться Тогда
		Результат.СписокВариантовОтветов.Добавить(
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Положительно,
			НСтр("ru = 'Ознакомился'"));
			
		//-код для вставки-			
		Результат.СписокВариантовОтветов.Добавить(
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Перепоручить,
			НСтр("ru = 'Перепоручить'"));			
		//-конец кода-
	
		Результат.ИспользоватьКомментарий = Истина;
	КонецЕсли;

4. Делаем Общий модуль, там мы будем хранить функции, которые будут для нас делать дополнительную обработку, допустим назовем его ТТТ_Задачи

5. Записываем в него следующий код

Функция РазбитьСтроку(ИсходнаяСтрока,Разделитель) Экспорт
	Рез = Новый Массив;
	Строки = СтрЗаменить(ИсходнаяСтрока,Разделитель,Символы.ПС);
	Для Ном = 1 По СтрЧислоСтрок(Строки) Цикл
		Рез.Добавить(СтрПолучитьСтроку(Строки,Ном));
	КонецЦикла;
	Возврат Рез;
КонецФункции

Функция ПолучитьАдресаЭлектроннойПочты(Знач АдресЭлектроннойПочтыСтр) Экспорт
	
	Результат = Новый Массив;
	Адреса = Новый Массив;
	
	Адреса = РазбитьСтроку(АдресЭлектроннойПочтыСтр,";");
	
	Для НомЭлПочты = 0 По Адреса.Количество()-1 Цикл
		
		СтрокаАдреса = РаботаСоСтроками.РазложитьПредставлениеАдресаЭлектроннойПочты(Адреса[НомЭлПочты]);	
		
		Если Не РаботаСоСтроками.ЭтоАдресЭлектроннойПочты(СтрокаАдреса.Адрес) Тогда
			Возврат ложь;
		Иначе
			Результат.Добавить (СтрокаАдреса.Адрес);
		КонецЕсли;
		
	КонецЦикла;

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

Процедура СоздатьПереподчинениеИзПочты(ТекЗадача, Автор, Исполнитель,Комментарий="") Экспорт

	Попытка
	БП = БизнесПроцессы["Исполнение"].СоздатьБизнесПроцесс();
	БП.Автор = Автор;
	БП.Контролер = Автор;
	БП.Важность = ТекЗадача.Важность;
	БП.ГлавнаяЗадача = ТекЗадача.Ссылка;
	БП.Наименование = СокрЛП(БП.Метаданные().Имя) + ": " + ТекЗадача.Наименование;
	если сокрлп(Комментарий)<>"" тогда
		БП.Описание = СокрЛП(ТекЗадача.Описание + Символы.ПС + Символы.ВК + БП.Автор.Наименование + ": " + Комментарий);
	иначе
		БП.Описание = СокрЛП(ТекЗадача.Описание);
	конецесли;
	БП.СрокИсполненияПроцесса = ТекЗадача.СрокИсполнения;
	если БП.СрокИсполненияПроцесса =  Дата(1, 1, 1) тогда 
		НоваяДата = КонецДня(ТекущаяДата()) + 604800;
		
		если деньнедели(НоваяДата)=6 тогда
			НоваяДата = КонецДня(ТекущаяДата()) + 86400*2;
		иначеесли деньнедели(НоваяДата)=7 тогда
			НоваяДата = КонецДня(ТекущаяДата()) + 86400;
		конецесли;	
		БП.СрокИсполненияПроцесса = НоваяДата;
	конецесли;
	НовИспонитель = БП.Исполнители.Добавить();
	НовИспонитель.Исполнитель = Исполнитель;
	БП.Дата = ТекущаяДата();
	Если Не ТипЗнч(ТекЗадача.БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование") и Не ТипЗнч(ТекЗадача.БизнесПроцесс) = Тип("БизнесПроцессСсылка.Утверждение") Тогда
		БП.ФБ_ПерепоручитьИЗакрыть = Истина;
	Иначе
		БП.ФБ_ПерепоручитьИЗакрыть = Ложь;
	КонецЕсли;       
	Если БП.Метаданные().Реквизиты.Найти("УзелОбмена") <> Неопределено Тогда
	    БП.УзелОбмена = ТекЗадача.БизнесПроцесс.УзелОбмена;
	КонецЕсли;
	Если БП.Метаданные().Реквизиты.Найти("ВариантИсполнения") <> Неопределено Тогда
		БП.ВариантИсполнения = Перечисления.ВариантыМаршрутизацииЗадач.Параллельно;
	КонецЕсли;   
	
	ЗадачаОбъект = ТекЗадача.ПолучитьОбъект();
	ЗадачаОбъект.ПринятаКИсполнению = Истина;
	
	УстановитьПривилегированныйРежим(Истина);
	Если БП.Метаданные().ТабличныеЧасти.Найти("Предметы") <> Неопределено и ТекЗадача.БизнесПроцесс.Метаданные().ТабличныеЧасти.Найти("Предметы") <> Неопределено Тогда
		Для Каждого Стр Из ТекЗадача.БизнесПроцесс.Предметы Цикл
			Мультипредметность.ДобавитьПредмет(БП,Стр.Предмет);
		Конеццикла;
	КонецЕсли;
	БП.Записать();
	БП.Старт();
	ЗадачаОбъект.Записать();
	УстановитьПривилегированныйРежим(Ложь);
		
	Исключение
		ОтменитьТранзакцию();
		РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
			"нет", 
			Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),
			ТекЗадача);
	КонецПопытки;
		
КонецПроцедуры

6. В общем модуле "ВыполнениеЗадачПоПочтеСервер" нужно сделать такие изменения

в функции ПолучитьОтветыВВидеСсылокMailto 

этот код 

			ТекстОтвета = НСтр("ru = '%1
				|
				|________________________________________________
				|Это служебная информация, необходимая для выполнения задачи.
				|Не удаляйте и не изменяйте ее!
				|
				|*Задача:%2
				|*Ответ:%3
				|
				|'", КодЯзыкаПолучателя);

поменять на этот

		если ВариантОтвета.Значение = Перечисления.ВариантыВыполненияПроцессовИЗадач.Перепоручить тогда
			ТекстОтвета = НСтр("ru = '%1
				|
				|________________________________________________
				|Это служебная информация, необходимая для выполнения задачи.
				|Не удаляйте и не изменяйте ее!
				|
				|Для данного варианта ответа обязательно заполнение поля КОПИЯ в e-mail
				|В данном поле указываются пользователи СЭД для перепоручения
				|
				|*Задача:%2
				|*Ответ:%3
				|
				|'", КодЯзыкаПолучателя);		
		иначе
			ТекстОтвета = НСтр("ru = '%1
				|
				|________________________________________________
				|Это служебная информация, необходимая для выполнения задачи.
				|Не удаляйте и не изменяйте ее!
				|
				|*Задача:%2
				|*Ответ:%3
				|
				|'", КодЯзыкаПолучателя);
		конецесли;

в функции ПолучитьЧисловойИдентификаторВариантаОтвета добавить в конец условия это

	ИначеЕсли ВариантОтвета =
		Перечисления.ВариантыВыполненияПроцессовИЗадач.Перепоручить Тогда
		
		РезультатОтвета = "4";
		
	КонецЕсли;

в функции ПолучитьВариантВыполнениеЗадачиПоПоЧисловомуИдентификатору в конец условия добавить это

	ИначеЕсли НомерРезультата = "4" Тогда
		ВариантВыполненияЗадачи =
			Перечисления.ВариантыВыполненияПроцессовИЗадач.Перепоручить;
	Иначе
		ВариантВыполненияЗадачи = Неопределено;
	КонецЕсли;

функцию ОбработатьСообщениеОВыполненииЗадачи привожу с комментариями целиком, в ней основной код

Функция ОбработатьСообщениеОВыполненииЗадачи(Сообщение)
	
	НачатьТранзакцию();
	
	ЗадачаСсылка = ПредопределенноеЗначение("Задача.ЗадачаИсполнителя.ПустаяСсылка");
	
	Попытка
		
		//-код для вставки-
		ПараметрыКопии = ТТТ_Задачи.ПолучитьАдресаЭлектроннойПочты(Сообщение.Копия);
		//-конец кода для вставки-
		ПараметрыОтправителя = РаботаСоСтроками.РазложитьПредставлениеАдресаЭлектроннойПочты(Сообщение.Отправитель);
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ РАЗЛИЧНЫЕ
			|	ПользователиКонтактнаяИнформация.Ссылка КАК Пользователь
			|ПОМЕСТИТЬ НайденныеПользователиПоАдресу
			|ИЗ
			|	Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
			|ГДЕ
			|	ПользователиКонтактнаяИнформация.АдресЭП ПОДОБНО """" + &АдресЭП + """"
			|
			|ОБЪЕДИНИТЬ
			|
			|ВЫБРАТЬ РАЗЛИЧНЫЕ
			|	СпособыУведомленияПользователей.Пользователь
			|ИЗ
			|	РегистрСведений.СпособыУведомленияПользователей КАК СпособыУведомленияПользователей
			|ГДЕ
			|	СпособыУведомленияПользователей.ДанныеСпособа ПОДОБНО """" + &АдресЭП + """"
			|	И СпособыУведомленияПользователей.СпособУведомления = ЗНАЧЕНИЕ(Перечисление.СпособыУведомления.ПоПочте)
			|;
			|
			|////////////////////////////////////////////////////////////////////////////////
			|ВЫБРАТЬ
			|	НайденныеПользователиПоАдресу.Пользователь
			|ИЗ
			|	НайденныеПользователиПоАдресу КАК НайденныеПользователиПоАдресу
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
			|		ПО НайденныеПользователиПоАдресу.Пользователь = Пользователи.Ссылка
			|ГДЕ
			|	Пользователи.ПометкаУдаления = ЛОЖЬ
			|	И Пользователи.Служебный = ЛОЖЬ
			|	И Пользователи.Недействителен = ЛОЖЬ";
			
		Запрос.УстановитьПараметр("АдресЭП", ПараметрыОтправителя.Адрес);
		Выборка = Запрос.Выполнить().Выбрать();
		
		Если Выборка.Следующий() Тогда
			ИсполнительЗадачиПоЭлАдресу = Выборка.Пользователь;
			КодЯзыкаИсполнителя = ЛокализацияКонфигурацииПовтИсп.КодЯзыкаПользователя(ИсполнительЗадачиПоЭлАдресу);
		Иначе
			ИсполнительЗадачиПоЭлАдресу = Неопределено;
			КодЯзыкаИсполнителя = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка();
		КонецЕсли;
		
		ИдентификаторыЗадачи = ПолучитьСтрокиСообщенияПоЗаголовкуПоля(
			Сообщение,
			НСтр( "ru = '*Задача:'", КодЯзыкаИсполнителя),
			36);
			
		ИдентификаторыОтвета = ПолучитьСтрокиСообщенияПоЗаголовкуПоля(
			Сообщение,
			НСтр( "ru = '*Ответ:'", КодЯзыкаИсполнителя),
			1);
			
		Если ИдентификаторыЗадачи.Количество() = 0 Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииНеУказанИдентификаторЗадачи,,
				ЗадачаСсылка);
				
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииНеУказанИдентификаторЗадачи,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
			
		Если ИдентификаторыЗадачи.Количество() > 1 Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииУказаноНесколькоИдентификаторовЗадачи,,
				ЗадачаСсылка);
				
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииУказаноНесколькоИдентификаторовЗадачи,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
		
		ЗадачаПоИдентификатору = Задачи.ЗадачаИсполнителя.ПолучитьСсылку(
			Новый УникальныйИдентификатор(ИдентификаторыЗадачи[0]));
			
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	ЗадачаИсполнителя.Ссылка
			|ИЗ
			|	Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
			|ГДЕ
			|	ЗадачаИсполнителя.Ссылка = &Ссылка";
		Запрос.УстановитьПараметр("Ссылка", ЗадачаПоИдентификатору);
		
		Если Запрос.Выполнить().Пустой() Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение, Перечисления.РезультатВыполненияЗадачиПоПочте.ЗадачаНеНайдена,,
				ЗадачаСсылка);
				
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ЗадачаНеНайдена,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
		
		ЗадачаСсылка = ЗадачаПоИдентификатору;
		
		Если ИдентификаторыОтвета.Количество() = 0 Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииНеУказанИдентификаторОтвета,,
				ЗадачаСсылка);
			
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииНеУказанИдентификаторОтвета,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
		
		Если ИдентификаторыОтвета.Количество() > 1 Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииУказаноНесколькоИдентификаторовОтвета,,
				ЗадачаСсылка);
			
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ВСообщенииУказаноНесколькоИдентификаторовОтвета,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
		
		ВариантВыполненияЗадачи =
			ПолучитьВариантВыполнениеЗадачиПоПоЧисловомуИдентификатору(ИдентификаторыОтвета[0]);
		
		Если ВариантВыполненияЗадачи = Неопределено Тогда
					
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение, Перечисления.РезультатВыполненияЗадачиПоПочте.ОтветНеНайден,,
				ЗадачаСсылка);
				
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ОтветНеНайден,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
			
		Если НЕ ПроверитьСоответсвиеРезультатВыполненияИЗадачи(
			ЗадачаСсылка,
			ВариантВыполненияЗадачи) Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ЗадачеНеСоответствуетЗначениеОтвета,,
				ЗадачаСсылка);
			
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ЗадачеНеСоответствуетЗначениеОтвета,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
		
		Если Выборка.Количество() > 1 Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ПоАдресуОтправителяНайденоНесколькоИсполнителей,,
				ЗадачаСсылка);
			
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ПоАдресуОтправителяНайденоНесколькоИсполнителей,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		ИначеЕсли Выборка.Количество() = 0 Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ПоАдресуОтправителяНеНайденИсполнительЗадачи,,
				ЗадачаСсылка);
			
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ПоАдресуОтправителяНеНайденИсполнительЗадачи,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
			
			ЗафиксироватьТранзакцию();
			Возврат Истина;
			
		КонецЕсли;
		
		//-код для вставки-
		если ВариантВыполненияЗадачи=Перечисления.ВариантыВыполненияПроцессовИЗадач.Перепоручить тогда
			АвторЗадачиПоЭлАдресу = ИсполнительЗадачиПоЭлАдресу;

			если не ТипЗнч(ПараметрыКопии)=Тип("Массив") тогда
				РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
					Сообщение,
					Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,"в поле КОПИЯ отсутствует email пользователя СЭД, задача не создана",
					ЗадачаСсылка);
				
				ОтправитьУведомлениеОбОшибке(
					"в поле КОПИЯ отсутствует email пользователя СЭД, задача не создана",
					Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,
					ЗадачаСсылка,
					КодЯзыкаИсполнителя);
				
				ЗафиксироватьТранзакцию();
				Возврат Истина;				
			конецесли;

			Для Ном = 0 По ПараметрыКопии.Количество()-1 Цикл
				копия = ПараметрыКопии[Ном];
				
				Запрос = Новый Запрос;
				Запрос.Текст = 
					"ВЫБРАТЬ РАЗЛИЧНЫЕ
					|	ПользователиКонтактнаяИнформация.Ссылка КАК Пользователь
					|ПОМЕСТИТЬ НайденныеПользователиПоАдресу
					|ИЗ
					|	Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
					|ГДЕ
					|	ПользователиКонтактнаяИнформация.АдресЭП ПОДОБНО """" + &АдресЭП + """"
					|
					|ОБЪЕДИНИТЬ
					|
					|ВЫБРАТЬ РАЗЛИЧНЫЕ
					|	СпособыУведомленияПользователей.Пользователь
					|ИЗ
					|	РегистрСведений.СпособыУведомленияПользователей КАК СпособыУведомленияПользователей
					|ГДЕ
					|	СпособыУведомленияПользователей.ДанныеСпособа ПОДОБНО """" + &АдресЭП + """"
					|	И СпособыУведомленияПользователей.СпособУведомления = ЗНАЧЕНИЕ(Перечисление.СпособыУведомления.ПоПочте)
					|;
					|
					|////////////////////////////////////////////////////////////////////////////////
					|ВЫБРАТЬ
					|	НайденныеПользователиПоАдресу.Пользователь
					|ИЗ
					|	НайденныеПользователиПоАдресу КАК НайденныеПользователиПоАдресу
					|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
					|		ПО НайденныеПользователиПоАдресу.Пользователь = Пользователи.Ссылка
					|ГДЕ
					|	Пользователи.ПометкаУдаления = ЛОЖЬ
					|	И Пользователи.Служебный = ЛОЖЬ
					|	И Пользователи.Недействителен = ЛОЖЬ";
					
				Запрос.УстановитьПараметр("АдресЭП", копия);
				ВыборкаКопия = Запрос.Выполнить().Выбрать();
				
				Если ВыборкаКопия.Количество() > 1 Тогда
					
					РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
						Сообщение,
						Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,"в поле КОПИЯ адрес электронной почты которому соответствуют более одного исполнителя",
						ЗадачаСсылка);
					
					ОтправитьУведомлениеОбОшибке(
						"в поле КОПИЯ адрес электронной почты которому соответствуют более одного исполнителя",
						Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,
						ЗадачаСсылка,
						КодЯзыкаИсполнителя);
					
					ЗафиксироватьТранзакцию();
					Возврат Истина;
					
				ИначеЕсли ВыборкаКопия.Количество() = 0 Тогда
					
					РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
						Сообщение,
						Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,"в поле КОПИЯ адрес электронной почты которому не соответствует ни один исполнитель",
						ЗадачаСсылка);
					
					ОтправитьУведомлениеОбОшибке(
						"в поле КОПИЯ адрес электронной почты которому не соответствует ни один исполнитель",
						Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,
						ЗадачаСсылка,
						КодЯзыкаИсполнителя);
					
					ЗафиксироватьТранзакцию();
					Возврат Истина;
					
				КонецЕсли;
				
				РеквизитыЗадачи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка,
					"ТекущийИсполнитель,
					|Выполнена,
					|СостояниеБизнесПроцесса,
					|ПометкаУдаления");
				
				ИсполнительЗадачи = РеквизитыЗадачи.ТекущийИсполнитель;
				ФактическийИсполнительЗадачи = Справочники.Пользователи.ПустаяСсылка();
					
				Запрос = Новый Запрос;
				Запрос.Текст = 
					"ВЫБРАТЬ РАЗЛИЧНЫЕ
					|	ИсполнителиРолейИДелегаты.ИсполнительДелегат
					|ИЗ
					|	РегистрСведений.ИсполнителиРолейИДелегаты КАК ИсполнителиРолейИДелегаты
					|ГДЕ
					|	ИсполнителиРолейИДелегаты.РольПользователь = &РольПользователь
					|	И ИсполнителиРолейИДелегаты.ИсполнительДелегат = &ИсполнительЗадачи
					|	И ИсполнителиРолейИДелегаты.ИмяОбластиДелегирования В ("""", ""ПроцессыИЗадачи"")";
					
				Запрос.УстановитьПараметр("РольПользователь", РеквизитыЗадачи.ТекущийИсполнитель);
				
				Запрос.УстановитьПараметр("ИсполнительЗадачи", АвторЗадачиПоЭлАдресу);
				
				Результат = Запрос.Выполнить();
				
				Если Результат.Пустой() Тогда
					РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
						Сообщение,
						Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибк,"Отправитель этого письма не является исполнителем по данной задаче",
						ЗадачаСсылка);
					
					ОтправитьУведомлениеОбОшибке(
						"Отправитель этого письма не является исполнителем по данной задаче",
						Перечисления.РезультатВыполненияЗадачиПоПочте.ДляЗадачиОпределенДругойИсполнитель,
						ЗадачаСсылка,
						КодЯзыкаИсполнителя);
						
					ЗафиксироватьТранзакцию();
					Возврат Истина;				
				конецесли;
				
				ТекстОкончанияКомментария = НСтр("ru = '________________________________________________'",
					КодЯзыкаИсполнителя);
				НачальнаяПозицияКомментария = 1;
				КонечнаяПозицияКомментария = Найти(Сообщение.Текст, ТекстОкончанияКомментария);
				КоличествоСимволов = КонечнаяПозицияКомментария - НачальнаяПозицияКомментария;
				КомментарийВСообщении = Сред(Сообщение.Текст, НачальнаяПозицияКомментария, КоличествоСимволов);
				
				КомментарийВСообщении = СокрЛП(КомментарийВСообщении);
				
				КомментарийВСообщении = КомментарийВСообщении + ?(ЗначениеЗаполнено(КомментарийВСообщении), "
					|", "") + НСтр("ru = ''",
					КодЯзыкаИсполнителя);
							
				Если ТипЗнч(АвторЗадачиПоЭлАдресу) = Тип("СправочникСсылка.Пользователи") Тогда
					
					Если РеквизитыЗадачи.СостояниеБизнесПроцесса <> Перечисления.СостоянияБизнесПроцессов.Активен
					Или РеквизитыЗадачи.ПометкаУдаления Тогда
					
					РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
						Сообщение,
						Перечисления.РезультатВыполненияЗадачиПоПочте.ЗадачаНеАктивна,,
						ЗадачаСсылка);
					
					Иначе
						
						Если ВыборкаКопия.Следующий() Тогда
							
							ИсполнительЗадачиПоЭлАдресу = ВыборкаКопия.Пользователь;
							КодЯзыкаИсполнителя = ЛокализацияКонфигурацииПовтИсп.КодЯзыкаПользователя(ИсполнительЗадачиПоЭлАдресу);
							Если ТипЗнч(ИсполнительЗадачиПоЭлАдресу) = Тип("СправочникСсылка.Пользователи") Тогда
								
								ТТТ_Задачи.СоздатьПереподчинениеИзПочты(ЗадачаСсылка, АвторЗадачиПоЭлАдресу, ИсполнительЗадачиПоЭлАдресу, КомментарийВСообщении);
								
							конецесли;				
							
						КонецЕсли;						
						
					конецесли;

				КонецЕсли;
												
			конеццикла;	
			
		иначе
		//-конец кода для вставки-
		//-дальше идет блок из оригинальной функции -
		РеквизитыЗадачи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗадачаСсылка,
			"ТекущийИсполнитель,
			|Выполнена,
			|СостояниеБизнесПроцесса,
			|ПометкаУдаления");
		
		ИсполнительЗадачи = РеквизитыЗадачи.ТекущийИсполнитель;
		ФактическийИсполнительЗадачи = Справочники.Пользователи.ПустаяСсылка();
			
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ РАЗЛИЧНЫЕ
			|	ИсполнителиРолейИДелегаты.ИсполнительДелегат
			|ИЗ
			|	РегистрСведений.ИсполнителиРолейИДелегаты КАК ИсполнителиРолейИДелегаты
			|ГДЕ
			|	ИсполнителиРолейИДелегаты.РольПользователь = &РольПользователь
			|	И ИсполнителиРолейИДелегаты.ИсполнительДелегат = &ИсполнительЗадачи
			|	И ИсполнителиРолейИДелегаты.ИмяОбластиДелегирования В ("""", ""ПроцессыИЗадачи"")";
			
		Запрос.УстановитьПараметр("РольПользователь", РеквизитыЗадачи.ТекущийИсполнитель);
		
		Запрос.УстановитьПараметр("ИсполнительЗадачи", ИсполнительЗадачиПоЭлАдресу);
		
		Результат = Запрос.Выполнить();
		
		Если Результат.Пустой() Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ДляЗадачиОпределенДругойИсполнитель,,
				ЗадачаСсылка);
			
			ОтправитьУведомлениеОбОшибке(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ДляЗадачиОпределенДругойИсполнитель,
				ЗадачаСсылка,
				КодЯзыкаИсполнителя);
				
			ЗафиксироватьТранзакцию();
			Возврат Истина;
		КонецЕсли;
		
		Если ТипЗнч(РеквизитыЗадачи.ТекущийИсполнитель) = Тип("СправочникСсылка.Пользователи") Тогда
			
			ФактическийИсполнительЗадач = Константы.ФактическийИсполнительЗадач.Получить();
			Если ФактическийИсполнительЗадач = Перечисления.ФактическийИсполнительЗадач.ТекущийПользователь
				Или ФактическийИсполнительЗадач = Перечисления.ФактическийИсполнительЗадач.ВыборПриИсполненииЗадачи Тогда
				
				ФактическийИсполнительЗадачи = ИсполнительЗадачиПоЭлАдресу;
			КонецЕсли;
			
		Иначе
			
			ИсполнительЗадачи = ИсполнительЗадачиПоЭлАдресу;
			
		КонецЕсли;
		
		Если РеквизитыЗадачи.Выполнена = Истина
			Или РеквизитыЗадачи.СостояниеБизнесПроцесса <> Перечисления.СостоянияБизнесПроцессов.Активен
			Или РеквизитыЗадачи.ПометкаУдаления Тогда
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение,
				Перечисления.РезультатВыполненияЗадачиПоПочте.ЗадачаНеАктивна,,
				ЗадачаСсылка);
			
		Иначе
			
			ТекстОкончанияКомментария = НСтр("ru = '________________________________________________'",
				КодЯзыкаИсполнителя);
			НачальнаяПозицияКомментария = 1;
			КонечнаяПозицияКомментария = Найти(Сообщение.Текст, ТекстОкончанияКомментария);
			КоличествоСимволов = КонечнаяПозицияКомментария - НачальнаяПозицияКомментария;
			КомментарийВСообщении = Сред(Сообщение.Текст, НачальнаяПозицияКомментария, КоличествоСимволов);
			
			КомментарийВСообщении = СокрЛП(КомментарийВСообщении);
			
			КомментарийВСообщении = КомментарийВСообщении + ?(ЗначениеЗаполнено(КомментарийВСообщении), "
				|", "") + НСтр("ru = ''",
				КодЯзыкаИсполнителя);
			
			Параметры = Новый Структура;
			Параметры.Вставить("ВариантВыполнения", ВариантВыполненияЗадачи);
			Параметры.Вставить("Комментарий", КомментарийВСообщении);
			Параметры.Вставить("ИсполнительЗадачиПоПочте", ИсполнительЗадачи);
			
			Если ЗначениеЗаполнено(ФактическийИсполнительЗадачи) Тогда
				Параметры.Вставить("ФактическийИсполнительЗадачи", ФактическийИсполнительЗадачи);
			КонецЕсли;
			
			ОбработатьВложенияВСообщении(ЗадачаСсылка, Сообщение);
			
			РезультатПроверки = БизнесПроцессыИЗадачиСервер.ПроверитьУсловияЗапретаВыполнения(ЗадачаСсылка, Параметры);
			Если РезультатПроверки.ЗапретВыполнения Тогда
				
				РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
					Сообщение,
					Перечисления.РезультатВыполненияЗадачиПоПочте.ЗапретВыполнения,
					РезультатПроверки.ТекстПредупреждения,
					ЗадачаСсылка);
				
				ОтправитьУведомлениеОбОшибке(
					Сообщение,
					Перечисления.РезультатВыполненияЗадачиПоПочте.ЗапретВыполнения,
					ЗадачаСсылка,
					КодЯзыкаИсполнителя,
					РезультатПроверки.ТекстПредупреждения);
				
				ЗафиксироватьТранзакцию();
				
				Возврат Истина;
				
			КонецЕсли;
			
			ВыполнениеЗадачСервер.ВыполнитьЗадачуПоПочте(ЗадачаСсылка, Параметры);
			
			РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
				Сообщение, 
				Перечисления.РезультатВыполненияЗадачиПоПочте.Выполнена,
				Строка(ВариантВыполненияЗадачи) + ". " + КомментарийВСообщении,
				ЗадачаСсылка);
			
		КонецЕсли;
		//-код для вставки-		
		конецесли;
		//-конец кода для вставки-		
		ЗафиксироватьТранзакцию();
		Возврат Истина;
		
	Исключение
		ОтменитьТранзакцию();
		РегистрыСведений.ПротоколВыполненияЗадачПоПочте.ЗаписатьРезультатВыполненияПоСообщению(
			Сообщение, 
			Перечисления.РезультатВыполненияЗадачиПоПочте.Ошибка,
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),
			ЗадачаСсылка);
		Возврат Ложь;
	КонецПопытки;
	
КонецФункции

Вот и все изменения.

См. также

Комментарии
1. Nataly Kalmykova (NaKa) 14.02.17 17:07 Сейчас в теме
Классная идея, ее бы в стандартный функционал добавить надо :)
aabogachev; +1 Ответить
2. Дмитрий Рябов (ryabov_d) 15.02.17 08:59 Сейчас в теме
Если в копии письма указать сотрудника, то ему придет и ответ для системы о перенаправлении, и уведомление о получении новой задачи. Как избежать дублирования, если нужно чтобы уведомления о новых задачах все-таки поступали?
3. Юрий Швырков (Ioryk) 15.02.17 20:06 Сейчас в теме
Оч. полезная разработка. Спасибо !
4. Александр Гуральчук (alleks23) 21.02.17 07:50 Сейчас в теме
(2) Кстати, там же возможны и проблемы с правами, т.к. в задаче права только на участников процесса
zabaluev; +1 Ответить
Оставьте свое сообщение