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

13.02.17

Функциональные - Документооборот и делопроизводство (СЭД)

Смысл доработки - в письмах-командах добавляется команда-ссылка "Перепоручить". При клике создается письмо, если в копию поставить 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С v8.3 Управленческий учет Платные (руб)

Организуйте правильный оборот документов на вашем предприятии в 1С. Ведение учета и хранения документов. Управление потоками документации между подразделениями. Работа с договорами в компании. Автоматизация процессов подготовки, согласования и подписания документов. Сократите время и объем ошибок с 1С:ДО!

48500 руб.

19.02.2016    108565    121    5    

96

SALE! 30%

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Бухгалтер Пользователь Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания сканов или фото товарных документов в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

8400 5880 руб.

04.06.2019    107036    313    173    

326

Документооборот и делопроизводство (СЭД) Бухгалтер Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Продукт "Апрель Софт: Бухгалтерия позаказного производства, ред. 3.0" предназначен для удобного и оперативного управления процессами производства, отгрузок и снабжения в производственных компаниях. Программный продукт открывает новые функциональные возможности для ведения документооборота.

11400 руб.

18.02.2016    22962    1    1    

5

Документооборот и делопроизводство (СЭД) Мессенджеры и боты Учет документов Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 Платные (руб)

Расширение для согласования справочников и документов в основных типовых конфигурациях. Ролевая адресация, условная маршрутизация, чат-бот telegram, интеграция с n8n, последовательное и параллельное согласование, уведомление о новых задачах на почту, блокировка объектов в зависимости от статуса, запрет проведения в зависимости от статуса, автозапуск процессов согласования, отчеты по исполнительской дисциплине. Не требуется снятие конфигурации с поддержки. Настройка без программирования. Версия для 1cfresh.com. Сертификат 1С-Совместимо.

14900 руб.

15.11.2018    30285    35    49    

71

Документооборот и делопроизводство (СЭД) ЭДО и ОФД Учет документов Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Мощный, единый инструмент для решения всех проблем, связанных с переходом на ЭДО. Экономит бумагу и время - организует архив оригиналов первичных документов прямо в базе 1С, в прикрепленных файлах к соответствующим документам. С помощью комплексного отчета по ошибкам в ЭДО позволяет выявить и исправить все возможные ошибки - ошибочно сопоставленные документы, не подписанные документы, подписанные, но не загруженные в 1С документы. Автоматически сопоставляет не сопоставленные между собой документы. Может работать по расписанию и присылать отчет о состоянии архива/по ошибкам на почту. Взаимодействует напрямую с сервисами Диадок/СБИС, имеет интуитивно понятный интерфейс и учитывает 3-х летний опыт 40+ клиентов.

14880 руб.

17.12.2018    45667    65    59    

79

Документооборот и делопроизводство (СЭД) Роли и права Системный администратор Платформа 1С v8.3 1С:Документооборот Управленческий учет Платные (руб)

Внешняя обработка позволит быстро добавить участников в любое количество документов, заменить целиком набор участников или удалить лишь некоторых из них для одного объекта или группы документов.

3000 руб.

23.10.2015    63614    113    25    

127

Печатные формы Документооборот и делопроизводство (СЭД) Учет документов Бухгалтер Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Бухгалтерский учет Управленческий учет Платные (руб)

Приложение для быстрого создания макетов печатных документов, заполняемых из 1С:Предприятие, без привлечения программистов и запуска конфигуратора. Шаблон готовится в редакторе MS Word, отлично освоенном офисными служащими. Так, на подготовку нового шаблона договора купли продажи со спецификацией потребуется 25 минут. Приложение будет полезно, если Вы работаете со множеством Word-шаблонов или если Вам надо часто создавать новые шаблоны. Есть сертификат "1С: Совместимо!". Версия ПРОФ доступна в виде расширения.

2000 руб.

05.09.2017    92560    66    98    

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