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

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С:Документооборот 8, версия 3.0

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

1С:Документооборот 8 - это программное обеспечение, которое позволяет автоматизировать процессы документооборота внутри компании. Оно включает в себя модули для создания, отправки, получения, хранения и обработки документов, таких как счета-фактуры, договоры, акты и т.д. 1С:Документооборот 8 позволяет организовать эффективный обмен документами между различными подразделениями компании и с внешними контрагентами, а также сокращает время на обработку документов и снижает вероятность ошибок.

42500 руб.

19.02.2016    103471    85    4    

69

RayCon® Foreign Trade - Документооборот валютного контроля и международных платежей для участников ВЭД

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

Программа предназначена для автоматизации внешнеторговых компаний и обеспечивает документооборот валютного контроля: присвоение Уникального номера контракта (УНК), формирований сведений о валютных операциях (СВО) и справок о подтверждающих документах (СПД), прочих необходимых форм учета и отчетности по валютным операциям согласно действующему валютному законодательству Российской Федерации, документооборот валютных платежей согласно международным стандартам и документооборот купли-продажи валюты, а также выгрузку любых документов 1С в любую систему клиент-банк.

144000 руб.

13.05.2009    66212    20    29    

42

SALE! 35%

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в 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С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить". Программа сама находит таблицу в файле, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает товарные документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, накладную, заказ клиента и т.д.). Содержит модуль работы с электронной почтой. Для поиска таблиц используются новейшие методы OCR-нейросети. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д.

5400 4968 руб.

04.06.2019    95784    275    169    

286

Модуль «Миграционный учет» для 1С:Предприятие 8

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

Набор актуальных на 2023 год форм бланков для ведения миграционного учёта по иностранным работникам в «1С:Зарплата и Управление Персоналом 8», «1С:Бухгалтерия 8», «1С:ERP 8», «1С:УПП 8» и других конфигураций 1С. В решении реализованы все специальные формы, которые по законодательству работодатель должен подавать при трудоустройстве иностранного работника в Отдел миграции ГУ МВД. Модуль устанавливается в режиме 1С:Предприятие 8, что позволяет оставить конфигурацию 1С на стандартной поддержке и продолжать получать стандартные обновления от фирмы "1С". ВАЖНО! Все формы обновлены на соответствующие по законодательству РФ на сегодняшний день.

18890 руб.

06.02.2012    120771    65    87    

130

Легкий документооборот (+чат-бот для Telegram)

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

Расширение для согласования справочников и документов в конфигурациях "1С: Бухгалтерия 3.0", "Управление нашей фирмой", "1С ERP Управление предприятием". Ролевая адресация, условная маршрутизация, последовательное и параллельное согласование, уведомление о новых задачах на почту, блокировка объектов в зависимости от статуса, запрет проведения в зависимости от статуса, автозапуск процессов согласования, отчеты по исполнительской дисциплине. Не требуется снятие конфигурации с поддержки. Настройка без программирования. Версия для абонентов 1cfresh.com. Сертификат 1С-Совместимо. Расширение входит в TOP устанавливаемых на 1cfresh.com https://dev.1cfresh.com/

14900 руб.

15.11.2018    25184    16    45    

46

Печать договоров по шаблонам для УТ 11, КА 2, ERP 2

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

Обработка реализует функционал работы с шаблонами договоров, используемый в 1С:Бухгалтерия предприятия 3.0. Предназначена для конфигураций - 1С:Управление торговлей 11.5, 3.4 (Беларусь); - 1С:Комплексная автоматизация КА 2; - 1С:ERP Управление предприятием 2;

4900 руб.

19.09.2018    80582    191    148    

205

Обмен документами Поступления-Реализации и Счетами-фактурами в базах 1С Бухгалтерия 8.2, 8.3 с возможностью преобразования

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

Позволяет выгрузить документы поступления или реализации с данными на закладках "товары" и "услуги" и счета-фактуры в файл Excel (.CSV)и загрузить их, используя настройки преобразования. Выгрузка и загрузка работает в обоих релизах бухгалтерии ( 8.2->8.2, 8.2->8.3, 8.3->8.2, 8.3->8.3). Удобна для обмена документами между базами контрагентов (реализацию в поступление, поступление в реализацию), либо внутри одной базы (поступление из реализации с уменьшением цены на % , реализация из поступления с повышением цены на %), либо перенос документов в копию. Не использует правила обмена, поэтому не зависит от релизов конфигураций. Работает с конфигурациями 8.2 и 8.3 (есть обычная и управляемая форма). Файл обмена универсальный для обоих редакций. ВНИМАНИЕ ! В связи с наличием неуправляемых форм обработка не работает в сервисе 1С:Fresh.

4800 руб.

14.04.2015    102888    198    106    

191

ЭДО: организация архива оригиналов первичных документов, комплексный отчет по ошибкам

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

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

14880 руб.

17.12.2018    42892    49    51    

65
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Оч. полезная разработка. Спасибо !
Оставьте свое сообщение