# Форум 1С > Установка и администрирование 1С - Предприятие > 1С - Предприятие 8.0, 8.1, 8.2, 8.3 >  взлом защищённого модуля

## qqq111qqq

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

Как сделать его открытым?

Мне это нужно для рарусовской программы 1c crm. Общий модуль :CRM_ЗащищенныеФункции.

Очень нужно его открыть, потому что без этого никак не могу справиться с синхронизацией в outlook.

----------


## n3ur0

> Никто не сталкивался с такой проблемой: в конфигураторе есть защищённый модуль, нет возможности даже просмотреть код этого модуля (пишет, что исходный текст модуля отсутствует).
> 
> Как сделать его открытым?
> 
> Мне это нужно для рарусовской программы 1c crm. Общий модуль :CRM_ЗащищенныеФункции.
> 
> Очень нужно его открыть, потому что без этого никак не могу справиться с синхронизацией в outlook.


http://forum.ruboard.ru/showpost.php...&postcount=385  :buba:

----------


## qqq111qqq

Спасибо.....
Так и думала.....но надежда всё же была...
с нуля то долго писать эти процедуры обмена с outlook.
Нужно знать как данные хранятся в 1с и outlook....
плохи дела..

----------


## Sintson

> Спасибо.....
> Так и думала.....но надежда всё же была...
> с нуля то долго писать эти процедуры обмена с outlook.
> Нужно знать как данные хранятся в 1с и outlook....
> плохи дела..


http://www.kolobok.us/smiles/light_skin/blush.gif
Есть, знаете-ли способы :)

----------


## koloboc74

кидай ссылку постараюсь открою тебе код

----------


## ByStep

// ОбщийМодуль.CRM_ЗащищенныеФ  нкции.Модуль.txt

Функция CRM_ЗаменитьШаблонВOpenOfficeНаТ  екст(глКомпонента, Параметры, ТегиКолонок) Экспорт
	Возврат глКомпонента.ЗаменитьШабл  нВOpenOfficeНаТекст(Параметры, ТегиКолонок);

КонецФункции



Функция CRM_ЗаменитьШаблонВВордеНаТ  екст(глКомпонента, Ворд, Знач ШаблонВВорде, Знач ТекстЗамены, Везде = Истина) Экспорт
	Перем Результат;
	Попытка
		Если Везде Тогда
			Везде = 1;
		КонецЕсли;
		Результат = глКомпонента.ЗаменитьШабл  нВВордеНаТекст(Ворд, ШаблонВВорде, Строка(ТекстЗамены), Везде);
	Исключение
	КонецПопытки;

	Возврат Результат;

КонецФункции

Процедура CRM_ЗаменитьШаблонВВордеНаК  артнинку(глКомпонента, Ворд, Знач ШаблонВВорде, Картинка) Экспорт
	Перем мФайл, КартинкаВорд;
	CRM_ЗаменитьШаблонВВордеНаТ  екст(глКомпонента, Ворд, ШаблонВВорде, "", Ложь);

	Если ТипЗнч(Картинка) = Тип("Структура") Тогда

		Если ЗначениеЗаполнено(Картинк  .ПолноеИмя) Тогда
			мФайл = Новый Файл(Картинка.ПолноеИмя);
		КонецЕсли;

		Если мФайл <> Неопределено И мФайл.Существует() Тогда
			КартинкаВорд = Ворд.Selection.InlineShapes.AddPicture(мФа  л.ПолноеИмя, Ложь, Истина);
			Если ЗначениеЗаполнено(Картинк  .Высота) Тогда
				КартинкаВорд.Height = Картинка.Высота * 2.833;
			КонецЕсли;
			Если ЗначениеЗаполнено(Картинк  .Ширина) Тогда
				КартинкаВорд.Width = Картинка.Ширина * 2.833;
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

Процедура CRM_ПрименитьФильтр(Парамет  ы, Отбор, НастройкаОтбора, ПредыдущиеЗначенияФильтра  , ФильтрУсловия) Экспорт
	Перем Защита;
	Защита = Обработки.CRM_Защита.Создать  ();
	мКомпонента = Защита.Компонента;

	мКомпонента.ПрименитьФиль  р(Параметры, Отбор, НастройкаОтбора, ПредыдущиеЗначенияФильтра  , ФильтрУсловия);

КонецПроцедуры




Функция CRM_ВычислитьЗначениеУслови  я(Параметры, Условие, Значение = "Значение") Экспорт
	мОписаниеТиповОбъектМетад  анных = Новый ОписаниеТипов("ОбъектМетад  анных");
	мОписаниеТипов = Новый ОписаниеТипов;

	Если ТипЗнч(Условие[Значение]) <> Тип("Строка") Тогда
		Возврат Условие[Значение];
	КонецЕсли;


	Если Условие.Имя = "ВидДокумента" И Условие.ТипЗначения = мОписаниеТиповОбъектМетад  анных Тогда

		Если Условие.ЗначениеС = мОписаниеТипов Или Условие.ЗначениеС = Неопределено Тогда

			Возврат Метаданные.Документы[Условие.ЗначениеПО];
		Иначе
			Возврат Условие.ЗначениеС;
		КонецЕсли;
	КонецЕсли;

	Параметр = Параметры.Найти(Условие[Значение], "Представление");

	Если Не (Параметр = Неопределено) Тогда

		Если ТипЗнч(Параметр.Значение) = Тип("Строка") Тогда
			Возврат Вычислить(Параметр.Значени  е);
		Иначе
			Возврат Параметр.Значение;
		КонецЕсли;
	Иначе


		Возврат Условие[Значение];

	КонецЕсли;


КонецФункции











Функция CRM_ПолучитьСледующиеТочкиМ  аршрута(глКомпонента, Маршрут = Неопределено, Знач ТочкаМаршрута, Знач БизнесПроцесс, Знач Вариант = Неопределено, ИсходнаяТочкаМаршрута = Неопределено) Экспорт
	Возврат глКомпонента.ВыбратьСледу  щиеТочкиМаршрута(глКомпон  ента, Маршрут, ТочкаМаршрута, БизнесПроцесс, Вариант, ИсходнаяТочкаМаршрута);


КонецФункции



Процедура CRM_ПолучитьМаршрутБизнесПр  оцесса(БизнесПроцесс, Маршрут = Неопределено, ТочкаМаршрута = Неопределено) Экспорт
	Если Маршрут = Неопределено Тогда
		Запрос = Новый Запрос;

		Запрос.Текст = "ВЫБРАТЬ
		|	CRM_МаршрутБизнесПроцесса.Т  чкаМаршрута,
		|	CRM_МаршрутБизнесПроцесса.П  метка,
		|	CRM_МаршрутБизнесПроцесса.В  риантВыполнения,
		|	CRM_МаршрутБизнесПроцесса.Ш  блон
		|ИЗ
		|	РегистрСведений.CRM_Маршрут  изнесПроцесса КАК CRM_МаршрутБизнесПроцесса
		|ГДЕ
		|	CRM_МаршрутБизнесПроцесса.Б  знесПроцесс = &БизнесПроцесс";

		Запрос.УстановитьПараметр(  "БизнесПроцесс", БизнесПроцесс);
		Маршрут = Запрос.Выполнить().Выгрузит  ь();
	Иначе
		СтрокаМаршрута = Маршрут.Найти(ТочкаМаршрут  а, "ТочкаМаршрута");
		Если ЗначениеЗаполнено(СтрокаМ  ршрута.Шаблон) Тогда
			Запрос = Новый Запрос;

			Запрос.Текст = "ВЫБРАТЬ
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.ТочкаМаршрута,
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.Пометка,
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.ВариантВыполнения,
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.Ссылка КАК Шаблон
			|ИЗ
			|	ПланВидовХарактеристик.CRM_  аблоныБизнесПроцессов.Мар  шрут КАК CRM_ШаблоныБизнесПроцессовМ  аршрут
			|ГДЕ
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.Ссылка = &Шаблон";

			Запрос.УстановитьПараметр(  "Шаблон", СтрокаМаршрута.Шаблон);
			Маршрут = Запрос.Выполнить().Выгрузит  ь();
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры








Функция CRM_ПолучитьСписокВыбораНас  тройкиУсловия(глКомпонент  , мИмяОбъекта, мРегистрируемыеДокументы, НастройкаУсловийТекущаяСт  рока, ТипЗначенияЭлемента, Параметры) Экспорт
	Возврат глКомпонента.ПолучитьСпис  кВыбораНастройкиУсловия(м  ИмяОбъекта, мРегистрируемыеДокументы, НастройкаУсловийТекущаяСт  рока, ТипЗначенияЭлемента, Параметры);


КонецФункции





Процедура CRM_Сообщить(Сообщение, Статус) Экспорт
	Сообщить(Сообщение, Статус);
КонецПроцедуры










Функция CRM_ПолучитьНомерАктивнойИт  ерации(БизнесПроцесс, ТочкаМаршрута) Экспорт
	НомерАктивнойИтерации = 0;

	ТекстЗапроса = "ВЫБРАТЬ
	|	МАКСИМУМ(CRM_РезультатыВыпо  ненияЗадачСрезПоследних.И  терация) КАК Итерация
	|ИЗ
	|	РегистрСведений.CRM_Результ  тыВыполненияЗадач.СрезПос  ледних(
	|		,
	|		БизнесПроцесс = &БизнесПроцесс
	|		    И ТочкаМаршрута = &ТочкаМаршрута) КАК CRM_РезультатыВыполненияЗад  ачСрезПоследних";

	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.Текст = ТекстЗапроса;

	ПостроительЗапроса.Параме  ры.Вставить("БизнесПроцесс  ", БизнесПроцесс.Ссылка);
	ПостроительЗапроса.Параме  ры.Вставить("ТочкаМаршрута  ", ТочкаМаршрута);

	ПостроительЗапроса.Выполн  ть();

	Если Не ПостроительЗапроса.Резуль  ат.Пустой() Тогда
		НомерАктивнойИтерации = ПостроительЗапроса.Резуль  ат.Выгрузить()[0].Итерация;
	КонецЕсли;

	Возврат ?(НомерАктивнойИтерации = Null, 0, НомерАктивнойИтерации);

КонецФункции









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


	Результат = CRM_ПолучитьСледующиеТочкиМ  аршрута(глКомпонента, , ТочкаМаршрута, БизнесПроцесс, ЗначениеВыбораВарианта);

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

	Для каждого СтруктураВозврата Из МассивТочекМаршрута Цикл

		ИсходящаяТочка = СтруктураВозврата.Исходящ  яТочка;
		ВедущаяТочка = СтруктураВозврата.Ведущая  очка;

		Если ИсходящаяТочка = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда

			ИсходящийБизнесПроцесс = СтруктураВозврата.БизнесП  оцесс;

			Исполнители = ПолучитьИсполнителей(Исхо  ящийБизнесПроцесс, ИсходящаяТочка, ВедущаяТочка);

			регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
			регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(ИсходящийБизнесПроцес  с);
			регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ИсходящаяТочка);
			регМаршрутБизнесПроцесса.  рочитать();
			СтрокаШаблона = регМаршрутБизнесПроцесса.  ыгрузить();


			Если СтрокаШаблона.Количество() > 0 И СтрокаШаблона[0].Пометка Тогда
				ОтложеноНа = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаДней * 24 * 60 * 60 + СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаЧасов * 60 * 60 + СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаМинут * 60;


				КомментарийТочки = СтрокаШаблона[0].Комментарий;

				ОтложитьНачалоСледующегоЭ  тапаДней = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаДней;
				ОтложитьНачалоСледующегоЭ  тапаЧасов = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаЧасов;
				ОтложитьНачалоСледующегоЭ  тапаМинут = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаМинут;
			Иначе

				ОтложеноНа = 0;
				КомментарийТочки = "";

				ОтложитьНачалоСледующегоЭ  тапаДней = 0;
				ОтложитьНачалоСледующегоЭ  тапаЧасов = 0;
				ОтложитьНачалоСледующегоЭ  тапаМинут = 0;
			КонецЕсли;

			Если ЗначениеЗаполнено(Исполни  ели) Тогда

				НоваяСтрока = тбСледующиеИсполнители.До  авить();
				НоваяСтрока.БизнесПроцесс = Исполнители.БизнесПроцесс;
				НоваяСтрока.ТочкаМаршрута = Исполнители.ТочкаМаршрута;
				НоваяСтрока.Исполнитель = Исполнители.Исполнитель;
				НоваяСтрока.РеквизитБП = Исполнители.РеквизитБП;
				НоваяСтрока.Отложено = ОтложеноНа;
				НоваяСтрока.ОписаниеТочки  аршрута = КомментарийТочки;
				НоваяСтрока.ОтложитьНачал  СледующегоЭтапаДней = ОтложитьНачалоСледующегоЭ  тапаДней;
				НоваяСтрока.ОтложитьНачал  СледующегоЭтапаЧасов = ОтложитьНачалоСледующегоЭ  тапаЧасов;
				НоваяСтрока.ОтложитьНачал  СледующегоЭтапаМинут = ОтложитьНачалоСледующегоЭ  тапаМинут;
			КонецЕсли;
		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Завершение Тогда
			НоваяСтрока = тбСледующиеИсполнители.До  авить();
			НоваяСтрока.ТочкаМаршрута = ИсходящаяТочка;


			НоваяСтрока.ОписаниеТочки  аршрута = "Завершение бизнес-процесса";
		КонецЕсли;

	КонецЦикла;

	Возврат тбСледующиеИсполнители;

КонецФункции





Функция CRM_ПолучитьТаблицуАдресаци  и() Экспорт
	Запрос = Новый Запрос;

	ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Пользователи.Ссылка КАК Пользователь,
	|	НастройкиПользователей.Зн  чение КАК Подразделение,
	|	&ДолжностьПустаяСсылка КАК Должность,
	|	ИСТИНА КАК НеПоказыватьСкрытые
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Настройки  ользователей КАК НастройкиПользователей
	|		ПО (НастройкиПользователей.На  стройка = &НастройкаОсновноеПодразд  ление)
	|			И Пользователи.Ссылка = НастройкиПользователей.По  ьзователь
	|ГДЕ
	|	Пользователи.ЭтоГруппа = Ложь";

	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр(  "НастройкаОсновноеПодразд  ление", ПланыВидовХарактеристик.Н  стройкиПользователей.Осно  вноеПодразделение);
	Запрос.УстановитьПараметр(  "ДолжностьПустаяСсылка", Справочники.ДолжностиОрга  изаций.ПустаяСсылка());

	ТаблицаАдресации = Запрос.Выполнить().Выгрузит  ь();


	Возврат ТаблицаАдресации;

КонецФункции






Процедура CRM_ПроверитьАдресацию(Испо  нитель) Экспорт
	Запрос = Новый Запрос;
	ТекстЗапроса = "ВЫБРАТЬ
	|	CRM_Адресация.Пользователь,
	|	CRM_Адресация.Подразделение,
	|	CRM_Адресация.Должность
	|ИЗ
	|	РегистрСведений.CRM_Адресац  я КАК CRM_Адресация";


	Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда
		ТекстЗапроса = ТекстЗапроса + " ГДЕ CRM_Адресация.Пользователь = &Исполнитель ";
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Долж  остиОрганизаций") Тогда
		ТекстЗапроса = ТекстЗапроса + " ГДЕ CRM_Адресация.Должность = &Исполнитель ";
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Подр  зделения") Тогда
		ТекстЗапроса = ТекстЗапроса + " ГДЕ CRM_Адресация.Подразделение = &Исполнитель ";
	КонецЕсли;

	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр(  "Исполнитель", Исполнитель);


	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();

	Если Выборка.Количество() = 0 Тогда

		МенеджерЗаписи = РегистрыСведений.CRM_Адреса  ия.СоздатьМенеджерЗаписи()  ;

		Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда
			МенеджерЗаписи.Пользовате  ь = Исполнитель;
		ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Долж  остиОрганизаций") Тогда
			МенеджерЗаписи.Должность = Исполнитель;
		ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Подр  зделения") Тогда
			МенеджерЗаписи.Подразделе  ие = Исполнитель;
		КонецЕсли;



		Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда

			ТекстЗапроса = "
			|ВЫБРАТЬ
			|	НастройкиПользователей.Зн  чение КАК Подразделение
			|ИЗ
			|	Справочник.Пользователи КАК Пользователи
			|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ
			|		РегистрСведений.Настройки  ользователей КАК НастройкиПользователей
			|	ПО
			|		НастройкиПользователей.На  тройка = &НастройкаОсновноеПодразд  ление И
			|		Пользователи.Ссылка = НастройкиПользователей.По  ьзователь
			|ГДЕ
			|	НастройкиПользователей.Зн  чение = &ПараметрАдресации
			|";

			Запрос = Новый Запрос;

			Запрос.Текст = ТекстЗапроса;
			Запрос.УстановитьПараметр(  "ПараметрАдресации", Исполнитель);
			Запрос.УстановитьПараметр(  "НастройкаОсновноеПодразд  ление", ПланыВидовХарактеристик.Н  стройкиПользователей.Осно  вноеПодразделение);

			РезультатЗапроса = Запрос.Выполнить().Выбрать()  ;

			Пока РезультатЗапроса.Следующи  () Цикл
				МенеджерЗаписи.Подразделе  ие = РезультатЗапроса.Подразде  ение;
			КонецЦикла;

		КонецЕсли;

		МенеджерЗаписи.НеПоказыва  ьСкрытые = Истина;
		МенеджерЗаписи.Записать();

	КонецЕсли;

КонецПроцедуры













Процедура CRM_ПередСозданиемЗадач(глК  мпонента, БизнесПроцесс, ТочкаМаршрута, ФормируемыеЗадачи, ГрафикОрганизации, ДанныеГрафика, СтандартнаяОбработка) Экспорт
	СтандартнаяОбработка = Ложь;

	Если БизнесПроцесс.Завершен Тогда
		Возврат;
	КонецЕсли;


	_БизнесПроцесс = БизнесПроцесс;
	_Шаблон = _БизнесПроцесс;
	_Точка = ТочкаМаршрута;

	регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ТочкаМаршрута);
	регМаршрутБизнесПроцесса.  рочитать();
	СтрокаМаршрут = регМаршрутБизнесПроцесса.  ыгрузить();



	регИсполнителиТекущейТочк  и = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	регИсполнителиТекущейТочк  и.Отбор.БизнесПроцесс.Уста  овить(_БизнесПроцесс.Ссылк  а);
	регИсполнителиТекущейТочк  и.Отбор.ТочкаМаршрута.Уста  овить(_Точка);
	регИсполнителиТекущейТочк  и.Прочитать();

	Если регИсполнителиТекущейТочк  и.Количество() = 0 Тогда

		Если ЗначениеЗаполнено(_БизнесП  роцесс.Ссылка.ВедущаяЗадач  а) Тогда
			регИсполнителиТекущейТочк  и.Отбор.БизнесПроцесс.Уста  овить(_БизнесПроцесс.Ссылк  а.ВедущаяЗадача.БизнесПроц  есс);
			регИсполнителиТекущейТочк  и.Отбор.ТочкаМаршрута.Уста  овить(_Точка);
			регИсполнителиТекущейТочк  и.Прочитать();
		КонецЕсли;

	КонецЕсли;



	Если регИсполнителиТекущейТочк  и.Количество() > 0 Тогда
		Если СтрокаМаршрут[0].Пометка Тогда
			Если _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда
				СоответствиеИсполнители = Новый Соответствие;
				Для каждого Строка Из регИсполнителиТекущейТочк  и Цикл

					Если ТипЗнч(Строка.Исполнитель) = Тип("Строка") Тогда


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

				Для каждого ЭлементСоответствия Из СоответствиеИсполнители Цикл
					Исполнитель = ЭлементСоответствия.Значе  ие;
					ДобавитьЗадачу(_БизнесПроц  есс, _Точка, ФормируемыеЗадачи, ГрафикОрганизации, ДанныеГрафика, Исполнитель);
				КонецЦикла;

			ИначеЕсли _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда

				НоваяЗадача = Задачи.CRM_Задача.СоздатьЗад  ачу();

				НоваяЗадача.БизнесПроцесс = _БизнесПроцесс;
				НоваяЗадача.Наименование = _Точка.НаименованиеЗадачи;
				НоваяЗадача.ТочкаМаршрута = _Точка;
				НоваяЗадача.ВероятностьУс  ешногоОкончания = СтрокаМаршрут[0].ВероятностьУспешногоОкон  ания;

				НоваяЗадача.Заполнить(Неоп  ределено);

				НоваяЗадача.Дата = ТекущаяДата();
				НоваяЗадача.НеСкрытая = Истина;
				НоваяЗадача.Ведущая = Истина;
				ФормируемыеЗадачи.Добавит  (НоваяЗадача);
			Иначе

				СтандартнаяОбработка = Истина;
				Возврат;
			КонецЕсли;
		ИначеЕсли _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда

			НоваяЗадача = Задачи.CRM_Задача.СоздатьЗад  ачу();

			НоваяЗадача.БизнесПроцесс = _БизнесПроцесс;
			НоваяЗадача.Наименование = _Точка.НаименованиеЗадачи;
			НоваяЗадача.ТочкаМаршрута = _Точка;

			НоваяЗадача.Заполнить(Неоп  ределено);

			НоваяЗадача.Дата = ТекущаяДата();
			НоваяЗадача.НеСкрытая = Ложь;
			НоваяЗадача.Ведущая = Истина;

			НоваяЗадача.НеобходимоВып  лнить = Истина;

			НоваяЗадача.Результат = "Создана и выполнена автоматически: пропущена точка """ + _Точка + """ по шаблону """ + _Шаблон + """";

			ФормируемыеЗадачи.Добавит  (НоваяЗадача);
		Иначе
			Для каждого СтрокаМаршрута Из регМаршрутБизнесПроцесса Цикл
				СтрокаМаршрута.ЭтапЗаверш  н = Истина;
			КонецЦикла;
			регМаршрутБизнесПроцесса.  аписать();
		КонецЕсли;
	Иначе


		Если _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс И СтрокаМаршрут[0].Пометка Тогда
			СтандартнаяОбработка = Истина;
			ДобавитьЗадачу(_БизнесПроц  есс, _Точка, ФормируемыеЗадачи, ГрафикОрганизации, ДанныеГрафика, Исполнитель);
			Возврат;
		ИначеЕсли _Точка.Вид <> ВидТочкиМаршрутаБизнесПро  цесса.Действие И СтрокаМаршрут[0].Пометка Тогда
			СтандартнаяОбработка = Истина;
			Возврат;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры









Процедура CRM_ПриСозданииЗадач(глКомп  нента, БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, ФормируемыеЗадачи, ГрафикРаботыОрганизации, ДанныеГрафика, Отказ) Экспорт
	Если БизнесПроцесс.Завершен Тогда
		Отказ = Истина;
	КонецЕсли;
	Если ФормируемыеЗадачи.Количес  во() > 0 Тогда
		СоздатьЗаписьРегистраБизн  есПроцессов(БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика);
	КонецЕсли;
КонецПроцедуры







Процедура CRM_ПриЗавершении(БизнесПро  есс, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика, Отказ) Экспорт
	Если БизнесПроцесс.Завершен Тогда
		Возврат;
	КонецЕсли;


	Попытка
		Если ВРег(ТочкаМаршрутаБизнесП  оцесса.Имя) = "ИСТИНА" Тогда
			БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Успешно;
		ИначеЕсли ВРег(ТочкаМаршрутаБизнесП  оцесса.Имя) = "ЛОЖЬ" Тогда
			БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Неудачно;
		Иначе

			БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Успешно;
		КонецЕсли;
	Исключение
	КонецПопытки;

	Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) И Не БизнесПроцесс.ВедущаяЗада  а.Выполнена Тогда


		Если БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Неудачно Тогда
			ВедущаяЗадача = БизнесПроцесс.ВедущаяЗада  а.ПолучитьОбъект();
			ВедущаяЗадача.ВариантВыпо  нения = 2;
			ВедущаяЗадача.Записать();





		КонецЕсли;

	КонецЕсли;

	СоздатьЗаписьРегистраБизн  есПроцессов(БизнесПроцесс.  Ссылка, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика, БизнесПроцесс.ВариантЗаве  шения);

КонецПроцедуры







Процедура CRM_ОбработкаВыбораВарианта  (БизнесПроцесс, ТочкаВыбораВарианта, Результат) Экспорт
	ТекстЗапроса = "
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	CRM_РезультатыВыполненияЗад  ач.ВариантВыполнения
	|ИЗ
	|	РегистрСведений.CRM_Результ  тыВыполненияЗадач.СрезПос  ледних(, ТочкаМаршрута В (&ТочкиМаршрута) И БизнесПроцесс = &БизнесПроцесс) КАК CRM_РезультатыВыполненияЗад  ач
	|
	|УПОРЯДОЧИТЬ ПО
	|	CRM_РезультатыВыполненияЗад  ач.Период УБЫВ
	|";

	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;


	МассивПроверяемыхТочек = ТочкаВыбораВарианта.Получ  тьВходящиеТочки();


	МассивПроверяемыхТочек.До  авить(ТочкаВыбораВарианта  );

	Запрос.УстановитьПараметр(  "БизнесПроцесс", БизнесПроцесс.Ссылка);
	Запрос.УстановитьПараметр(  "ТочкиМаршрута", МассивПроверяемыхТочек);

	ЗаписьМаршрута = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьМен  еджерЗаписи();
	ЗаписьМаршрута.БизнесПроц  сс = БизнесПроцесс;
	ЗаписьМаршрута.ТочкаМаршр  та = МассивПроверяемыхТочек[0];
	ЗаписьМаршрута.Прочитать();

	ТаблицаРезультатов = Запрос.Выполнить().Выгрузит  ь();
	Если ТаблицаРезультатов.Количе  тво() = 0 Тогда
		Если ЗаписьМаршрута.Выбран() И Не ЗаписьМаршрута.Пометка Тогда
			Результат = ТочкаВыбораВарианта.Вариа  ты[ЗаписьМаршрута.ВариантВып  лнения];
		Иначе
			Результат = ТочкаВыбораВарианта.Вариа  ты[0];
		КонецЕсли;
	ИначеЕсли ЗаписьМаршрута.Выбран() И Не ЗаписьМаршрута.Пометка Тогда
		Результат = ТочкаВыбораВарианта.Вариа  ты[ЗаписьМаршрута.ВариантВып  лнения];
	Иначе
		Результат = ТочкаВыбораВарианта.Вариа  ты.Получить(ТаблицаРезуль  атов[0].ВариантВыполнения - 1);
	КонецЕсли;

КонецПроцедуры









Процедура CRM_ТочкаМаршрутаПриВыполне  нии(глКомпонента, БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, Задача, Отказ) Экспорт
	МенеджерБизнесПроцессы = РегистрыСведений.CRM_Бизнес  роцессы.СоздатьМенеджерЗа  писи();
	МенеджерБизнесПроцессы.Би  несПроцесс = БизнесПроцесс;
	МенеджерБизнесПроцессы.Те  ущийЭтап = ТочкаМаршрутаБизнесПроцес  са;
	МенеджерБизнесПроцессы.Пр  читать();
	МенеджерБизнесПроцессы.Уд  лить();

КонецПроцедуры









Процедура CRM_ПроверкаУсловия(БизнесП  оцесс, ТочкаМаршрутаБизнесПроцес  са, Результат) Экспорт
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	
	|	CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута КАК ТочкаМаршрута,
	|	//
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(CRM_РезультатыВыполн  нияЗадач.ВариантВыполнени  я, 2) = 1 ТОГДА
	|			Истина
	|		ИНАЧЕ
	|			Ложь
	|	КОНЕЦ КАК Результат
	|
	|ИЗ
	|	РегистрСведений.CRM_Результ  тыВыполненияЗадач.СрезПос  ледних(, БизнесПроцесс = &БизнесПроцесс И ТочкаМаршрута = &ТочкаМаршрута И Итерация = &Итерация) КАК CRM_РезультатыВыполненияЗад  ач
	|
	|СГРУППИРОВАТЬ ПО
	|	CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(CRM_РезультатыВыполн  нияЗадач.ВариантВыполнени  я, 2) = 1 ТОГДА
	|			Истина
	|		ИНАЧЕ
	|			Ложь
	|	КОНЕЦ
	|
	|";

	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;

	Запрос.УстановитьПараметр(  "БизнесПроцесс", БизнесПроцесс.Ссылка);


	МассивПроверяемыхТочек = ТочкаМаршрутаБизнесПроцес  са.ПолучитьВходящиеТочки();


	МассивПроверяемыхТочек.До  авить(ТочкаМаршрутаБизнес  Процесса);

	ЗаписьМаршрута = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьМен  еджерЗаписи();
	ЗаписьМаршрута.БизнесПроц  сс = БизнесПроцесс;
	ЗаписьМаршрута.ТочкаМаршр  та = МассивПроверяемыхТочек[0];
	ЗаписьМаршрута.Прочитать();

	Результат = Истина;
	Если ЗаписьМаршрута.Выбран() И Не ЗаписьМаршрута.Пометка Тогда
		Результат = ?(ЗаписьМаршрута.ВариантВы  олнения = 0, Истина, Ложь);
	Иначе
		Для каждого Точка Из МассивПроверяемыхТочек Цикл

			Итерация = CRM_ПолучитьНомерАктивнойИт  ерации(БизнесПроцесс.Ссылк  а, Точка);

			Запрос.УстановитьПараметр(  "ТочкаМаршрута", Точка);
			Запрос.УстановитьПараметр(  "Итерация", Итерация);

			Выборка = Запрос.Выполнить().Выбрать()  ;
			Пока Выборка.Следующий() Цикл
				Результат = Результат И Выборка.Результат;
			КонецЦикла;

		КонецЦикла;
	КонецЕсли;
КонецПроцедуры








Процедура CRM_ПриСозданииВложенныхБиз  несПроцессов(БизнесПроцес  , ТочкаМаршрутаБизнесПроцес  са, ФормируемыеПроцессы, Отказ) Экспорт
	Перем регМаршрутБизнесПроцесса, СтрокаШаблона;
	регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ТочкаМаршрутаБизнесПр  оцесса);
	регМаршрутБизнесПроцесса.  рочитать();
	СтрокаШаблона = регМаршрутБизнесПроцесса.  ыгрузить();


	Если СтрокаШаблона.Количество() > 0 И СтрокаШаблона[0].Пометка Тогда

		Для каждого _БизнесПроцесс Из ФормируемыеПроцессы Цикл

			_БизнесПроцесс.Дата = _БизнесПроцесс.ВедущаяЗада  ча.Дата;
			_БизнесПроцесс.ДатаАвтоСта  рта = _БизнесПроцесс.ВедущаяЗада  ча.Дата;
			_БизнесПроцесс.Инициатор = ПараметрыСеанса.ТекущийПо  ьзователь;
			_БизнесПроцесс.Шаблон = СтрокаШаблона[0].Шаблон;
			CRM_ЗаполнитьИсполнителейМа  ршрут(_БизнесПроцесс, Неопределено);


			_БизнесПроцесс.Заполнить(_Б  изнесПроцесс.ВедущаяЗадач  .БизнесПроцесс);

			Если ЗначениеЗаполнено(_БизнесП  роцесс.Шаблон) Тогда
				_БизнесПроцесс.мТаблицаФай  лов = CRM_ЗаполнитьТаблицуФайлов(_  БизнесПроцесс.Шаблон);
			КонецЕсли;























		КонецЦикла;
	Иначе


		ФормируемыеПроцессы.Очист  ть();
	КонецЕсли;

КонецПроцедуры





Функция CRM_ПроверитьБизнесПроцессы  ПодчиненныеОбъекту(Объект  сылка, ТипОбъекта) Экспорт
	Перем ОбъектМетаданных, ИмяТаблицы;
	ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип  Объекта);
	Если ОбъектМетаданных = Неопределено Тогда
		Возврат Неопределено;
	ИначеЕсли ОбъектМетаданных.Реквизит  .Найти("Основание") = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	ИмяТаблицы = ОбъектМетаданных.ПолноеИм  ();


	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	Ссылка 
	|ИЗ
	|	[ИмяТаблицы] КАК Таблица
	|ГДЕ
	|	Таблица.Основание = &Ссылка
	|";

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицы);

	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.Текст = ТекстЗапроса;

	ПостроительЗапроса.Параме  ры.Вставить("Ссылка", ОбъектСсылка);

	ПостроительЗапроса.Выполн  ть();

	Результат = ПостроительЗапроса.Резуль  ат;


	Если Не ПостроительЗапроса.Резуль  ат.Пустой() Тогда

		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл

			Если Выборка.Ссылка.Стартован Тогда
				ЕстьСтартованныеБП = Истина;
				Прервать;
			КонецЕсли;

		КонецЦикла;

		Если ЕстьСтартованныеБП = Истина Тогда
			ТекстВопроса = "Уже есть стартованные бизнес процессы, введенные на основании выбранного документа. Продолжить?";
		Иначе
			ТекстВопроса = "Уже есть бизнес процессы, введенные на основании выбранного документа. Продолжить?";
		КонецЕсли;

		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
		Возврат Ответ = КодВозвратаДиалога.Да;
	Иначе
		Возврат Истина;
	КонецЕсли;


КонецФункции






Процедура CRM_ОбработкаТочкиМаршрутаО  бработка(ТочкаМаршрутаБиз  есПроцесса, БизнесПроцесс) Экспорт
	Перем НаборМаршрут, СтрокаШаблона;
	НаборМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	НаборМаршрут.Отбор.БизнесП  роцесс.Установить(БизнесПр  оцесс);
	НаборМаршрут.Отбор.ТочкаМа  ршрута.Установить(ТочкаМар  шрутаБизнесПроцесса);
	НаборМаршрут.Прочитать();

	СтрокаШаблона = НаборМаршрут.Выгрузить();
	Если СтрокаШаблона[0].Пометка Тогда
		Попытка
			Выполнить(СтрокаШаблона[0].ОбработкаДействие.Действи  е);
		Исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры




Процедура CRM_ПолучитьИсполнителейМар  шрут(Объект) Экспорт
	Перем НаборМаршрут, НаборИсполнители;
	НаборМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	НаборМаршрут.Отбор.БизнесП  роцесс.Установить(Объект.С  ылка);
	НаборМаршрут.Прочитать();
	Объект.тбМаршрут = НаборМаршрут.Выгрузить();

	НаборИсполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	НаборИсполнители.Отбор.Биз  несПроцесс.Установить(Объе  кт.Ссылка);
	НаборИсполнители.Прочитат  ();
	Объект.тбИсполнители = НаборИсполнители.Выгрузит  ();

КонецПроцедуры







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

		Объект.тбМаршрут = НаборМаршрут.Выгрузить();


		НаборИсполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();

		Объект.тбИсполнители = НаборИсполнители.Выгрузит  ();


		Если ЗначениеЗаполнено(Объект.Ш  аблон) Тогда
			ПВХШаблонБП = Объект.Шаблон;
		Иначе
			ПВХШаблонБП = ПланыВидовХарактеристик.CRM  _ШаблоныБизнесПроцессов.Со  здатьЭлемент();
			ПВХШаблонБП.ТипЗначения = Новый ОписаниеТипов("БизнесПроце  ссСсылка." + Объект.Метаданные().Имя);
			ПВХШаблонБП.ЗаполнитьМарш  ут();
		КонецЕсли;

		Если Не ЗначениеЗаполнено(Объект.В  едущаяЗадача) Тогда
			Для каждого Строка Из ПВХШаблонБП.Исполнители Цикл
				НоваяСтрока = Объект.тбИсполнители.Добав  ить();
				ЗаполнитьЗначенияСвойств(  оваяСтрока, Строка);
			КонецЦикла;
		Иначе
			НаборИсполнителейВедущего  БП = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
			ПровТочка = "";
			Для каждого Строка Из ПВХШаблонБП.Исполнители Цикл
				Если ПровТочка <> Строка.ТочкаМаршрута Тогда
					НаборИсполнителейВедущего  БП.Отбор.БизнесПроцесс.Уст  новить(Объект.ВедущаяЗада  а.БизнесПроцесс);
					НаборИсполнителейВедущего  БП.Отбор.ТочкаМаршрута.Уст  новить(Строка.ТочкаМаршру  а);
					НаборИсполнителейВедущего  БП.Прочитать();
					Если НаборИсполнителейВедущего  БП.Количество() > 0 Тогда
						Для каждого СтрокаНабора Из НаборИсполнителейВедущего  БП Цикл
							НоваяСтрока = Объект.тбИсполнители.Добав  ить();
							ЗаполнитьЗначенияСвойств(  оваяСтрока, СтрокаНабора, , "БизнесПроцесс");
						КонецЦикла;
						ПровТочка = Строка.ТочкаМаршрута;
						НаборИсполнителейВедущего  БП.Отбор.Сбросить();
						Продолжить;
					Иначе
						НаборИсполнителейВедущего  БП.Отбор.Сбросить();
					КонецЕсли;

					НоваяСтрока = Объект.тбИсполнители.Добав  ить();
					ЗаполнитьЗначенияСвойств(  оваяСтрока, Строка);
				КонецЕсли;
			КонецЦикла;

		КонецЕсли;

		Для каждого Строка Из ПВХШаблонБП.Маршрут Цикл
			НоваяСтрока = Объект.тбМаршрут.Добавить()  ;
			ЗаполнитьЗначенияСвойств(  оваяСтрока, Строка);
			НоваяСтрока.Порядок = Строка.НомерСтроки;

			Если Не (Строка.ТочкаМаршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс) Тогда
				Продолжить;
			КонецЕсли;

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



КонецПроцедуры





Процедура CRM_СохранитьМаршрутИсполни  телей(Объект) Экспорт
	Перем регМаршрут, регИсполнители;
	Если ТипЗнч(Объект.тбМаршрут) = Тип("ТаблицаЗначений") Тогда

		Объект.тбМаршрут.Заполнить  Значения(Объект.Ссылка, "БизнесПроцесс");

		регМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
		регМаршрут.Отбор.БизнесПро  цесс.Установить(Объект.Ссы  ка);

		регИсполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
		регИсполнители.Отбор.Бизне  сПроцесс.Установить(Объект  .Ссылка);


		регМаршрут.Загрузить(Объек  т.тбМаршрут);
		регМаршрут.Записать(Истина  );

		Объект.тбИсполнители.Запол  нитьЗначения(Объект.Ссылка  , "БизнесПроцесс");
		регИсполнители.Загрузить(О  бъект.тбИсполнители);
		регИсполнители.Записать(Ис  тина);


	ИначеЕсли Объект.тбМаршрут <> Неопределено И ТипЗнч(Объект.тбМаршрут) <> Тип("ТаблицаЗначений") Тогда
		Если Объект.тбМаршрут.Модифицир  ованность() Тогда
			Объект.тбМаршрут.Записать()  ;
		КонецЕсли;
		Если Объект.тбИсполнители.Модиф  ицированность() Тогда
			Объект.тбИсполнители.Запис  ать();
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры






Функция CRM_ПолучитьДлительностиЗад  ач(СсылкаБизнесПроцесс) Экспорт
	Перем наборМаршрут, ТабНабор, ИмяБП;
	наборМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	наборМаршрут.Отбор.БизнесП  роцесс.Установить(СсылкаБи  знесПроцесс);
	наборМаршрут.Прочитать();
	ТабНабор = наборМаршрут.Выгрузить();

	ИмяБП = СсылкаБизнесПроцесс.Получ  тьОбъект().Метаданные().Имя;

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	CRM_Задача.Ссылка КАК Задача,
	|	РАЗНОСТЬДАТ(CRM_Задача.Дата, CRM_Задача.ДатаФактического  ыполнения, ЧАС) КАК ФактическаяДлительность,
	|	РАЗНОСТЬДАТ(CRM_Задача.Дата, CRM_Задача.ДатаВыполнения, ЧАС) КАК ПлановаяДлительность
	|ИЗ
	|	Задача.CRM_Задача КАК CRM_Задача
	|ГДЕ
	|	CRM_Задача.Выполнена = ИСТИНА
	|	И CRM_Задача.БизнесПроцесс = &парамБизнесПроцесс";
	Запрос.УстановитьПараметр(  "парамБизнесПроцесс", СсылкаБизнесПроцесс);
	Данные = Запрос.Выполнить().Выгрузит  ь();


	Для каждого СтрокаДанных Из Данные Цикл
		Если СтрокаДанных.Задача.ТочкаМ  аршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда


		ИначеЕсли СтрокаДанных.Задача.ТочкаМ  аршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда
			ФактДлительностьВложенных = 0;
			ПланДлительностьВложенных = 0;
			Запрос = Новый Запрос;
			ТекстЗапроса = "";
			Для каждого ЗначениеПеречисления Из Метаданные.Перечисления.CRM_  ВидыБизнесПроцессов.Значе  ияПеречисления Цикл
				ОбъектМетаданных = Метаданные.БизнесПроцессы[ЗначениеПеречисления.Имя];
				ИмяБП = ОбъектМетаданных.Имя;
				Если ТекстЗапроса <> "" Тогда
					ТекстЗапроса = ТекстЗапроса + "
					|
					|ОБЪЕДИНИТЬ ВСЕ
					|";
				КонецЕсли;
				ТекстЗапроса = ТекстЗапроса + "
				|ВЫБРАТЬ
				|	" + ИмяБП + ".Ссылка
				|ИЗ
				|	БизнесПроцесс." + ИмяБП + " КАК " + ИмяБП + "
				|ГДЕ
				|	" + ИмяБП + ".ВедущаяЗадача = &парамВедущаяЗадача";
			КонецЦикла;
			Запрос.Текст = ТекстЗапроса;
			Запрос.УстановитьПараметр(  "парамВедущаяЗадача", СтрокаДанных.Задача);
			ДанныеВложенного = Запрос.Выполнить().Выгрузит  ь();
			Если ДанныеВложенного.Количест  о() > 0 Тогда
				Для каждого СтрокаДанныеВложенного Из ДанныеВложенного Цикл
					ФДЗ = 0;
					ПДЗ = 0;
					ДлительностьВложенного = CRM_ПолучитьДлительностиЗад  ач(СтрокаДанныеВложенного.  Ссылка);
					ДлительностьВложенного.Св  йство("ФактическаяДлитель  остьЗадач", ФДЗ);
					ДлительностьВложенного.Св  йство("ПланируемаДлительн  стьЗадач", ПДЗ);
					ФактДлительностьВложенных = ФактДлительностьВложенных + ФДЗ;
					ПланДлительностьВложенных = ПланДлительностьВложенных + ПДЗ;
				КонецЦикла;
			КонецЕсли;
			СтрокаДанных.ФактическаяД  ительность = ФактДлительностьВложенных  ;
			СтрокаДанных.ПлановаяДлит  льность = ПланДлительностьВложенных  ;
		КонецЕсли;
	КонецЦикла;

	Возврат Новый Структура("ФактическаяДлит  ельностьЗадач, ПланируемаДлительностьЗад  ач", Данные.Итог("ФактическаяДл  тельность"), Данные.Итог("ПлановаяДлите  ьность"));

КонецФункции



Функция CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(СтруктураПар  метров) Экспорт
	Перем ДатаБП, ПланируемаяДатаЗавершения  , Конец, Исполнитель, ВсегоДлительность, ТабПройденыхТочек, ВариантВыполнения, ДлительностьТочек;
	ИсходящаяТочка = СтруктураПараметров.Исход  щаяТочка;
	Шаблон = СтруктураПараметров.Шабло  ;
	ТабИсполнителей = СтруктураПараметров.ТабИс  олнителей;
	БизнесПроцесс = СтруктураПараметров.Бизне  Процесс;
	ИнициаторБизнесПроцесса = СтруктураПараметров.Иници  торБизнесПроцесса;
	ГрафикРаботы = СтруктураПараметров.Графи  Работы;
	ДанныеГрафика = СтруктураПараметров.Данны  Графика;
	ДлительностьТочек = СтруктураПараметров.Дерев  Маршрута;
	ДатаСтарта = СтруктураПараметров.ДатаС  арта;
	ЭтоВложенный = СтруктураПараметров.ЭтоВл  женный;

	Если Не (БизнесПроцесс = Неопределено) Тогда
		Если БизнесПроцесс.ДатаАвтоСта  та <> '00010101000000' И НачалоДня(БизнесПроцесс.Да  таАвтоСтарта) <> НачалоДня(БизнесПроцесс.Да  та) Тогда
			ДатаБП = БизнесПроцесс.ДатаАвтоСта  та;
			ПланируемаяДатаЗавершения = БизнесПроцесс.ДатаАвтоСта  та;
		ИначеЕсли БизнесПроцесс.ДатаАвтоСта  та <> '00010101000000' И НачалоДня(БизнесПроцесс.Да  таАвтоСтарта) = НачалоДня(БизнесПроцесс.Да  та) Или БизнесПроцесс.ДатаАвтоСта  та <> '00010101000000' Тогда

			ДатаБП = БизнесПроцесс.Дата;
			ПланируемаяДатаЗавершения = БизнесПроцесс.Дата;
		ИначеЕсли БизнесПроцесс.ДатаАвтоСта  та = '00010101000000' Тогда
			ДатаБП = БизнесПроцесс.Дата;
			ПланируемаяДатаЗавершения = БизнесПроцесс.Дата;
		КонецЕсли;
	Иначе
		ДатаБП = ДатаСтарта;
		ПланируемаяДатаЗавершения = ДатаСтарта;
	КонецЕсли;

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


	Конец = Ложь;
	ВсегоДлительность = 0;
	ТабПройденыхТочек = Новый ТаблицаЗначений;
	ТабПройденыхТочек.Колонки.  Добавить("Точка");

	Если Не ЭтоВложенный Тогда
		ТекущаяСтрокаДереваТочек = ДлительностьТочек.Строки.Д  обавить();
		ТекущаяСтрокаДереваТочек.  очкаМаршрута = "Бизнес-процесс";
		ТекущаяСтрокаДереваТочек.  атаНачала = ДатаБП;
		ТекущаяСтрокаДереваТочек.  ходящаяДата = ДатаБП;
	Иначе
		ТекущаяСтрокаДереваТочек = ДлительностьТочек;
	КонецЕсли;

	Пока Не Конец Цикл
		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда

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

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда
			СтрокаМаршрута = Шаблон.Найти(ИсходящаяТочк  а, "ТочкаМаршрута");
			Если СтрокаМаршрута.Пометка Тогда




				СтруктураДат = CRM_ПолучитьДатуИДатуВыполн  енияЗадачи(СтрокаМаршрута, ГрафикРаботы, ДанныеГрафика, ПланируемаяДатаЗавершения  );
				СтруктураДат.Свойство("Дат  Завершения", ПланируемаяДатаЗавершения  );

				ОтложеноНа = СтруктураДат.Длительность  тложено;
				ДлительностьВЧасах = СтруктураДат.Длительность  адачи;
				ВсегоДлительность = ВсегоДлительность + ДлительностьВЧасах + ОтложеноНа;

				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

				НоваяСтрокаДерева = ТекущаяСтрокаДереваТочек.  троки.Добавить();
				НоваяСтрокаДерева.ТочкаМа  шрута = ИсходящаяТочка;
				НоваяСтрокаДерева.Длитель  остьТочки = ДлительностьВЧасах;
				НоваяСтрокаДерева.Длитель  остьОтложено = ОтложеноНа;
				НоваяСтрокаДерева.Входяща  Дата = СтруктураДат.ВходящаяДата;
				НоваяСтрокаДерева.ДатаНач  ла = СтруктураДат.Дата;
				НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  ;

				Если Не ЗначениеЗаполнено(Текущая  трокаДереваТочек.ДатаНача  ла) Тогда
					ТекущаяСтрокаДереваТочек.  атаНачала = СтруктураДат.Дата;
					ТекущаяСтрокаДереваТочек.  ходящаяДата = СтруктураДат.Дата;
				КонецЕсли;
			Иначе
				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
			КонецЕсли;
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда
			СтрокаМаршрута = Шаблон.Найти(ИсходящаяТочк  а, "ТочкаМаршрута");
			Если СтрокаМаршрута.Пометка Тогда

				НоваяСтрокаДерева = ТекущаяСтрокаДереваТочек.  троки.Добавить();
				НоваяСтрокаДерева.ТочкаМа  шрута = ИсходящаяТочка;

				ИмяБизнесПроцесса = Метаданные.НайтиПоТипу(Стр  окаМаршрута.Шаблон.ТипЗнач  ения.Типы()[0]).Имя;

				ШаблонВложенного = СтрокаМаршрута.Шаблон.Марш  рут.Выгрузить();
				ИсполнителиВложенного = СтрокаМаршрута.Шаблон.Испо  лнители.Выгрузить();
				ИсходящаяТочкаВложенного = БизнесПроцессы[ИмяБизнесПроцесса].ТочкиМаршрута.Старт;
				ИсходящаяТочкаВложенного = ИсходящаяТочкаВложенного.  олучитьИсходящуюТочку();

				ВложенныйБизнесПроцессПар  аметры = Новый Структура;
				ВложенныйБизнесПроцессПар  аметры.Вставить("Исходящая  очка", ИсходящаяТочкаВложенного);
				ВложенныйБизнесПроцессПар  аметры.Вставить("Шаблон", ШаблонВложенного);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ТабИсполн  телей", ИсполнителиВложенного);
				ВложенныйБизнесПроцессПар  аметры.Вставить("БизнесПро  есс", БизнесПроцесс);
				ВложенныйБизнесПроцессПар  аметры.Вставить("Инициатор  изнесПроцесса", ИнициаторБизнесПроцесса);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ГрафикРаб  ты", ГрафикРаботы);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ДанныеГра  ика", ДанныеГрафика);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ДеревоМар  рута", НоваяСтрокаДерева);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ДатаСтарт  ", ПланируемаяДатаЗавершения  );
				ВложенныйБизнесПроцессПар  аметры.Вставить("ЭтоВложен  ый", Истина);

				СруктураВложенногоБП = CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(ВложенныйБиз  есПроцессПараметры);
				ВсегоДлительность = ВсегоДлительность + СруктураВложенногоБП.Длит  льность;

				НоваяСтрокаДерева.Длитель  остьТочки = СруктураВложенногоБП.Длит  льность;
				НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = СруктураВложенногоБП.Дата;

				ПланируемаяДатаЗавершения = СруктураВложенногоБП.Дата;
			КонецЕсли;
			ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;


		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку(?(ВариантВыпол  нения = 0, Истина, Ложь));
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку(ИсходящаяТочк  а.Варианты[ВариантВыполнения]);
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Разделение Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящиеТочки();

			НоваяСтрокаДерева = ТекущаяСтрокаДереваТочек.  троки.Добавить();
			НоваяСтрокаДерева.ТочкаМа  шрута = "Разделение";

			СтруктураДляРазделения = Новый Структура;
			СтруктураДляРазделения.Вс  авить("ИсходящаяТочка", ИсходящаяТочка);
			СтруктураДляРазделения.Вс  авить("Шаблон", Шаблон);
			СтруктураДляРазделения.Вс  авить("ТабИсполнителей", ТабИсполнителей);
			СтруктураДляРазделения.Вс  авить("БизнесПроцесс", БизнесПроцесс);
			СтруктураДляРазделения.Вс  авить("ИнициаторБизнесПро  есса", ИнициаторБизнесПроцесса);
			СтруктураДляРазделения.Вс  авить("ГрафикРаботы", ГрафикРаботы);
			СтруктураДляРазделения.Вс  авить("ДанныеГрафика", ДанныеГрафика);
			СтруктураДляРазделения.Вс  авить("ДеревоМаршрута", НоваяСтрокаДерева);
			СтруктураДляРазделения.Вс  авить("ПланируемаяДатаЗав  ршения", ПланируемаяДатаЗавершения  );



			ТаблицаТочек = ПолучитьДлительностьРазде  ления(СтруктураДляРазделе  ия);
			ТаблицаТочек.Сортировать("  лительность Убыв");

			ВсегоДлительность = ВсегоДлительность + ТаблицаТочек[0].Длительность;
			ПланируемаяДатаЗавершения = ТаблицаТочек[0].ПланируемаяДатаЗавершени  ;

			НоваяСтрокаДерева.Длитель  остьТочки = ТаблицаТочек[0].Длительность;
			НоваяСтрокаДерева.Длитель  остьОтложено = ТаблицаТочек[0].ДлительностьОтложено;
			НоваяСтрокаДерева.Входяща  Дата = ТаблицаТочек[0].ВходящаяДата;
			НоваяСтрокаДерева.ДатаНач  ла = ТаблицаТочек[0].ДатаНачала;
			НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  ;

			Если ТаблицаТочек[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
				ИсходящаяТочка = ТаблицаТочек[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(?(ТаблицаТоче  [0].ВариантИсходящейТочки = 0, Истина, Ложь));
				Продолжить;
			ИначеЕсли ТаблицаТочек[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
				ИсходящаяТочка = ТаблицаТочек[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(ТаблицаТочек[0].ИсходящаяТочка.Варианты[ТаблицаТочек[0].ВариантИсходящейТочки]);
				Продолжить;
			Иначе
				ИсходящаяТочка = ТаблицаТочек[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку();
				Продолжить;
			КонецЕсли;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Слияние Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Обработка Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Завершение Тогда
			Конец = Истина;
			Продолжить;
		КонецЕсли;
	КонецЦикла;

	Если Не ЭтоВложенный Тогда
		ТекущаяСтрокаДереваТочек.  лительностьТочки = ВсегоДлительность;
		ТекущаяСтрокаДереваТочек.  жидаемаяДатаЗавершения = ПланируемаяДатаЗавершения  ;
	КонецЕсли;

	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставит  ("Длительность", ВсегоДлительность);
	СтруктураВозврата.Вставит  ("Дата", ПланируемаяДатаЗавершения  );
	СтруктураВозврата.Вставит  ("ДеревоТочек", ДлительностьТочек);

	Возврат СтруктураВозврата;

КонецФункции




Функция ПолучитьДлительностьРазде  ления(СтруктураПараметров)
	Перем ВариантВыполнения, ДатаСтартаРзаделения;
	ИсходящаяТочка = СтруктураПараметров.Исход  щаяТочка;
	Шаблон = СтруктураПараметров.Шабло  ;
	ИсполнителиТочек = СтруктураПараметров.ТабИс  олнителей;
	БизнесПроцесс = СтруктураПараметров.Бизне  Процесс;
	ИнициаторБизнесПроцесса = СтруктураПараметров.Иници  торБизнесПроцесса;
	ГрафикРаботы = СтруктураПараметров.Графи  Работы;
	ДанныеГрафика = СтруктураПараметров.Данны  Графика;
	ДлительностьТочек = СтруктураПараметров.Дерев  Маршрута;
	ДатаСтартаРзаделения = СтруктураПараметров.Плани  уемаяДатаЗавершения;

	ТаблицаТочек = Новый ТаблицаЗначений;
	ТаблицаТочек.Колонки.Добав  ить("ВходящаяДата");
	ТаблицаТочек.Колонки.Добав  ить("ДлительностьОтложено")  ;
	ТаблицаТочек.Колонки.Добав  ить("ДатаНачала");
	ТаблицаТочек.Колонки.Добав  ить("ИсходящаяТочка");
	ТаблицаТочек.Колонки.Добав  ить("ВариантИсходящейТочки  ");
	ТаблицаТочек.Колонки.Добав  ить("Длительность");
	ТаблицаТочек.Колонки.Добав  ить("ПланируемаяДатаЗаверш  ения");

	Для Индекс = 0 По ИсходящаяТочка.ВГраница() Цикл
		ПланируемаяДатаЗавершения  Ветки = ДатаСтартаРзаделения;
		ДлительностьВетки = 0;
		ТочкаМассива = ИсходящаяТочка[Индекс];

		СтрокаВетки = ДлительностьТочек.Строки.Д  обавить();
		СтрокаВетки.ТочкаМаршрута = "Ветка " + (Индекс + 1);

		НоваяСтрока = ТаблицаТочек.Добавить();

		Пока ТочкаМассива.Вид <> ВидТочкиМаршрутаБизнесПро  цесса.Слияние Цикл
			ПредТочкаМассива = ТочкаМассива;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда

				СтрокаМаршрута = Шаблон.Найти(ТочкаМассива, "ТочкаМаршрута");
				Если СтрокаМаршрута.Пометка Тогда



					ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

					СтруктураДат = CRM_ПолучитьДатуИДатуВыполн  енияЗадачи(СтрокаМаршрута, ГрафикРаботы, ДанныеГрафика, ПланируемаяДатаЗавершения  Ветки);
					СтруктураДат.Свойство("Дат  Завершения", ПланируемаяДатаЗавершения  Ветки);

					ОтложеноНа = СтруктураДат.Длительность  тложено;
					ДлительностьВЧасах = СтруктураДат.Длительность  адачи;
					ДлительностьВетки = ДлительностьВетки + ДлительностьВЧасах + ОтложеноНа;

					ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

					НоваяСтрокаДерева = СтрокаВетки.Строки.Добавит  ь();
					НоваяСтрокаДерева.ТочкаМа  шрута = ТочкаМассива;
					НоваяСтрокаДерева.Длитель  остьТочки = ДлительностьВЧасах;
					НоваяСтрокаДерева.Длитель  остьОтложено = ОтложеноНа;
					НоваяСтрокаДерева.Входяща  Дата = СтруктураДат.ВходящаяДата;
					НоваяСтрокаДерева.ДатаНач  ла = СтруктураДат.Дата;
					НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  Ветки;

					Если Не ЗначениеЗаполнено(СтрокаВ  тки.ДатаНачала) Тогда
						СтрокаВетки.ДатаНачала = СтруктураДат.Дата;
						СтрокаВетки.ВходящаяДата = СтруктураДат.ВходящаяДата;
					КонецЕсли;

					Если Не ЗначениеЗаполнено(НоваяСт  ока.ВходящаяДата) Тогда
						НоваяСтрока.ВходящаяДата = СтруктураДат.ВходящаяДата;
						НоваяСтрока.ДлительностьО  ложено = ОтложеноНа;
						НоваяСтрока.ДатаНачала = СтруктураДат.Дата;
					КонецЕсли;
				Иначе
					ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
				КонецЕсли;
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку();
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда
				СтрокаМаршрута = Шаблон.Найти(ТочкаМассива, "ТочкаМаршрута");
				Если СтрокаМаршрута.Пометка Тогда

					НоваяСтрокаДерева = СтрокаВетки.Строки.Добавит  ь();
					НоваяСтрокаДерева.ТочкаМа  шрута = ТочкаМассива;

					ИмяБизнесПроцесса = Метаданные.НайтиПоТипу(Стр  окаМаршрута.Шаблон.ТипЗнач  ения.Типы()[0]).Имя;

					ШаблонВложенного = СтрокаМаршрута.Шаблон.Марш  рут.Выгрузить();
					ИсполнителиВложенного = СтрокаМаршрута.Шаблон.Испо  лнители.Выгрузить();
					ИсходящаяТочкаВложенного = БизнесПроцессы[ИмяБизнесПроцесса].ТочкиМаршрута.Старт;
					ИсходящаяТочкаВложенного = ИсходящаяТочкаВложенного.  олучитьИсходящуюТочку();

					ВложенныйБизнесПроцессПар  аметры = Новый Структура;
					ВложенныйБизнесПроцессПар  аметры.Вставить("Исходящая  очка", ИсходящаяТочкаВложенного);
					ВложенныйБизнесПроцессПар  аметры.Вставить("Шаблон", ШаблонВложенного);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ТабИсполн  телей", ИсполнителиВложенного);
					ВложенныйБизнесПроцессПар  аметры.Вставить("БизнесПро  есс", БизнесПроцесс);
					ВложенныйБизнесПроцессПар  аметры.Вставить("Инициатор  изнесПроцесса", ИнициаторБизнесПроцесса);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ГрафикРаб  ты", ГрафикРаботы);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ДанныеГра  ика", ДанныеГрафика);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ДеревоМар  рута", НоваяСтрокаДерева);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ДатаСтарт  ", ПланируемаяДатаЗавершения  Ветки);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ЭтоВложен  ый", Истина);

					СруктураВложенногоБП = CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(ВложенныйБиз  есПроцессПараметры);

					ДлительностьВетки = ДлительностьВетки + СруктураВложенногоБП.Длит  льность;

					НоваяСтрокаДерева.Длитель  остьТочки = СруктураВложенногоБП.Длит  льность;
					НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = СруктураВложенногоБП.Дата;

					ПланируемаяДатаЗавершения  Ветки = СруктураВложенногоБП.Дата;
				КонецЕсли;
				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку();
				Продолжить;
			КонецЕсли;
			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку(?(ВариантВыполне  ния = 0, Истина, Ложь));
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Обработка Тогда
				СтрокаМаршрута = Шаблон.Найти(ТочкаМассива, "ТочкаМаршрута");

				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку();
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку(ТочкаМассива.Ва  ианты[ВариантВыполнения]);
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Разделение Тогда
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящиеТочки();

				НоваяСтрокаДерева = СтрокаВетки.Строки.Добавит  ь();
				НоваяСтрокаДерева.ТочкаМа  шрута = "Разделение";

				СтруктураДляРазделения = Новый Структура;
				СтруктураДляРазделения.Вс  авить("ИсходящаяТочка", ТочкаМассива);
				СтруктураДляРазделения.Вс  авить("Шаблон", Шаблон);
				СтруктураДляРазделения.Вс  авить("ТабИсполнителей", ИсполнителиТочек);
				СтруктураДляРазделения.Вс  авить("БизнесПроцесс", БизнесПроцесс);
				СтруктураДляРазделения.Вс  авить("ИнициаторБизнесПро  есса", ИнициаторБизнесПроцесса);
				СтруктураДляРазделения.Вс  авить("ГрафикРаботы", ГрафикРаботы);
				СтруктураДляРазделения.Вс  авить("ДанныеГрафика", ДанныеГрафика);
				СтруктураДляРазделения.Вс  авить("ДеревоМаршрута", НоваяСтрокаДерева);
				СтруктураДляРазделения.Вс  авить("ПланируемаяДатаЗав  ршения", ПланируемаяДатаЗавершения  Ветки);



				ТаблицаТочекМассива = ПолучитьДлительностьРазде  ления(СтруктураДляРазделе  ия);

				ТаблицаТочекМассива.Сорти  овать("Длительность Убыв");
				ДлительностьВетки = ДлительностьВетки + ТаблицаТочекМассива[0].Длительность;
				ПланируемаяДатаЗавершения  Ветки = ТаблицаТочекМассива[0].ПланируемаяДатаЗавершени  ;

				НоваяСтрокаДерева.Длитель  остьТочки = ТаблицаТочекМассива[0].Длительность;
				НоваяСтрокаДерева.Длитель  остьОтложено = ТаблицаТочекМассива[0].ДлительностьОтложено;
				НоваяСтрокаДерева.Входяща  Дата = ТаблицаТочекМассива[0].ВходящаяДата;
				НоваяСтрокаДерева.ДатаНач  ла = ТаблицаТочекМассива[0].ДатаНачала;
				НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  Ветки;

				Если ТаблицаТочекМассива[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
					СтрокаМаршрута = Шаблон.Найти(ТаблицаТочек[0], "ТочкаМаршрута");
					ТочкаМассива = ТаблицаТочекМассива[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(?(СтрокаМаршр  та.ВариантВыполнения = 0, Истина, Ложь));
					Продолжить;
				ИначеЕсли ТаблицаТочекМассива[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
					СтрокаМаршрута = Шаблон.Найти(ТаблицаТочек[0], "ТочкаМаршрута");
					ТочкаМассива = ТаблицаТочекМассива[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(ТаблицаТочек  ассива[0].ИсходящаяТочка.Варианты[СтрокаМаршрута.ВариантВып  лнения]);
					Продолжить;
				Иначе
					ТочкаМассива = ТаблицаТочекМассива[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку();
					Продолжить;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;


		НоваяСтрока.ИсходящаяТочк   = ПредТочкаМассива;
		НоваяСтрока.ВариантИсходя  ейТочки = ВариантВыполнения;
		НоваяСтрока.Длительность = ДлительностьВетки;
		НоваяСтрока.ПланируемаяДа  аЗавершения = ПланируемаяДатаЗавершения  Ветки;

		СтрокаВетки.ДлительностьТ  чки = ДлительностьВетки;
		СтрокаВетки.ОжидаемаяДата  авершения = ПланируемаяДатаЗавершения  Ветки;
	КонецЦикла;

	Возврат ТаблицаТочек;

КонецФункции
































Функция Удалить_СRM_ПолучитьПланиру  емаяДатаЗавершенияИДлител  ьностьБизнесПроцесса(ТабД  ительностейТочек, ИсходящаяТочка, Шаблон, ТабИсполнителей, БизнесПроцесс, ГрафикРаботы, ДанныеГрафика) Экспорт
КонецФункции







Процедура СоздатьЗаписьРегистраБизн  есПроцессов(БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика, ВариантЗавершения = Неопределено) Экспорт
	МенеджерБизнесПроцессы = РегистрыСведений.CRM_Бизнес  роцессы.СоздатьМенеджерЗа  писи();
	МенеджерБизнесПроцессы.Би  несПроцесс = БизнесПроцесс;
	МенеджерБизнесПроцессы.Те  ущийЭтап = БизнесПроцессы[БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя].ТочкиМаршрута.Старт;
	МенеджерБизнесПроцессы.Пр  читать();

	ИмяБП = БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя;

	ДлительностьЗадачПлановая  Фактическая = CRM_ПолучитьДлительностиЗад  ач(БизнесПроцесс);
	ДлительностьЗадачПлановая = 0;
	ДлительностьЗадачФактичес  кая = 0;
	ДлительностьЗадачПлановая  Фактическая.Свойство("Факт  ческаяДлительностьЗадач", ДлительностьЗадачФактичес  кая);
	ДлительностьЗадачПлановая  Фактическая.Свойство("План  руемаДлительностьЗадач", ДлительностьЗадачПлановая  );


	НаборМаршрута = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	НаборМаршрута.Отбор.Бизнес  Процесс.Установить(БизнесП  роцесс);
	НаборМаршрута.Прочитать();
	Шаблон = НаборМаршрута.Выгрузить();

	ИсполнителиТочекМаршрута = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	ИсполнителиТочекМаршрута.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	ИсполнителиТочекМаршрута.  рочитать();
	ТабИсполнителей = ИсполнителиТочекМаршрута.  ыгрузить();

	ИсходящаяТочка = БизнесПроцессы[БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя].ТочкиМаршрута.Старт;
	ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();



	ТабДлительностейТочек = Новый ТаблицаЗначений;
	ТабДлительностейТочек.Кол  нки.Добавить("СтрокаМаршру  та");
	ТабДлительностейТочек.Кол  нки.Добавить("ГрафикПользо  вателя", Новый ОписаниеТипов("СправочникС  сылка.CRM_ГрафикиРаботы"));
	ТабДлительностейТочек.Кол  нки.Добавить("ДанныеГрафик  а");

	ДлительностьБизнесПроцесс  а = 0;
	ПланируемаяДатаЗавершения = Дата('00010101000000');

	Если Не БизнесПроцесс.Шаблон.НеРас  читыватьДлительность Тогда

		БизнесПроцессПараметры = Новый Структура;
		БизнесПроцессПараметры.Вс  авить("ИсходящаяТочка", ИсходящаяТочка);
		БизнесПроцессПараметры.Вс  авить("Шаблон", Шаблон);
		БизнесПроцессПараметры.Вс  авить("ТабИсполнителей", ТабИсполнителей);
		БизнесПроцессПараметры.Вс  авить("БизнесПроцесс", БизнесПроцесс);
		БизнесПроцессПараметры.Вс  авить("ИнициаторБизнесПро  есса", Неопределено);
		БизнесПроцессПараметры.Вс  авить("ГрафикРаботы", ГрафикРаботыОрганизации);
		БизнесПроцессПараметры.Вс  авить("ДанныеГрафика", ДанныеГрафика);
		БизнесПроцессПараметры.Вс  авить("ДеревоМаршрута", Неопределено);
		БизнесПроцессПараметры.Вс  авить("ДатаСтарта", ТекущаяДата());
		БизнесПроцессПараметры.Вс  авить("ЭтоВложенный", Ложь);

		СтруктураДанных = CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(БизнесПроцес  Параметры);


		СтруктураДанных.Свойство("  лительность", ДлительностьБизнесПроцесс  а);
		Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.CRM  _Поручение") Тогда
			ПланируемаяДатаЗавершения = ?(БизнесПроцесс.ДатаКонтро  я <> Дата('00010101000000'), БизнесПроцесс.ДатаКонтрол  , БизнесПроцесс.ДатаВыполне  ия);
		Иначе
			СтруктураДанных.Свойство("  ата", ПланируемаяДатаЗавершения  );
		КонецЕсли;

	КонецЕсли;

	МенеджерБизнесПроцессы.Би  несПроцесс = БизнесПроцесс;
	МенеджерБизнесПроцессы.Те  ущийЭтап = ТочкаМаршрутаБизнесПроцес  са;


	МенеджерБизнесПроцессы.На  менование = БизнесПроцесс.Наименовани  ;
	МенеджерБизнесПроцессы.Би  несПроцессРодитель = ?(ЗначениеЗаполнено(Бизнес  роцесс.ВедущаяЗадача), БизнесПроцесс.ВедущаяЗада  а.БизнесПроцесс, Неопределено);
	МенеджерБизнесПроцессы.Ви   = Перечисления.CRM_ВидыБизнес  роцессов[БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя];
	МенеджерБизнесПроцессы.Да  а = БизнесПроцесс.Дата;
	МенеджерБизнесПроцессы.Да  аСтарта = БизнесПроцесс.ДатаАвтоСта  та;
	МенеджерБизнесПроцессы.Но  ер = БизнесПроцесс.Номер;
	МенеджерБизнесПроцессы.Ко  трагент = БизнесПроцесс.Контрагент;
	МенеджерБизнесПроцессы.Ко  тактноеЛицоКонтрагента = БизнесПроцесс.КонтактноеЛ  цоКонтрагента;
	МенеджерБизнесПроцессы.От  етственный = БизнесПроцесс.Ответственн  й;
	МенеджерБизнесПроцессы.Ин  циатор = БизнесПроцесс.Инициатор;
	Если ЕстьРеквизитДокумента("Про  ект", БизнесПроцесс.ПолучитьОбъ  кт().Метаданные()) Тогда
		МенеджерБизнесПроцессы.Пр  ект = БизнесПроцесс.Проект;
	КонецЕсли;
	Если ЕстьРеквизитДокумента("Важ  ность", БизнесПроцесс.ПолучитьОбъ  кт().Метаданные()) Тогда
		МенеджерБизнесПроцессы.Ва  ность = БизнесПроцесс.Важность;
	КонецЕсли;
	МенеджерБизнесПроцессы.Ша  лон = БизнесПроцесс.Шаблон;



	МенеджерБизнесПроцессы.Дл  тельностьПлановая = ДлительностьЗадачПлановая  ;
	МенеджерБизнесПроцессы.Дл  тельностьФактическая = ДлительностьЗадачФактичес  кая;
	МенеджерБизнесПроцессы.От  лонение = ДлительностьЗадачФактичес  кая - ДлительностьЗадачПлановая  ;
	МенеджерБизнесПроцессы.Ст  ртован = БизнесПроцесс.Стартован;
	МенеджерБизнесПроцессы.Пл  нируемаяДатаЗавершения = ПланируемаяДатаЗавершения  ;
	МенеджерБизнесПроцессы.За  ершен = БизнесПроцесс.Завершен;
	МенеджерБизнесПроцессы.За  ершенДосрочно = БизнесПроцесс.ЗавершенДос  очно;
	МенеджерБизнесПроцессы.По  еткаУдаления = БизнесПроцесс.ПометкаУдал  ния;
	МенеджерБизнесПроцессы.За  исать();

	Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда
		CRM_УстановитьДатыВедущейЗа  дачи(БизнесПроцесс.Ведущая  Задача, ПланируемаяДатаЗавершения  , Неопределено);
	КонецЕсли;

КонецПроцедуры














































































































































































































































































































Функция CRM_ПолучитьИсполнителя(глК  мпонента, Знач Исполнитель, Знач БизнесПроцесс, Знач ТочкаМаршрута, Знач ЗначениеВыбораВариантаБП = Неопределено)
	Если Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.Инициатор Тогда

		Возврат БизнесПроцесс.Инициатор;

	ИначеЕсли Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.Ответственный Тогда

		Возврат БизнесПроцесс.Ответственн  й;

	ИначеЕсли Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.ИсполнительПре  дыдущейЗадачи Тогда

















		Если Не ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда

			ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
			|	РезультатыВыполненияЗадач  .Исполнитель КАК Исполнитель,
			|	РезультатыВыполненияЗадач  .Период КАК Период,
			|	0 КАК Порядок,
			|	РезультатыВыполненияЗадач  .БизнесПроцесс,
			|	РезультатыВыполненияЗадач  .ТочкаМаршрута
			|ИЗ
			|	РегистрСведений.CRM_Результ  тыВыполненияЗадач КАК РезультатыВыполненияЗадач
			|ГДЕ
			|	РезультатыВыполненияЗадач  .БизнесПроцесс = &БизнесПроцесс
			|	И РезультатыВыполненияЗадач  .ТочкаМаршрута <> &ТочкаМаршрута
			|	И РезультатыВыполненияЗадач  .Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользо  ватели.ПустаяСсылка)
			|
			|УПОРЯДОЧИТЬ ПО
			|	Период УБЫВ";

			ПостроительЗапроса = Новый ПостроительЗапроса;
			ПостроительЗапроса.Текст = ТекстЗапроса;

			ПостроительЗапроса.Параме  ры.Вставить("БизнесПроцесс  ", БизнесПроцесс);
			ПостроительЗапроса.Параме  ры.Вставить("ТочкаМаршрута  ", ТочкаМаршрута);
		Иначе
			ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
			|	РезультатыВыполненияЗадач  .Исполнитель КАК Исполнитель,
			|	РезультатыВыполненияЗадач  .Период КАК Период,
			|	0 КАК Порядок,
			|	РезультатыВыполненияЗадач  .БизнесПроцесс,
			|	РезультатыВыполненияЗадач  .ТочкаМаршрута
			|ИЗ
			|	РегистрСведений.CRM_Результ  тыВыполненияЗадач КАК РезультатыВыполненияЗадач
			|ГДЕ
			|	РезультатыВыполненияЗадач  .БизнесПроцесс = &БизнесПроцесс
			|	И РезультатыВыполненияЗадач  .ТочкаМаршрута <> &ТочкаМаршрута
			|	И РезультатыВыполненияЗадач  .Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользо  ватели.ПустаяСсылка)
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ ПЕРВЫЕ 1
			|	CRM_РезультатыВыполненияЗад  ач.Исполнитель,
			|	CRM_РезультатыВыполненияЗад  ач.Период,
			|	1,
			|	CRM_РезультатыВыполненияЗад  ач.БизнесПроцесс,
			|	CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута
			|ИЗ
			|	РегистрСведений.CRM_Результ  тыВыполненияЗадач КАК CRM_РезультатыВыполненияЗад  ач
			|ГДЕ
			|	CRM_РезультатыВыполненияЗад  ач.БизнесПроцесс = &ВедущийБизнесПроцесс
			|	И CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута <> &ВедущаяТочкаМаршрута
			|	И CRM_РезультатыВыполненияЗад  ач.Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользо  ватели.ПустаяСсылка)
			|
			|УПОРЯДОЧИТЬ ПО
			|	Порядок УБЫВ,
			|	Период";

			ПостроительЗапроса = Новый ПостроительЗапроса;
			ПостроительЗапроса.Текст = ТекстЗапроса;

			ПостроительЗапроса.Параме  ры.Вставить("БизнесПроцесс  ", БизнесПроцесс);
			ПостроительЗапроса.Параме  ры.Вставить("ТочкаМаршрута  ", ТочкаМаршрута);
			ПостроительЗапроса.Параме  ры.Вставить("ВедущийБизнес  Процесс", БизнесПроцесс.ВедущаяЗада  а.БизнесПроцесс);
			ПостроительЗапроса.Параме  ры.Вставить("ВедущаяТочкаМ  аршрута", БизнесПроцесс.ВедущаяЗада  а.ТочкаМаршрута);
		КонецЕсли;

		ПостроительЗапроса.Выполн  ть();
		Выборка = ПостроительЗапроса.Резуль  ат.Выбрать();
		Пока Выборка.Следующий() Цикл
			Исполнитель = Выборка.Исполнитель;
		КонецЦикла;

		Если Не ЗначениеЗаполнено(Исполни  ель) Или Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.ИсполнительПре  дыдущейЗадачи Тогда
			Исполнитель = ПараметрыСеанса.ТекущийПо  ьзователь;
		КонецЕсли;

		Возврат Исполнитель;
	Иначе
		Возврат Исполнитель;
	КонецЕсли;

КонецФункции











Функция ПолучитьИсполнителей(Бизн  сПроцесс, ТочкаМаршрута, ВедущаяТочка)
	Перем Исполнители;
	Исполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс);
	Исполнители.Отбор.ТочкаМар  шрута.Установить(ТочкаМарш  рута);
	Исполнители.Прочитать();

	Если Исполнители.Количество() = 0 И ВедущаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда


		ЗаписьРенистраСведенийМар  шрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьМен  еджерЗаписи();
		ЗаписьРенистраСведенийМар  шрут.БизнесПроцесс = БизнесПроцесс;
		ЗаписьРенистраСведенийМар  шрут.ТочкаМаршрута = ВедущаяТочка;
		ЗаписьРенистраСведенийМар  шрут.Прочитать();
		Если ЗаписьРенистраСведенийМар  шрут.Выбран() Тогда
			ШаблонВложенного = ЗаписьРенистраСведенийМар  шрут.Шаблон;

			Для каждого СтрокаМаршрута Из ШаблонВложенного.Маршрут Цикл
				Исполнители.Отбор.Сбросить  ();
				Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс);
				Исполнители.Отбор.ТочкаМар  шрута.Установить(СтрокаМар  шрута.ТочкаМаршрута);
				Исполнители.Прочитать();
				Если Исполнители.Количество() > 0 Тогда

					Исполнители.Очистить();
					Исполнители.Записать();
					Прервать;
				КонецЕсли;
			КонецЦикла;

			Исполнители.Отбор.Сбросить  ();

			Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс);
			Исполнители.Прочитать();



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

		КонецЕсли;
	КонецЕсли;


	Если Исполнители.Количество() = 0 Тогда
		Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда
			Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс.ВедущаяЗадача.БизнесП  роцесс);
			Исполнители.Отбор.ТочкаМар  шрута.Установить(ТочкаМарш  рута);
			Исполнители.Прочитать();
		КонецЕсли;

	КонецЕсли;


	Если Исполнители.Количество() = 0 Тогда

		Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда
			Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс.ВедущаяЗадача.БизнесП  роцесс);
			Исполнители.Отбор.ТочкаМар  шрута.Установить(БизнесПро  цесс.ВедущаяЗадача.ТочкаМа  ршрута);
			Исполнители.Прочитать();
		КонецЕсли;

	КонецЕсли;

	СтруктураВозврата = Новый Структура("БизнесПроцесс, ТочкаМаршрута, Исполнитель, РеквизитБП");

	СтруктураВозврата.БизнесП  оцесс = БизнесПроцесс.Ссылка;
	СтруктураВозврата.ТочкаМа  шрута = ТочкаМаршрута;

	Если Исполнители.Количество() > 1 Или ТочкаМаршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие И ТочкаМаршрута.Групповая Тогда
		СписокИсполнителей = Новый СписокЗначений;
		Для каждого Строка Из Исполнители Цикл
			Если ТипЗнч(Строка.Исполнитель) = Тип("Строка") Тогда

				СписокИсполнителей.Добави  ь(Строка.РеквизитБП, Строка.Исполнитель);
			Иначе

















				СписокИсполнителей.Добави  ь(Строка.Исполнитель, Строка.Исполнитель);
			КонецЕсли;

		КонецЦикла;
		СтруктураВозврата.Исполни  ель = СписокИсполнителей;

	ИначеЕсли Исполнители.Количество() = 1 Тогда
		Если ТипЗнч(Исполнители[0].Исполнитель) = Тип("Строка") Тогда
			СтруктураВозврата.Исполни  ель = Исполнители[0].Исполнитель;
			СтруктураВозврата.Реквизи  БП = Исполнители[0].РеквизитБП;
		Иначе








			СтруктураВозврата.Исполни  ель = Исполнители[0].Исполнитель;
		КонецЕсли;

	КонецЕсли;

	Возврат СтруктураВозврата;

КонецФункции








Процедура ДобавитьЗадачу(БизнесПроц  сс, ТочкаМаршрута, ФормируемыеЗадачи, ГрафикРаботы, ДанныеГрафика, Исполнитель)
	НоваяЗадача = Задачи.CRM_Задача.СоздатьЗад  ачу();
	НоваяЗадача.БизнесПроцесс = БизнесПроцесс.Ссылка;
	НоваяЗадача.Наименование = ТочкаМаршрута.Наименовани  Задачи;
	НоваяЗадача.ТочкаМаршрута = ТочкаМаршрута;

	Попытка
		НоваяЗадача.Важность = БизнесПроцесс.Важность;
	Исключение
		НоваяЗадача.Важность = Перечисления.Важность.Сред  няя;
	КонецПопытки;

	НоваяЗадача.Заполнить(Неоп  ределено);

	регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ТочкаМаршрута);
	регМаршрутБизнесПроцесса.  рочитать();

	СтрокаШаблона = регМаршрутБизнесПроцесса.  ыгрузить();















	Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда
		НоваяЗадача.Пользователь = Исполнитель;
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Долж  остиОрганизаций") Тогда
		НоваяЗадача.Должность = Исполнитель;
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Подр  зделения") Тогда
		НоваяЗадача.Подразделение = Исполнитель;
	КонецЕсли;


	НапомнитьОбОкончанииДней = 0;
	НапомнитьОбОкончанииЧасов = 0;
	НапомнитьОбОкончанииМинут = 0;
	ДлительностьДней = 0;
	ДлительностьЧасов = 0;
	ДлительностьМинут = 0;
	ВероятностьУспешногоОконч  ания = 0;



	Если СтрокаШаблона.Количество() > 0 Тогда

		СтруктураДат = CRM_ПолучитьДатуИДатуВыполн  енияЗадачи(СтрокаШаблона[0], ГрафикРаботы, ДанныеГрафика, ?(БизнесПроцесс.Дата > ТекущаяДата(), БизнесПроцесс.Дата, ТекущаяДата()));

		СтруктураДат.Свойство("Дат  ", НоваяЗадача.Дата);
		СтруктураДат.Свойство("Дат  Напоминания", НоваяЗадача.ВремяНапомина  ия);
		СтруктураДат.Свойство("Дат  Завершения", НоваяЗадача.ДатаВыполнени  );

		НапомнитьОбОкончанииДней = СтрокаШаблона[0].НапомнитьОбОкончанииДней;
		НапомнитьОбОкончанииЧасов = СтрокаШаблона[0].НапомнитьОбОкончанииЧасо  ;
		НапомнитьОбОкончанииМинут = СтрокаШаблона[0].НапомнитьОбОкончанииМину  ;

		НоваяЗадача.НапомнитьОСоб  тии = НапомнитьОбОкончанииДней + НапомнитьОбОкончанииЧасов + НапомнитьОбОкончанииМинут > 0;
		НоваяЗадача.ВероятностьУс  ешногоОкончания = СтрокаШаблона[0].ВероятностьУспешногоОкон  ания;
		НоваяЗадача.ОписаниеТочки  аршрута = СтрокаШаблона[0].Комментарий;
	Иначе
		НоваяЗадача.Дата = ТекущаяДата();
	КонецЕсли;


	НоваяЗадача.НеСкрытая = Истина;

	ФормируемыеЗадачи.Добавит  (НоваяЗадача);
	CRM_ПроверитьАдресацию(Испо  нитель);

	_Итерация = CRM_ПолучитьНомерАктивнойИт  ерации(БизнесПроцесс, ТочкаМаршрута);
	Для каждого Запись Из регМаршрутБизнесПроцесса Цикл
		Запись.Итерация = _Итерация + 1;
	КонецЦикла;
	регМаршрутБизнесПроцесса.  аписать();


КонецПроцедуры


Функция ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочка, НомерРазделения, НомерВетки = 0, ТекущаяСтрокаДерева = Неопределено)
	Перем НоваяСтрока;
	Конец = Ложь;
	Пока Не Конец Цикл

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Обработка Тогда



			ПровСтрока = ТаблицаПройденныхТочек.На  ти(ИсходящаяТочка, "Точка");
			Если Не (ПровСтрока = Неопределено) Тогда
				Конец = Истина;
				Продолжить;
			Иначе
				НоваяСтрокаТЗ = ТаблицаПройденныхТочек.До  авить();
				НоваяСтрокаТЗ.Точка = ИсходящаяТочка;
			КонецЕсли;

			Если Не (ТекущаяСтрокаДерева = Неопределено) И (ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс) Тогда

				НоваяСтрока = ТекущаяСтрокаДерева.Строк  .Добавить();
				НоваяСтрока.Разделение = НомерРазделения;
				НоваяСтрока.Ветка = НомерВетки;
				НоваяСтрока.Точка = ИсходящаяТочка.Имя;
			КонецЕсли;

			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда

			ИсходящаяДляРазделения = Неопределено;

			Для Ном = 0 По ИсходящаяТочка.Варианты.Ко  личество() - 1 Цикл
				ИсходящаяТочкаВарианта = ИсходящаяТочка.ПолучитьИс  одящуюТочку(ИсходящаяТочк  а.Варианты[Ном]);

				Если ТекущаяСтрокаДерева = Неопределено Тогда
					ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаВарианта, НомерРазделения);
				Иначе
					Исходящая = ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаВарианта, НомерРазделения, НомерВетки, ТекущаяСтрокаДерева);
					Если Не (Исходящая = Неопределено) Тогда
						ИсходящаяДляРазделения = Исходящая;
					КонецЕсли;
				КонецЕсли;

			КонецЦикла;

			Если ТекущаяСтрокаДерева = Неопределено Тогда
				Конец = Истина;
				Продолжить;
			Иначе
				Возврат ИсходящаяДляРазделения;
			КонецЕсли;

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда

			ИсходящаяДляРазделения = Неопределено;

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

			ИсходящаяТочкаУсловия = ИсходящаяТочка.ПолучитьИс  одящуюТочку(Ложь);
			Если ТекущаяСтрокаДерева = Неопределено Тогда
				ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаУсловия, НомерРазделения);
			Иначе
				Исходящая = ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаУсловия, НомерРазделения, НомерВетки, ТекущаяСтрокаДерева);
				Если Не (Исходящая = Неопределено) Тогда
					ИсходящаяДляРазделения = Исходящая;
				КонецЕсли;
			КонецЕсли;

			Если ТекущаяСтрокаДерева = Неопределено Тогда
				Конец = Истина;
				Продолжить;
			Иначе
				Возврат ИсходящаяДляРазделения;
			КонецЕсли;

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Разделение Тогда

			МассивИсходящихТочек = ИсходящаяТочка.ПолучитьИс  одящиеТочки();

			НомерРазделения = НомерРазделения + 1;

			Для Индекс = 0 По МассивИсходящихТочек.ВГра  ица() Цикл
				Если ТекущаяСтрокаДерева = Неопределено Тогда
					СтрокаДерева = ДеревоТочекПоМакету;
				Иначе
					СтрокаДерева = НоваяСтрока;
				КонецЕсли;

				ТекТочка = ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, МассивИсходящихТочек[Индекс], НомерРазделения, Индекс + 1, СтрокаДерева);
			КонецЦикла;

			ИсходящаяТочка = ТекТочка.ПолучитьИсходящу  Точку();

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Слияние Тогда

			Возврат ИсходящаяТочка;

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Завершение Тогда

			Конец = Истина;
			Продолжить;
		КонецЕсли;
	КонецЦикла;

	Возврат Неопределено;
КонецФункции







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

	ИсходящаяТочка = БизнесПроцессы[ИмяБизнесПроцесса].ТочкиМаршрута.Старт;
	ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();

	ТаблицаПройденныхТочек = Новый ТаблицаЗначений;
	ТаблицаПройденныхТочек.Ко  онки.Добавить("Точка");

	ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочка, 0);

	Возврат ДеревоТочекПоМакету;

КонецФункции

----------

FrolovML (08.06.2014), qqq111qqq (10.12.2011), rvoma (04.10.2011), Seacobra (04.05.2018)

----------


## ByStep

// ОбщийМодуль.CRM_ЗащищенныеФ  нкции.Модуль.txt

Функция CRM_ЗаменитьШаблонВOpenOfficeНаТ  екст(глКомпонента, Параметры, ТегиКолонок) Экспорт
	Возврат глКомпонента.ЗаменитьШабл  нВOpenOfficeНаТекст(Параметры, ТегиКолонок);

КонецФункции



Функция CRM_ЗаменитьШаблонВВордеНаТ  екст(глКомпонента, Ворд, Знач ШаблонВВорде, Знач ТекстЗамены, Везде = Истина) Экспорт
	Перем Результат;
	Попытка
		Если Везде Тогда
			Везде = 1;
		КонецЕсли;
		Результат = глКомпонента.ЗаменитьШабл  нВВордеНаТекст(Ворд, ШаблонВВорде, Строка(ТекстЗамены), Везде);
	Исключение
	КонецПопытки;

	Возврат Результат;

КонецФункции

Процедура CRM_ЗаменитьШаблонВВордеНаК  артнинку(глКомпонента, Ворд, Знач ШаблонВВорде, Картинка) Экспорт
	Перем мФайл, КартинкаВорд;
	CRM_ЗаменитьШаблонВВордеНаТ  екст(глКомпонента, Ворд, ШаблонВВорде, "", Ложь);

	Если ТипЗнч(Картинка) = Тип("Структура") Тогда

		Если ЗначениеЗаполнено(Картинк  .ПолноеИмя) Тогда
			мФайл = Новый Файл(Картинка.ПолноеИмя);
		КонецЕсли;

		Если мФайл <> Неопределено И мФайл.Существует() Тогда
			КартинкаВорд = Ворд.Selection.InlineShapes.AddPicture(мФа  л.ПолноеИмя, Ложь, Истина);
			Если ЗначениеЗаполнено(Картинк  .Высота) Тогда
				КартинкаВорд.Height = Картинка.Высота * 2.833;
			КонецЕсли;
			Если ЗначениеЗаполнено(Картинк  .Ширина) Тогда
				КартинкаВорд.Width = Картинка.Ширина * 2.833;
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

Процедура CRM_ПрименитьФильтр(Парамет  ы, Отбор, НастройкаОтбора, ПредыдущиеЗначенияФильтра  , ФильтрУсловия) Экспорт
	Перем Защита;
	Защита = Обработки.CRM_Защита.Создать  ();
	мКомпонента = Защита.Компонента;

	мКомпонента.ПрименитьФиль  р(Параметры, Отбор, НастройкаОтбора, ПредыдущиеЗначенияФильтра  , ФильтрУсловия);

КонецПроцедуры




Функция CRM_ВычислитьЗначениеУслови  я(Параметры, Условие, Значение = "Значение") Экспорт
	мОписаниеТиповОбъектМетад  анных = Новый ОписаниеТипов("ОбъектМетад  анных");
	мОписаниеТипов = Новый ОписаниеТипов;

	Если ТипЗнч(Условие[Значение]) <> Тип("Строка") Тогда
		Возврат Условие[Значение];
	КонецЕсли;


	Если Условие.Имя = "ВидДокумента" И Условие.ТипЗначения = мОписаниеТиповОбъектМетад  анных Тогда

		Если Условие.ЗначениеС = мОписаниеТипов Или Условие.ЗначениеС = Неопределено Тогда

			Возврат Метаданные.Документы[Условие.ЗначениеПО];
		Иначе
			Возврат Условие.ЗначениеС;
		КонецЕсли;
	КонецЕсли;

	Параметр = Параметры.Найти(Условие[Значение], "Представление");

	Если Не (Параметр = Неопределено) Тогда

		Если ТипЗнч(Параметр.Значение) = Тип("Строка") Тогда
			Возврат Вычислить(Параметр.Значени  е);
		Иначе
			Возврат Параметр.Значение;
		КонецЕсли;
	Иначе


		Возврат Условие[Значение];

	КонецЕсли;


КонецФункции











Функция CRM_ПолучитьСледующиеТочкиМ  аршрута(глКомпонента, Маршрут = Неопределено, Знач ТочкаМаршрута, Знач БизнесПроцесс, Знач Вариант = Неопределено, ИсходнаяТочкаМаршрута = Неопределено) Экспорт
	Возврат глКомпонента.ВыбратьСледу  щиеТочкиМаршрута(глКомпон  ента, Маршрут, ТочкаМаршрута, БизнесПроцесс, Вариант, ИсходнаяТочкаМаршрута);


КонецФункции



Процедура CRM_ПолучитьМаршрутБизнесПр  оцесса(БизнесПроцесс, Маршрут = Неопределено, ТочкаМаршрута = Неопределено) Экспорт
	Если Маршрут = Неопределено Тогда
		Запрос = Новый Запрос;

		Запрос.Текст = "ВЫБРАТЬ
		|	CRM_МаршрутБизнесПроцесса.Т  чкаМаршрута,
		|	CRM_МаршрутБизнесПроцесса.П  метка,
		|	CRM_МаршрутБизнесПроцесса.В  риантВыполнения,
		|	CRM_МаршрутБизнесПроцесса.Ш  блон
		|ИЗ
		|	РегистрСведений.CRM_Маршрут  изнесПроцесса КАК CRM_МаршрутБизнесПроцесса
		|ГДЕ
		|	CRM_МаршрутБизнесПроцесса.Б  знесПроцесс = &БизнесПроцесс";

		Запрос.УстановитьПараметр(  "БизнесПроцесс", БизнесПроцесс);
		Маршрут = Запрос.Выполнить().Выгрузит  ь();
	Иначе
		СтрокаМаршрута = Маршрут.Найти(ТочкаМаршрут  а, "ТочкаМаршрута");
		Если ЗначениеЗаполнено(СтрокаМ  ршрута.Шаблон) Тогда
			Запрос = Новый Запрос;

			Запрос.Текст = "ВЫБРАТЬ
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.ТочкаМаршрута,
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.Пометка,
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.ВариантВыполнения,
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.Ссылка КАК Шаблон
			|ИЗ
			|	ПланВидовХарактеристик.CRM_  аблоныБизнесПроцессов.Мар  шрут КАК CRM_ШаблоныБизнесПроцессовМ  аршрут
			|ГДЕ
			|	CRM_ШаблоныБизнесПроцессовМ  аршрут.Ссылка = &Шаблон";

			Запрос.УстановитьПараметр(  "Шаблон", СтрокаМаршрута.Шаблон);
			Маршрут = Запрос.Выполнить().Выгрузит  ь();
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры








Функция CRM_ПолучитьСписокВыбораНас  тройкиУсловия(глКомпонент  , мИмяОбъекта, мРегистрируемыеДокументы, НастройкаУсловийТекущаяСт  рока, ТипЗначенияЭлемента, Параметры) Экспорт
	Возврат глКомпонента.ПолучитьСпис  кВыбораНастройкиУсловия(м  ИмяОбъекта, мРегистрируемыеДокументы, НастройкаУсловийТекущаяСт  рока, ТипЗначенияЭлемента, Параметры);


КонецФункции





Процедура CRM_Сообщить(Сообщение, Статус) Экспорт
	Сообщить(Сообщение, Статус);
КонецПроцедуры










Функция CRM_ПолучитьНомерАктивнойИт  ерации(БизнесПроцесс, ТочкаМаршрута) Экспорт
	НомерАктивнойИтерации = 0;

	ТекстЗапроса = "ВЫБРАТЬ
	|	МАКСИМУМ(CRM_РезультатыВыпо  ненияЗадачСрезПоследних.И  терация) КАК Итерация
	|ИЗ
	|	РегистрСведений.CRM_Результ  тыВыполненияЗадач.СрезПос  ледних(
	|		,
	|		БизнесПроцесс = &БизнесПроцесс
	|		    И ТочкаМаршрута = &ТочкаМаршрута) КАК CRM_РезультатыВыполненияЗад  ачСрезПоследних";

	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.Текст = ТекстЗапроса;

	ПостроительЗапроса.Параме  ры.Вставить("БизнесПроцесс  ", БизнесПроцесс.Ссылка);
	ПостроительЗапроса.Параме  ры.Вставить("ТочкаМаршрута  ", ТочкаМаршрута);

	ПостроительЗапроса.Выполн  ть();

	Если Не ПостроительЗапроса.Резуль  ат.Пустой() Тогда
		НомерАктивнойИтерации = ПостроительЗапроса.Резуль  ат.Выгрузить()[0].Итерация;
	КонецЕсли;

	Возврат ?(НомерАктивнойИтерации = Null, 0, НомерАктивнойИтерации);

КонецФункции









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


	Результат = CRM_ПолучитьСледующиеТочкиМ  аршрута(глКомпонента, , ТочкаМаршрута, БизнесПроцесс, ЗначениеВыбораВарианта);

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

	Для каждого СтруктураВозврата Из МассивТочекМаршрута Цикл

		ИсходящаяТочка = СтруктураВозврата.Исходящ  яТочка;
		ВедущаяТочка = СтруктураВозврата.Ведущая  очка;

		Если ИсходящаяТочка = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда

			ИсходящийБизнесПроцесс = СтруктураВозврата.БизнесП  оцесс;

			Исполнители = ПолучитьИсполнителей(Исхо  ящийБизнесПроцесс, ИсходящаяТочка, ВедущаяТочка);

			регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
			регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(ИсходящийБизнесПроцес  с);
			регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ИсходящаяТочка);
			регМаршрутБизнесПроцесса.  рочитать();
			СтрокаШаблона = регМаршрутБизнесПроцесса.  ыгрузить();


			Если СтрокаШаблона.Количество() > 0 И СтрокаШаблона[0].Пометка Тогда
				ОтложеноНа = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаДней * 24 * 60 * 60 + СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаЧасов * 60 * 60 + СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаМинут * 60;


				КомментарийТочки = СтрокаШаблона[0].Комментарий;

				ОтложитьНачалоСледующегоЭ  тапаДней = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаДней;
				ОтложитьНачалоСледующегоЭ  тапаЧасов = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаЧасов;
				ОтложитьНачалоСледующегоЭ  тапаМинут = СтрокаШаблона[0].ОтложитьНачалоСледующего  тапаМинут;
			Иначе

				ОтложеноНа = 0;
				КомментарийТочки = "";

				ОтложитьНачалоСледующегоЭ  тапаДней = 0;
				ОтложитьНачалоСледующегоЭ  тапаЧасов = 0;
				ОтложитьНачалоСледующегоЭ  тапаМинут = 0;
			КонецЕсли;

			Если ЗначениеЗаполнено(Исполни  ели) Тогда

				НоваяСтрока = тбСледующиеИсполнители.До  авить();
				НоваяСтрока.БизнесПроцесс = Исполнители.БизнесПроцесс;
				НоваяСтрока.ТочкаМаршрута = Исполнители.ТочкаМаршрута;
				НоваяСтрока.Исполнитель = Исполнители.Исполнитель;
				НоваяСтрока.РеквизитБП = Исполнители.РеквизитБП;
				НоваяСтрока.Отложено = ОтложеноНа;
				НоваяСтрока.ОписаниеТочки  аршрута = КомментарийТочки;
				НоваяСтрока.ОтложитьНачал  СледующегоЭтапаДней = ОтложитьНачалоСледующегоЭ  тапаДней;
				НоваяСтрока.ОтложитьНачал  СледующегоЭтапаЧасов = ОтложитьНачалоСледующегоЭ  тапаЧасов;
				НоваяСтрока.ОтложитьНачал  СледующегоЭтапаМинут = ОтложитьНачалоСледующегоЭ  тапаМинут;
			КонецЕсли;
		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Завершение Тогда
			НоваяСтрока = тбСледующиеИсполнители.До  авить();
			НоваяСтрока.ТочкаМаршрута = ИсходящаяТочка;


			НоваяСтрока.ОписаниеТочки  аршрута = "Завершение бизнес-процесса";
		КонецЕсли;

	КонецЦикла;

	Возврат тбСледующиеИсполнители;

КонецФункции





Функция CRM_ПолучитьТаблицуАдресаци  и() Экспорт
	Запрос = Новый Запрос;

	ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Пользователи.Ссылка КАК Пользователь,
	|	НастройкиПользователей.Зн  чение КАК Подразделение,
	|	&ДолжностьПустаяСсылка КАК Должность,
	|	ИСТИНА КАК НеПоказыватьСкрытые
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Настройки  ользователей КАК НастройкиПользователей
	|		ПО (НастройкиПользователей.На  стройка = &НастройкаОсновноеПодразд  ление)
	|			И Пользователи.Ссылка = НастройкиПользователей.По  ьзователь
	|ГДЕ
	|	Пользователи.ЭтоГруппа = Ложь";

	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр(  "НастройкаОсновноеПодразд  ление", ПланыВидовХарактеристик.Н  стройкиПользователей.Осно  вноеПодразделение);
	Запрос.УстановитьПараметр(  "ДолжностьПустаяСсылка", Справочники.ДолжностиОрга  изаций.ПустаяСсылка());

	ТаблицаАдресации = Запрос.Выполнить().Выгрузит  ь();


	Возврат ТаблицаАдресации;

КонецФункции






Процедура CRM_ПроверитьАдресацию(Испо  нитель) Экспорт
	Запрос = Новый Запрос;
	ТекстЗапроса = "ВЫБРАТЬ
	|	CRM_Адресация.Пользователь,
	|	CRM_Адресация.Подразделение,
	|	CRM_Адресация.Должность
	|ИЗ
	|	РегистрСведений.CRM_Адресац  я КАК CRM_Адресация";


	Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда
		ТекстЗапроса = ТекстЗапроса + " ГДЕ CRM_Адресация.Пользователь = &Исполнитель ";
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Долж  остиОрганизаций") Тогда
		ТекстЗапроса = ТекстЗапроса + " ГДЕ CRM_Адресация.Должность = &Исполнитель ";
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Подр  зделения") Тогда
		ТекстЗапроса = ТекстЗапроса + " ГДЕ CRM_Адресация.Подразделение = &Исполнитель ";
	КонецЕсли;

	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр(  "Исполнитель", Исполнитель);


	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();

	Если Выборка.Количество() = 0 Тогда

		МенеджерЗаписи = РегистрыСведений.CRM_Адреса  ия.СоздатьМенеджерЗаписи()  ;

		Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда
			МенеджерЗаписи.Пользовате  ь = Исполнитель;
		ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Долж  остиОрганизаций") Тогда
			МенеджерЗаписи.Должность = Исполнитель;
		ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Подр  зделения") Тогда
			МенеджерЗаписи.Подразделе  ие = Исполнитель;
		КонецЕсли;



		Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда

			ТекстЗапроса = "
			|ВЫБРАТЬ
			|	НастройкиПользователей.Зн  чение КАК Подразделение
			|ИЗ
			|	Справочник.Пользователи КАК Пользователи
			|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ
			|		РегистрСведений.Настройки  ользователей КАК НастройкиПользователей
			|	ПО
			|		НастройкиПользователей.На  тройка = &НастройкаОсновноеПодразд  ление И
			|		Пользователи.Ссылка = НастройкиПользователей.По  ьзователь
			|ГДЕ
			|	НастройкиПользователей.Зн  чение = &ПараметрАдресации
			|";

			Запрос = Новый Запрос;

			Запрос.Текст = ТекстЗапроса;
			Запрос.УстановитьПараметр(  "ПараметрАдресации", Исполнитель);
			Запрос.УстановитьПараметр(  "НастройкаОсновноеПодразд  ление", ПланыВидовХарактеристик.Н  стройкиПользователей.Осно  вноеПодразделение);

			РезультатЗапроса = Запрос.Выполнить().Выбрать()  ;

			Пока РезультатЗапроса.Следующи  () Цикл
				МенеджерЗаписи.Подразделе  ие = РезультатЗапроса.Подразде  ение;
			КонецЦикла;

		КонецЕсли;

		МенеджерЗаписи.НеПоказыва  ьСкрытые = Истина;
		МенеджерЗаписи.Записать();

	КонецЕсли;

КонецПроцедуры













Процедура CRM_ПередСозданиемЗадач(глК  мпонента, БизнесПроцесс, ТочкаМаршрута, ФормируемыеЗадачи, ГрафикОрганизации, ДанныеГрафика, СтандартнаяОбработка) Экспорт
	СтандартнаяОбработка = Ложь;

	Если БизнесПроцесс.Завершен Тогда
		Возврат;
	КонецЕсли;


	_БизнесПроцесс = БизнесПроцесс;
	_Шаблон = _БизнесПроцесс;
	_Точка = ТочкаМаршрута;

	регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ТочкаМаршрута);
	регМаршрутБизнесПроцесса.  рочитать();
	СтрокаМаршрут = регМаршрутБизнесПроцесса.  ыгрузить();



	регИсполнителиТекущейТочк  и = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	регИсполнителиТекущейТочк  и.Отбор.БизнесПроцесс.Уста  овить(_БизнесПроцесс.Ссылк  а);
	регИсполнителиТекущейТочк  и.Отбор.ТочкаМаршрута.Уста  овить(_Точка);
	регИсполнителиТекущейТочк  и.Прочитать();

	Если регИсполнителиТекущейТочк  и.Количество() = 0 Тогда

		Если ЗначениеЗаполнено(_БизнесП  роцесс.Ссылка.ВедущаяЗадач  а) Тогда
			регИсполнителиТекущейТочк  и.Отбор.БизнесПроцесс.Уста  овить(_БизнесПроцесс.Ссылк  а.ВедущаяЗадача.БизнесПроц  есс);
			регИсполнителиТекущейТочк  и.Отбор.ТочкаМаршрута.Уста  овить(_Точка);
			регИсполнителиТекущейТочк  и.Прочитать();
		КонецЕсли;

	КонецЕсли;



	Если регИсполнителиТекущейТочк  и.Количество() > 0 Тогда
		Если СтрокаМаршрут[0].Пометка Тогда
			Если _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда
				СоответствиеИсполнители = Новый Соответствие;
				Для каждого Строка Из регИсполнителиТекущейТочк  и Цикл

					Если ТипЗнч(Строка.Исполнитель) = Тип("Строка") Тогда


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

				Для каждого ЭлементСоответствия Из СоответствиеИсполнители Цикл
					Исполнитель = ЭлементСоответствия.Значе  ие;
					ДобавитьЗадачу(_БизнесПроц  есс, _Точка, ФормируемыеЗадачи, ГрафикОрганизации, ДанныеГрафика, Исполнитель);
				КонецЦикла;

			ИначеЕсли _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда

				НоваяЗадача = Задачи.CRM_Задача.СоздатьЗад  ачу();

				НоваяЗадача.БизнесПроцесс = _БизнесПроцесс;
				НоваяЗадача.Наименование = _Точка.НаименованиеЗадачи;
				НоваяЗадача.ТочкаМаршрута = _Точка;
				НоваяЗадача.ВероятностьУс  ешногоОкончания = СтрокаМаршрут[0].ВероятностьУспешногоОкон  ания;

				НоваяЗадача.Заполнить(Неоп  ределено);

				НоваяЗадача.Дата = ТекущаяДата();
				НоваяЗадача.НеСкрытая = Истина;
				НоваяЗадача.Ведущая = Истина;
				ФормируемыеЗадачи.Добавит  (НоваяЗадача);
			Иначе

				СтандартнаяОбработка = Истина;
				Возврат;
			КонецЕсли;
		ИначеЕсли _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда

			НоваяЗадача = Задачи.CRM_Задача.СоздатьЗад  ачу();

			НоваяЗадача.БизнесПроцесс = _БизнесПроцесс;
			НоваяЗадача.Наименование = _Точка.НаименованиеЗадачи;
			НоваяЗадача.ТочкаМаршрута = _Точка;

			НоваяЗадача.Заполнить(Неоп  ределено);

			НоваяЗадача.Дата = ТекущаяДата();
			НоваяЗадача.НеСкрытая = Ложь;
			НоваяЗадача.Ведущая = Истина;

			НоваяЗадача.НеобходимоВып  лнить = Истина;

			НоваяЗадача.Результат = "Создана и выполнена автоматически: пропущена точка """ + _Точка + """ по шаблону """ + _Шаблон + """";

			ФормируемыеЗадачи.Добавит  (НоваяЗадача);
		Иначе
			Для каждого СтрокаМаршрута Из регМаршрутБизнесПроцесса Цикл
				СтрокаМаршрута.ЭтапЗаверш  н = Истина;
			КонецЦикла;
			регМаршрутБизнесПроцесса.  аписать();
		КонецЕсли;
	Иначе


		Если _Точка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс И СтрокаМаршрут[0].Пометка Тогда
			СтандартнаяОбработка = Истина;
			ДобавитьЗадачу(_БизнесПроц  есс, _Точка, ФормируемыеЗадачи, ГрафикОрганизации, ДанныеГрафика, Исполнитель);
			Возврат;
		ИначеЕсли _Точка.Вид <> ВидТочкиМаршрутаБизнесПро  цесса.Действие И СтрокаМаршрут[0].Пометка Тогда
			СтандартнаяОбработка = Истина;
			Возврат;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры









Процедура CRM_ПриСозданииЗадач(глКомп  нента, БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, ФормируемыеЗадачи, ГрафикРаботыОрганизации, ДанныеГрафика, Отказ) Экспорт
	Если БизнесПроцесс.Завершен Тогда
		Отказ = Истина;
	КонецЕсли;
	Если ФормируемыеЗадачи.Количес  во() > 0 Тогда
		СоздатьЗаписьРегистраБизн  есПроцессов(БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика);
	КонецЕсли;
КонецПроцедуры







Процедура CRM_ПриЗавершении(БизнесПро  есс, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика, Отказ) Экспорт
	Если БизнесПроцесс.Завершен Тогда
		Возврат;
	КонецЕсли;


	Попытка
		Если ВРег(ТочкаМаршрутаБизнесП  оцесса.Имя) = "ИСТИНА" Тогда
			БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Успешно;
		ИначеЕсли ВРег(ТочкаМаршрутаБизнесП  оцесса.Имя) = "ЛОЖЬ" Тогда
			БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Неудачно;
		Иначе

			БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Успешно;
		КонецЕсли;
	Исключение
	КонецПопытки;

	Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) И Не БизнесПроцесс.ВедущаяЗада  а.Выполнена Тогда


		Если БизнесПроцесс.ВариантЗаве  шения = Перечисления.CRM_ВариантыЗа  ершения.Неудачно Тогда
			ВедущаяЗадача = БизнесПроцесс.ВедущаяЗада  а.ПолучитьОбъект();
			ВедущаяЗадача.ВариантВыпо  нения = 2;
			ВедущаяЗадача.Записать();





		КонецЕсли;

	КонецЕсли;

	СоздатьЗаписьРегистраБизн  есПроцессов(БизнесПроцесс.  Ссылка, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика, БизнесПроцесс.ВариантЗаве  шения);

КонецПроцедуры







Процедура CRM_ОбработкаВыбораВарианта  (БизнесПроцесс, ТочкаВыбораВарианта, Результат) Экспорт
	ТекстЗапроса = "
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	CRM_РезультатыВыполненияЗад  ач.ВариантВыполнения
	|ИЗ
	|	РегистрСведений.CRM_Результ  тыВыполненияЗадач.СрезПос  ледних(, ТочкаМаршрута В (&ТочкиМаршрута) И БизнесПроцесс = &БизнесПроцесс) КАК CRM_РезультатыВыполненияЗад  ач
	|
	|УПОРЯДОЧИТЬ ПО
	|	CRM_РезультатыВыполненияЗад  ач.Период УБЫВ
	|";

	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;


	МассивПроверяемыхТочек = ТочкаВыбораВарианта.Получ  тьВходящиеТочки();


	МассивПроверяемыхТочек.До  авить(ТочкаВыбораВарианта  );

	Запрос.УстановитьПараметр(  "БизнесПроцесс", БизнесПроцесс.Ссылка);
	Запрос.УстановитьПараметр(  "ТочкиМаршрута", МассивПроверяемыхТочек);

	ЗаписьМаршрута = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьМен  еджерЗаписи();
	ЗаписьМаршрута.БизнесПроц  сс = БизнесПроцесс;
	ЗаписьМаршрута.ТочкаМаршр  та = МассивПроверяемыхТочек[0];
	ЗаписьМаршрута.Прочитать();

	ТаблицаРезультатов = Запрос.Выполнить().Выгрузит  ь();
	Если ТаблицаРезультатов.Количе  тво() = 0 Тогда
		Если ЗаписьМаршрута.Выбран() И Не ЗаписьМаршрута.Пометка Тогда
			Результат = ТочкаВыбораВарианта.Вариа  ты[ЗаписьМаршрута.ВариантВып  лнения];
		Иначе
			Результат = ТочкаВыбораВарианта.Вариа  ты[0];
		КонецЕсли;
	ИначеЕсли ЗаписьМаршрута.Выбран() И Не ЗаписьМаршрута.Пометка Тогда
		Результат = ТочкаВыбораВарианта.Вариа  ты[ЗаписьМаршрута.ВариантВып  лнения];
	Иначе
		Результат = ТочкаВыбораВарианта.Вариа  ты.Получить(ТаблицаРезуль  атов[0].ВариантВыполнения - 1);
	КонецЕсли;

КонецПроцедуры









Процедура CRM_ТочкаМаршрутаПриВыполне  нии(глКомпонента, БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, Задача, Отказ) Экспорт
	МенеджерБизнесПроцессы = РегистрыСведений.CRM_Бизнес  роцессы.СоздатьМенеджерЗа  писи();
	МенеджерБизнесПроцессы.Би  несПроцесс = БизнесПроцесс;
	МенеджерБизнесПроцессы.Те  ущийЭтап = ТочкаМаршрутаБизнесПроцес  са;
	МенеджерБизнесПроцессы.Пр  читать();
	МенеджерБизнесПроцессы.Уд  лить();

КонецПроцедуры









Процедура CRM_ПроверкаУсловия(БизнесП  оцесс, ТочкаМаршрутаБизнесПроцес  са, Результат) Экспорт
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	
	|	CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута КАК ТочкаМаршрута,
	|	//
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(CRM_РезультатыВыполн  нияЗадач.ВариантВыполнени  я, 2) = 1 ТОГДА
	|			Истина
	|		ИНАЧЕ
	|			Ложь
	|	КОНЕЦ КАК Результат
	|
	|ИЗ
	|	РегистрСведений.CRM_Результ  тыВыполненияЗадач.СрезПос  ледних(, БизнесПроцесс = &БизнесПроцесс И ТочкаМаршрута = &ТочкаМаршрута И Итерация = &Итерация) КАК CRM_РезультатыВыполненияЗад  ач
	|
	|СГРУППИРОВАТЬ ПО
	|	CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(CRM_РезультатыВыполн  нияЗадач.ВариантВыполнени  я, 2) = 1 ТОГДА
	|			Истина
	|		ИНАЧЕ
	|			Ложь
	|	КОНЕЦ
	|
	|";

	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;

	Запрос.УстановитьПараметр(  "БизнесПроцесс", БизнесПроцесс.Ссылка);


	МассивПроверяемыхТочек = ТочкаМаршрутаБизнесПроцес  са.ПолучитьВходящиеТочки();


	МассивПроверяемыхТочек.До  авить(ТочкаМаршрутаБизнес  Процесса);

	ЗаписьМаршрута = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьМен  еджерЗаписи();
	ЗаписьМаршрута.БизнесПроц  сс = БизнесПроцесс;
	ЗаписьМаршрута.ТочкаМаршр  та = МассивПроверяемыхТочек[0];
	ЗаписьМаршрута.Прочитать();

	Результат = Истина;
	Если ЗаписьМаршрута.Выбран() И Не ЗаписьМаршрута.Пометка Тогда
		Результат = ?(ЗаписьМаршрута.ВариантВы  олнения = 0, Истина, Ложь);
	Иначе
		Для каждого Точка Из МассивПроверяемыхТочек Цикл

			Итерация = CRM_ПолучитьНомерАктивнойИт  ерации(БизнесПроцесс.Ссылк  а, Точка);

			Запрос.УстановитьПараметр(  "ТочкаМаршрута", Точка);
			Запрос.УстановитьПараметр(  "Итерация", Итерация);

			Выборка = Запрос.Выполнить().Выбрать()  ;
			Пока Выборка.Следующий() Цикл
				Результат = Результат И Выборка.Результат;
			КонецЦикла;

		КонецЦикла;
	КонецЕсли;
КонецПроцедуры








Процедура CRM_ПриСозданииВложенныхБиз  несПроцессов(БизнесПроцес  , ТочкаМаршрутаБизнесПроцес  са, ФормируемыеПроцессы, Отказ) Экспорт
	Перем регМаршрутБизнесПроцесса, СтрокаШаблона;
	регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ТочкаМаршрутаБизнесПр  оцесса);
	регМаршрутБизнесПроцесса.  рочитать();
	СтрокаШаблона = регМаршрутБизнесПроцесса.  ыгрузить();


	Если СтрокаШаблона.Количество() > 0 И СтрокаШаблона[0].Пометка Тогда

		Для каждого _БизнесПроцесс Из ФормируемыеПроцессы Цикл

			_БизнесПроцесс.Дата = _БизнесПроцесс.ВедущаяЗада  ча.Дата;
			_БизнесПроцесс.ДатаАвтоСта  рта = _БизнесПроцесс.ВедущаяЗада  ча.Дата;
			_БизнесПроцесс.Инициатор = ПараметрыСеанса.ТекущийПо  ьзователь;
			_БизнесПроцесс.Шаблон = СтрокаШаблона[0].Шаблон;
			CRM_ЗаполнитьИсполнителейМа  ршрут(_БизнесПроцесс, Неопределено);


			_БизнесПроцесс.Заполнить(_Б  изнесПроцесс.ВедущаяЗадач  .БизнесПроцесс);

			Если ЗначениеЗаполнено(_БизнесП  роцесс.Шаблон) Тогда
				_БизнесПроцесс.мТаблицаФай  лов = CRM_ЗаполнитьТаблицуФайлов(_  БизнесПроцесс.Шаблон);
			КонецЕсли;























		КонецЦикла;
	Иначе


		ФормируемыеПроцессы.Очист  ть();
	КонецЕсли;

КонецПроцедуры





Функция CRM_ПроверитьБизнесПроцессы  ПодчиненныеОбъекту(Объект  сылка, ТипОбъекта) Экспорт
	Перем ОбъектМетаданных, ИмяТаблицы;
	ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип  Объекта);
	Если ОбъектМетаданных = Неопределено Тогда
		Возврат Неопределено;
	ИначеЕсли ОбъектМетаданных.Реквизит  .Найти("Основание") = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	ИмяТаблицы = ОбъектМетаданных.ПолноеИм  ();


	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	Ссылка 
	|ИЗ
	|	[ИмяТаблицы] КАК Таблица
	|ГДЕ
	|	Таблица.Основание = &Ссылка
	|";

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицы);

	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.Текст = ТекстЗапроса;

	ПостроительЗапроса.Параме  ры.Вставить("Ссылка", ОбъектСсылка);

	ПостроительЗапроса.Выполн  ть();

	Результат = ПостроительЗапроса.Резуль  ат;


	Если Не ПостроительЗапроса.Резуль  ат.Пустой() Тогда

		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл

			Если Выборка.Ссылка.Стартован Тогда
				ЕстьСтартованныеБП = Истина;
				Прервать;
			КонецЕсли;

		КонецЦикла;

		Если ЕстьСтартованныеБП = Истина Тогда
			ТекстВопроса = "Уже есть стартованные бизнес процессы, введенные на основании выбранного документа. Продолжить?";
		Иначе
			ТекстВопроса = "Уже есть бизнес процессы, введенные на основании выбранного документа. Продолжить?";
		КонецЕсли;

		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
		Возврат Ответ = КодВозвратаДиалога.Да;
	Иначе
		Возврат Истина;
	КонецЕсли;


КонецФункции






Процедура CRM_ОбработкаТочкиМаршрутаО  бработка(ТочкаМаршрутаБиз  есПроцесса, БизнесПроцесс) Экспорт
	Перем НаборМаршрут, СтрокаШаблона;
	НаборМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	НаборМаршрут.Отбор.БизнесП  роцесс.Установить(БизнесПр  оцесс);
	НаборМаршрут.Отбор.ТочкаМа  ршрута.Установить(ТочкаМар  шрутаБизнесПроцесса);
	НаборМаршрут.Прочитать();

	СтрокаШаблона = НаборМаршрут.Выгрузить();
	Если СтрокаШаблона[0].Пометка Тогда
		Попытка
			Выполнить(СтрокаШаблона[0].ОбработкаДействие.Действи  е);
		Исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры




Процедура CRM_ПолучитьИсполнителейМар  шрут(Объект) Экспорт
	Перем НаборМаршрут, НаборИсполнители;
	НаборМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	НаборМаршрут.Отбор.БизнесП  роцесс.Установить(Объект.С  ылка);
	НаборМаршрут.Прочитать();
	Объект.тбМаршрут = НаборМаршрут.Выгрузить();

	НаборИсполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	НаборИсполнители.Отбор.Биз  несПроцесс.Установить(Объе  кт.Ссылка);
	НаборИсполнители.Прочитат  ();
	Объект.тбИсполнители = НаборИсполнители.Выгрузит  ();

КонецПроцедуры







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

		Объект.тбМаршрут = НаборМаршрут.Выгрузить();


		НаборИсполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();

		Объект.тбИсполнители = НаборИсполнители.Выгрузит  ();


		Если ЗначениеЗаполнено(Объект.Ш  аблон) Тогда
			ПВХШаблонБП = Объект.Шаблон;
		Иначе
			ПВХШаблонБП = ПланыВидовХарактеристик.CRM  _ШаблоныБизнесПроцессов.Со  здатьЭлемент();
			ПВХШаблонБП.ТипЗначения = Новый ОписаниеТипов("БизнесПроце  ссСсылка." + Объект.Метаданные().Имя);
			ПВХШаблонБП.ЗаполнитьМарш  ут();
		КонецЕсли;

		Если Не ЗначениеЗаполнено(Объект.В  едущаяЗадача) Тогда
			Для каждого Строка Из ПВХШаблонБП.Исполнители Цикл
				НоваяСтрока = Объект.тбИсполнители.Добав  ить();
				ЗаполнитьЗначенияСвойств(  оваяСтрока, Строка);
			КонецЦикла;
		Иначе
			НаборИсполнителейВедущего  БП = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
			ПровТочка = "";
			Для каждого Строка Из ПВХШаблонБП.Исполнители Цикл
				Если ПровТочка <> Строка.ТочкаМаршрута Тогда
					НаборИсполнителейВедущего  БП.Отбор.БизнесПроцесс.Уст  новить(Объект.ВедущаяЗада  а.БизнесПроцесс);
					НаборИсполнителейВедущего  БП.Отбор.ТочкаМаршрута.Уст  новить(Строка.ТочкаМаршру  а);
					НаборИсполнителейВедущего  БП.Прочитать();
					Если НаборИсполнителейВедущего  БП.Количество() > 0 Тогда
						Для каждого СтрокаНабора Из НаборИсполнителейВедущего  БП Цикл
							НоваяСтрока = Объект.тбИсполнители.Добав  ить();
							ЗаполнитьЗначенияСвойств(  оваяСтрока, СтрокаНабора, , "БизнесПроцесс");
						КонецЦикла;
						ПровТочка = Строка.ТочкаМаршрута;
						НаборИсполнителейВедущего  БП.Отбор.Сбросить();
						Продолжить;
					Иначе
						НаборИсполнителейВедущего  БП.Отбор.Сбросить();
					КонецЕсли;

					НоваяСтрока = Объект.тбИсполнители.Добав  ить();
					ЗаполнитьЗначенияСвойств(  оваяСтрока, Строка);
				КонецЕсли;
			КонецЦикла;

		КонецЕсли;

		Для каждого Строка Из ПВХШаблонБП.Маршрут Цикл
			НоваяСтрока = Объект.тбМаршрут.Добавить()  ;
			ЗаполнитьЗначенияСвойств(  оваяСтрока, Строка);
			НоваяСтрока.Порядок = Строка.НомерСтроки;

			Если Не (Строка.ТочкаМаршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс) Тогда
				Продолжить;
			КонецЕсли;

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



КонецПроцедуры





Процедура CRM_СохранитьМаршрутИсполни  телей(Объект) Экспорт
	Перем регМаршрут, регИсполнители;
	Если ТипЗнч(Объект.тбМаршрут) = Тип("ТаблицаЗначений") Тогда

		Объект.тбМаршрут.Заполнить  Значения(Объект.Ссылка, "БизнесПроцесс");

		регМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
		регМаршрут.Отбор.БизнесПро  цесс.Установить(Объект.Ссы  ка);

		регИсполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
		регИсполнители.Отбор.Бизне  сПроцесс.Установить(Объект  .Ссылка);


		регМаршрут.Загрузить(Объек  т.тбМаршрут);
		регМаршрут.Записать(Истина  );

		Объект.тбИсполнители.Запол  нитьЗначения(Объект.Ссылка  , "БизнесПроцесс");
		регИсполнители.Загрузить(О  бъект.тбИсполнители);
		регИсполнители.Записать(Ис  тина);


	ИначеЕсли Объект.тбМаршрут <> Неопределено И ТипЗнч(Объект.тбМаршрут) <> Тип("ТаблицаЗначений") Тогда
		Если Объект.тбМаршрут.Модифицир  ованность() Тогда
			Объект.тбМаршрут.Записать()  ;
		КонецЕсли;
		Если Объект.тбИсполнители.Модиф  ицированность() Тогда
			Объект.тбИсполнители.Запис  ать();
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры






Функция CRM_ПолучитьДлительностиЗад  ач(СсылкаБизнесПроцесс) Экспорт
	Перем наборМаршрут, ТабНабор, ИмяБП;
	наборМаршрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	наборМаршрут.Отбор.БизнесП  роцесс.Установить(СсылкаБи  знесПроцесс);
	наборМаршрут.Прочитать();
	ТабНабор = наборМаршрут.Выгрузить();

	ИмяБП = СсылкаБизнесПроцесс.Получ  тьОбъект().Метаданные().Имя;

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	CRM_Задача.Ссылка КАК Задача,
	|	РАЗНОСТЬДАТ(CRM_Задача.Дата, CRM_Задача.ДатаФактического  ыполнения, ЧАС) КАК ФактическаяДлительность,
	|	РАЗНОСТЬДАТ(CRM_Задача.Дата, CRM_Задача.ДатаВыполнения, ЧАС) КАК ПлановаяДлительность
	|ИЗ
	|	Задача.CRM_Задача КАК CRM_Задача
	|ГДЕ
	|	CRM_Задача.Выполнена = ИСТИНА
	|	И CRM_Задача.БизнесПроцесс = &парамБизнесПроцесс";
	Запрос.УстановитьПараметр(  "парамБизнесПроцесс", СсылкаБизнесПроцесс);
	Данные = Запрос.Выполнить().Выгрузит  ь();


	Для каждого СтрокаДанных Из Данные Цикл
		Если СтрокаДанных.Задача.ТочкаМ  аршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда


		ИначеЕсли СтрокаДанных.Задача.ТочкаМ  аршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда
			ФактДлительностьВложенных = 0;
			ПланДлительностьВложенных = 0;
			Запрос = Новый Запрос;
			ТекстЗапроса = "";
			Для каждого ЗначениеПеречисления Из Метаданные.Перечисления.CRM_  ВидыБизнесПроцессов.Значе  ияПеречисления Цикл
				ОбъектМетаданных = Метаданные.БизнесПроцессы[ЗначениеПеречисления.Имя];
				ИмяБП = ОбъектМетаданных.Имя;
				Если ТекстЗапроса <> "" Тогда
					ТекстЗапроса = ТекстЗапроса + "
					|
					|ОБЪЕДИНИТЬ ВСЕ
					|";
				КонецЕсли;
				ТекстЗапроса = ТекстЗапроса + "
				|ВЫБРАТЬ
				|	" + ИмяБП + ".Ссылка
				|ИЗ
				|	БизнесПроцесс." + ИмяБП + " КАК " + ИмяБП + "
				|ГДЕ
				|	" + ИмяБП + ".ВедущаяЗадача = &парамВедущаяЗадача";
			КонецЦикла;
			Запрос.Текст = ТекстЗапроса;
			Запрос.УстановитьПараметр(  "парамВедущаяЗадача", СтрокаДанных.Задача);
			ДанныеВложенного = Запрос.Выполнить().Выгрузит  ь();
			Если ДанныеВложенного.Количест  о() > 0 Тогда
				Для каждого СтрокаДанныеВложенного Из ДанныеВложенного Цикл
					ФДЗ = 0;
					ПДЗ = 0;
					ДлительностьВложенного = CRM_ПолучитьДлительностиЗад  ач(СтрокаДанныеВложенного.  Ссылка);
					ДлительностьВложенного.Св  йство("ФактическаяДлитель  остьЗадач", ФДЗ);
					ДлительностьВложенного.Св  йство("ПланируемаДлительн  стьЗадач", ПДЗ);
					ФактДлительностьВложенных = ФактДлительностьВложенных + ФДЗ;
					ПланДлительностьВложенных = ПланДлительностьВложенных + ПДЗ;
				КонецЦикла;
			КонецЕсли;
			СтрокаДанных.ФактическаяД  ительность = ФактДлительностьВложенных  ;
			СтрокаДанных.ПлановаяДлит  льность = ПланДлительностьВложенных  ;
		КонецЕсли;
	КонецЦикла;

	Возврат Новый Структура("ФактическаяДлит  ельностьЗадач, ПланируемаДлительностьЗад  ач", Данные.Итог("ФактическаяДл  тельность"), Данные.Итог("ПлановаяДлите  ьность"));

КонецФункции



Функция CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(СтруктураПар  метров) Экспорт
	Перем ДатаБП, ПланируемаяДатаЗавершения  , Конец, Исполнитель, ВсегоДлительность, ТабПройденыхТочек, ВариантВыполнения, ДлительностьТочек;
	ИсходящаяТочка = СтруктураПараметров.Исход  щаяТочка;
	Шаблон = СтруктураПараметров.Шабло  ;
	ТабИсполнителей = СтруктураПараметров.ТабИс  олнителей;
	БизнесПроцесс = СтруктураПараметров.Бизне  Процесс;
	ИнициаторБизнесПроцесса = СтруктураПараметров.Иници  торБизнесПроцесса;
	ГрафикРаботы = СтруктураПараметров.Графи  Работы;
	ДанныеГрафика = СтруктураПараметров.Данны  Графика;
	ДлительностьТочек = СтруктураПараметров.Дерев  Маршрута;
	ДатаСтарта = СтруктураПараметров.ДатаС  арта;
	ЭтоВложенный = СтруктураПараметров.ЭтоВл  женный;

	Если Не (БизнесПроцесс = Неопределено) Тогда
		Если БизнесПроцесс.ДатаАвтоСта  та <> '00010101000000' И НачалоДня(БизнесПроцесс.Да  таАвтоСтарта) <> НачалоДня(БизнесПроцесс.Да  та) Тогда
			ДатаБП = БизнесПроцесс.ДатаАвтоСта  та;
			ПланируемаяДатаЗавершения = БизнесПроцесс.ДатаАвтоСта  та;
		ИначеЕсли БизнесПроцесс.ДатаАвтоСта  та <> '00010101000000' И НачалоДня(БизнесПроцесс.Да  таАвтоСтарта) = НачалоДня(БизнесПроцесс.Да  та) Или БизнесПроцесс.ДатаАвтоСта  та <> '00010101000000' Тогда

			ДатаБП = БизнесПроцесс.Дата;
			ПланируемаяДатаЗавершения = БизнесПроцесс.Дата;
		ИначеЕсли БизнесПроцесс.ДатаАвтоСта  та = '00010101000000' Тогда
			ДатаБП = БизнесПроцесс.Дата;
			ПланируемаяДатаЗавершения = БизнесПроцесс.Дата;
		КонецЕсли;
	Иначе
		ДатаБП = ДатаСтарта;
		ПланируемаяДатаЗавершения = ДатаСтарта;
	КонецЕсли;

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


	Конец = Ложь;
	ВсегоДлительность = 0;
	ТабПройденыхТочек = Новый ТаблицаЗначений;
	ТабПройденыхТочек.Колонки.  Добавить("Точка");

	Если Не ЭтоВложенный Тогда
		ТекущаяСтрокаДереваТочек = ДлительностьТочек.Строки.Д  обавить();
		ТекущаяСтрокаДереваТочек.  очкаМаршрута = "Бизнес-процесс";
		ТекущаяСтрокаДереваТочек.  атаНачала = ДатаБП;
		ТекущаяСтрокаДереваТочек.  ходящаяДата = ДатаБП;
	Иначе
		ТекущаяСтрокаДереваТочек = ДлительностьТочек;
	КонецЕсли;

	Пока Не Конец Цикл
		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда

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

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда
			СтрокаМаршрута = Шаблон.Найти(ИсходящаяТочк  а, "ТочкаМаршрута");
			Если СтрокаМаршрута.Пометка Тогда




				СтруктураДат = CRM_ПолучитьДатуИДатуВыполн  енияЗадачи(СтрокаМаршрута, ГрафикРаботы, ДанныеГрафика, ПланируемаяДатаЗавершения  );
				СтруктураДат.Свойство("Дат  Завершения", ПланируемаяДатаЗавершения  );

				ОтложеноНа = СтруктураДат.Длительность  тложено;
				ДлительностьВЧасах = СтруктураДат.Длительность  адачи;
				ВсегоДлительность = ВсегоДлительность + ДлительностьВЧасах + ОтложеноНа;

				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

				НоваяСтрокаДерева = ТекущаяСтрокаДереваТочек.  троки.Добавить();
				НоваяСтрокаДерева.ТочкаМа  шрута = ИсходящаяТочка;
				НоваяСтрокаДерева.Длитель  остьТочки = ДлительностьВЧасах;
				НоваяСтрокаДерева.Длитель  остьОтложено = ОтложеноНа;
				НоваяСтрокаДерева.Входяща  Дата = СтруктураДат.ВходящаяДата;
				НоваяСтрокаДерева.ДатаНач  ла = СтруктураДат.Дата;
				НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  ;

				Если Не ЗначениеЗаполнено(Текущая  трокаДереваТочек.ДатаНача  ла) Тогда
					ТекущаяСтрокаДереваТочек.  атаНачала = СтруктураДат.Дата;
					ТекущаяСтрокаДереваТочек.  ходящаяДата = СтруктураДат.Дата;
				КонецЕсли;
			Иначе
				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
			КонецЕсли;
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда
			СтрокаМаршрута = Шаблон.Найти(ИсходящаяТочк  а, "ТочкаМаршрута");
			Если СтрокаМаршрута.Пометка Тогда

				НоваяСтрокаДерева = ТекущаяСтрокаДереваТочек.  троки.Добавить();
				НоваяСтрокаДерева.ТочкаМа  шрута = ИсходящаяТочка;

				ИмяБизнесПроцесса = Метаданные.НайтиПоТипу(Стр  окаМаршрута.Шаблон.ТипЗнач  ения.Типы()[0]).Имя;

				ШаблонВложенного = СтрокаМаршрута.Шаблон.Марш  рут.Выгрузить();
				ИсполнителиВложенного = СтрокаМаршрута.Шаблон.Испо  лнители.Выгрузить();
				ИсходящаяТочкаВложенного = БизнесПроцессы[ИмяБизнесПроцесса].ТочкиМаршрута.Старт;
				ИсходящаяТочкаВложенного = ИсходящаяТочкаВложенного.  олучитьИсходящуюТочку();

				ВложенныйБизнесПроцессПар  аметры = Новый Структура;
				ВложенныйБизнесПроцессПар  аметры.Вставить("Исходящая  очка", ИсходящаяТочкаВложенного);
				ВложенныйБизнесПроцессПар  аметры.Вставить("Шаблон", ШаблонВложенного);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ТабИсполн  телей", ИсполнителиВложенного);
				ВложенныйБизнесПроцессПар  аметры.Вставить("БизнесПро  есс", БизнесПроцесс);
				ВложенныйБизнесПроцессПар  аметры.Вставить("Инициатор  изнесПроцесса", ИнициаторБизнесПроцесса);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ГрафикРаб  ты", ГрафикРаботы);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ДанныеГра  ика", ДанныеГрафика);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ДеревоМар  рута", НоваяСтрокаДерева);
				ВложенныйБизнесПроцессПар  аметры.Вставить("ДатаСтарт  ", ПланируемаяДатаЗавершения  );
				ВложенныйБизнесПроцессПар  аметры.Вставить("ЭтоВложен  ый", Истина);

				СруктураВложенногоБП = CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(ВложенныйБиз  есПроцессПараметры);
				ВсегоДлительность = ВсегоДлительность + СруктураВложенногоБП.Длит  льность;

				НоваяСтрокаДерева.Длитель  остьТочки = СруктураВложенногоБП.Длит  льность;
				НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = СруктураВложенногоБП.Дата;

				ПланируемаяДатаЗавершения = СруктураВложенногоБП.Дата;
			КонецЕсли;
			ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;


		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку(?(ВариантВыпол  нения = 0, Истина, Ложь));
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку(ИсходящаяТочк  а.Варианты[ВариантВыполнения]);
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Разделение Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящиеТочки();

			НоваяСтрокаДерева = ТекущаяСтрокаДереваТочек.  троки.Добавить();
			НоваяСтрокаДерева.ТочкаМа  шрута = "Разделение";

			СтруктураДляРазделения = Новый Структура;
			СтруктураДляРазделения.Вс  авить("ИсходящаяТочка", ИсходящаяТочка);
			СтруктураДляРазделения.Вс  авить("Шаблон", Шаблон);
			СтруктураДляРазделения.Вс  авить("ТабИсполнителей", ТабИсполнителей);
			СтруктураДляРазделения.Вс  авить("БизнесПроцесс", БизнесПроцесс);
			СтруктураДляРазделения.Вс  авить("ИнициаторБизнесПро  есса", ИнициаторБизнесПроцесса);
			СтруктураДляРазделения.Вс  авить("ГрафикРаботы", ГрафикРаботы);
			СтруктураДляРазделения.Вс  авить("ДанныеГрафика", ДанныеГрафика);
			СтруктураДляРазделения.Вс  авить("ДеревоМаршрута", НоваяСтрокаДерева);
			СтруктураДляРазделения.Вс  авить("ПланируемаяДатаЗав  ршения", ПланируемаяДатаЗавершения  );



			ТаблицаТочек = ПолучитьДлительностьРазде  ления(СтруктураДляРазделе  ия);
			ТаблицаТочек.Сортировать("  лительность Убыв");

			ВсегоДлительность = ВсегоДлительность + ТаблицаТочек[0].Длительность;
			ПланируемаяДатаЗавершения = ТаблицаТочек[0].ПланируемаяДатаЗавершени  ;

			НоваяСтрокаДерева.Длитель  остьТочки = ТаблицаТочек[0].Длительность;
			НоваяСтрокаДерева.Длитель  остьОтложено = ТаблицаТочек[0].ДлительностьОтложено;
			НоваяСтрокаДерева.Входяща  Дата = ТаблицаТочек[0].ВходящаяДата;
			НоваяСтрокаДерева.ДатаНач  ла = ТаблицаТочек[0].ДатаНачала;
			НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  ;

			Если ТаблицаТочек[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
				ИсходящаяТочка = ТаблицаТочек[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(?(ТаблицаТоче  [0].ВариантИсходящейТочки = 0, Истина, Ложь));
				Продолжить;
			ИначеЕсли ТаблицаТочек[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
				ИсходящаяТочка = ТаблицаТочек[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(ТаблицаТочек[0].ИсходящаяТочка.Варианты[ТаблицаТочек[0].ВариантИсходящейТочки]);
				Продолжить;
			Иначе
				ИсходящаяТочка = ТаблицаТочек[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку();
				Продолжить;
			КонецЕсли;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Слияние Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Обработка Тогда
			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();
			Продолжить;
		КонецЕсли;

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Завершение Тогда
			Конец = Истина;
			Продолжить;
		КонецЕсли;
	КонецЦикла;

	Если Не ЭтоВложенный Тогда
		ТекущаяСтрокаДереваТочек.  лительностьТочки = ВсегоДлительность;
		ТекущаяСтрокаДереваТочек.  жидаемаяДатаЗавершения = ПланируемаяДатаЗавершения  ;
	КонецЕсли;

	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставит  ("Длительность", ВсегоДлительность);
	СтруктураВозврата.Вставит  ("Дата", ПланируемаяДатаЗавершения  );
	СтруктураВозврата.Вставит  ("ДеревоТочек", ДлительностьТочек);

	Возврат СтруктураВозврата;

КонецФункции




Функция ПолучитьДлительностьРазде  ления(СтруктураПараметров)
	Перем ВариантВыполнения, ДатаСтартаРзаделения;
	ИсходящаяТочка = СтруктураПараметров.Исход  щаяТочка;
	Шаблон = СтруктураПараметров.Шабло  ;
	ИсполнителиТочек = СтруктураПараметров.ТабИс  олнителей;
	БизнесПроцесс = СтруктураПараметров.Бизне  Процесс;
	ИнициаторБизнесПроцесса = СтруктураПараметров.Иници  торБизнесПроцесса;
	ГрафикРаботы = СтруктураПараметров.Графи  Работы;
	ДанныеГрафика = СтруктураПараметров.Данны  Графика;
	ДлительностьТочек = СтруктураПараметров.Дерев  Маршрута;
	ДатаСтартаРзаделения = СтруктураПараметров.Плани  уемаяДатаЗавершения;

	ТаблицаТочек = Новый ТаблицаЗначений;
	ТаблицаТочек.Колонки.Добав  ить("ВходящаяДата");
	ТаблицаТочек.Колонки.Добав  ить("ДлительностьОтложено")  ;
	ТаблицаТочек.Колонки.Добав  ить("ДатаНачала");
	ТаблицаТочек.Колонки.Добав  ить("ИсходящаяТочка");
	ТаблицаТочек.Колонки.Добав  ить("ВариантИсходящейТочки  ");
	ТаблицаТочек.Колонки.Добав  ить("Длительность");
	ТаблицаТочек.Колонки.Добав  ить("ПланируемаяДатаЗаверш  ения");

	Для Индекс = 0 По ИсходящаяТочка.ВГраница() Цикл
		ПланируемаяДатаЗавершения  Ветки = ДатаСтартаРзаделения;
		ДлительностьВетки = 0;
		ТочкаМассива = ИсходящаяТочка[Индекс];

		СтрокаВетки = ДлительностьТочек.Строки.Д  обавить();
		СтрокаВетки.ТочкаМаршрута = "Ветка " + (Индекс + 1);

		НоваяСтрока = ТаблицаТочек.Добавить();

		Пока ТочкаМассива.Вид <> ВидТочкиМаршрутаБизнесПро  цесса.Слияние Цикл
			ПредТочкаМассива = ТочкаМассива;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Тогда

				СтрокаМаршрута = Шаблон.Найти(ТочкаМассива, "ТочкаМаршрута");
				Если СтрокаМаршрута.Пометка Тогда



					ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

					СтруктураДат = CRM_ПолучитьДатуИДатуВыполн  енияЗадачи(СтрокаМаршрута, ГрафикРаботы, ДанныеГрафика, ПланируемаяДатаЗавершения  Ветки);
					СтруктураДат.Свойство("Дат  Завершения", ПланируемаяДатаЗавершения  Ветки);

					ОтложеноНа = СтруктураДат.Длительность  тложено;
					ДлительностьВЧасах = СтруктураДат.Длительность  адачи;
					ДлительностьВетки = ДлительностьВетки + ДлительностьВЧасах + ОтложеноНа;

					ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

					НоваяСтрокаДерева = СтрокаВетки.Строки.Добавит  ь();
					НоваяСтрокаДерева.ТочкаМа  шрута = ТочкаМассива;
					НоваяСтрокаДерева.Длитель  остьТочки = ДлительностьВЧасах;
					НоваяСтрокаДерева.Длитель  остьОтложено = ОтложеноНа;
					НоваяСтрокаДерева.Входяща  Дата = СтруктураДат.ВходящаяДата;
					НоваяСтрокаДерева.ДатаНач  ла = СтруктураДат.Дата;
					НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  Ветки;

					Если Не ЗначениеЗаполнено(СтрокаВ  тки.ДатаНачала) Тогда
						СтрокаВетки.ДатаНачала = СтруктураДат.Дата;
						СтрокаВетки.ВходящаяДата = СтруктураДат.ВходящаяДата;
					КонецЕсли;

					Если Не ЗначениеЗаполнено(НоваяСт  ока.ВходящаяДата) Тогда
						НоваяСтрока.ВходящаяДата = СтруктураДат.ВходящаяДата;
						НоваяСтрока.ДлительностьО  ложено = ОтложеноНа;
						НоваяСтрока.ДатаНачала = СтруктураДат.Дата;
					КонецЕсли;
				Иначе
					ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
				КонецЕсли;
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку();
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда
				СтрокаМаршрута = Шаблон.Найти(ТочкаМассива, "ТочкаМаршрута");
				Если СтрокаМаршрута.Пометка Тогда

					НоваяСтрокаДерева = СтрокаВетки.Строки.Добавит  ь();
					НоваяСтрокаДерева.ТочкаМа  шрута = ТочкаМассива;

					ИмяБизнесПроцесса = Метаданные.НайтиПоТипу(Стр  окаМаршрута.Шаблон.ТипЗнач  ения.Типы()[0]).Имя;

					ШаблонВложенного = СтрокаМаршрута.Шаблон.Марш  рут.Выгрузить();
					ИсполнителиВложенного = СтрокаМаршрута.Шаблон.Испо  лнители.Выгрузить();
					ИсходящаяТочкаВложенного = БизнесПроцессы[ИмяБизнесПроцесса].ТочкиМаршрута.Старт;
					ИсходящаяТочкаВложенного = ИсходящаяТочкаВложенного.  олучитьИсходящуюТочку();

					ВложенныйБизнесПроцессПар  аметры = Новый Структура;
					ВложенныйБизнесПроцессПар  аметры.Вставить("Исходящая  очка", ИсходящаяТочкаВложенного);
					ВложенныйБизнесПроцессПар  аметры.Вставить("Шаблон", ШаблонВложенного);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ТабИсполн  телей", ИсполнителиВложенного);
					ВложенныйБизнесПроцессПар  аметры.Вставить("БизнесПро  есс", БизнесПроцесс);
					ВложенныйБизнесПроцессПар  аметры.Вставить("Инициатор  изнесПроцесса", ИнициаторБизнесПроцесса);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ГрафикРаб  ты", ГрафикРаботы);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ДанныеГра  ика", ДанныеГрафика);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ДеревоМар  рута", НоваяСтрокаДерева);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ДатаСтарт  ", ПланируемаяДатаЗавершения  Ветки);
					ВложенныйБизнесПроцессПар  аметры.Вставить("ЭтоВложен  ый", Истина);

					СруктураВложенногоБП = CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(ВложенныйБиз  есПроцессПараметры);

					ДлительностьВетки = ДлительностьВетки + СруктураВложенногоБП.Длит  льность;

					НоваяСтрокаДерева.Длитель  остьТочки = СруктураВложенногоБП.Длит  льность;
					НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = СруктураВложенногоБП.Дата;

					ПланируемаяДатаЗавершения  Ветки = СруктураВложенногоБП.Дата;
				КонецЕсли;
				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку();
				Продолжить;
			КонецЕсли;
			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку(?(ВариантВыполне  ния = 0, Истина, Ложь));
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Обработка Тогда
				СтрокаМаршрута = Шаблон.Найти(ТочкаМассива, "ТочкаМаршрута");

				ВариантВыполнения = СтрокаМаршрута.ВариантВып  лнения;

				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку();
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящуюТочку(ТочкаМассива.Ва  ианты[ВариантВыполнения]);
				Продолжить;
			КонецЕсли;

			Если ТочкаМассива.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Разделение Тогда
				ТочкаМассива = ТочкаМассива.ПолучитьИсхо  ящиеТочки();

				НоваяСтрокаДерева = СтрокаВетки.Строки.Добавит  ь();
				НоваяСтрокаДерева.ТочкаМа  шрута = "Разделение";

				СтруктураДляРазделения = Новый Структура;
				СтруктураДляРазделения.Вс  авить("ИсходящаяТочка", ТочкаМассива);
				СтруктураДляРазделения.Вс  авить("Шаблон", Шаблон);
				СтруктураДляРазделения.Вс  авить("ТабИсполнителей", ИсполнителиТочек);
				СтруктураДляРазделения.Вс  авить("БизнесПроцесс", БизнесПроцесс);
				СтруктураДляРазделения.Вс  авить("ИнициаторБизнесПро  есса", ИнициаторБизнесПроцесса);
				СтруктураДляРазделения.Вс  авить("ГрафикРаботы", ГрафикРаботы);
				СтруктураДляРазделения.Вс  авить("ДанныеГрафика", ДанныеГрафика);
				СтруктураДляРазделения.Вс  авить("ДеревоМаршрута", НоваяСтрокаДерева);
				СтруктураДляРазделения.Вс  авить("ПланируемаяДатаЗав  ршения", ПланируемаяДатаЗавершения  Ветки);



				ТаблицаТочекМассива = ПолучитьДлительностьРазде  ления(СтруктураДляРазделе  ия);

				ТаблицаТочекМассива.Сорти  овать("Длительность Убыв");
				ДлительностьВетки = ДлительностьВетки + ТаблицаТочекМассива[0].Длительность;
				ПланируемаяДатаЗавершения  Ветки = ТаблицаТочекМассива[0].ПланируемаяДатаЗавершени  ;

				НоваяСтрокаДерева.Длитель  остьТочки = ТаблицаТочекМассива[0].Длительность;
				НоваяСтрокаДерева.Длитель  остьОтложено = ТаблицаТочекМассива[0].ДлительностьОтложено;
				НоваяСтрокаДерева.Входяща  Дата = ТаблицаТочекМассива[0].ВходящаяДата;
				НоваяСтрокаДерева.ДатаНач  ла = ТаблицаТочекМассива[0].ДатаНачала;
				НоваяСтрокаДерева.Ожидаем  яДатаЗавершения = ПланируемаяДатаЗавершения  Ветки;

				Если ТаблицаТочекМассива[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда
					СтрокаМаршрута = Шаблон.Найти(ТаблицаТочек[0], "ТочкаМаршрута");
					ТочкаМассива = ТаблицаТочекМассива[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(?(СтрокаМаршр  та.ВариантВыполнения = 0, Истина, Ложь));
					Продолжить;
				ИначеЕсли ТаблицаТочекМассива[0].ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда
					СтрокаМаршрута = Шаблон.Найти(ТаблицаТочек[0], "ТочкаМаршрута");
					ТочкаМассива = ТаблицаТочекМассива[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку(ТаблицаТочек  ассива[0].ИсходящаяТочка.Варианты[СтрокаМаршрута.ВариантВып  лнения]);
					Продолжить;
				Иначе
					ТочкаМассива = ТаблицаТочекМассива[0].ИсходящаяТочка.ПолучитьИс  ходящуюТочку();
					Продолжить;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;


		НоваяСтрока.ИсходящаяТочк   = ПредТочкаМассива;
		НоваяСтрока.ВариантИсходя  ейТочки = ВариантВыполнения;
		НоваяСтрока.Длительность = ДлительностьВетки;
		НоваяСтрока.ПланируемаяДа  аЗавершения = ПланируемаяДатаЗавершения  Ветки;

		СтрокаВетки.ДлительностьТ  чки = ДлительностьВетки;
		СтрокаВетки.ОжидаемаяДата  авершения = ПланируемаяДатаЗавершения  Ветки;
	КонецЦикла;

	Возврат ТаблицаТочек;

КонецФункции
































Функция Удалить_СRM_ПолучитьПланиру  емаяДатаЗавершенияИДлител  ьностьБизнесПроцесса(ТабД  ительностейТочек, ИсходящаяТочка, Шаблон, ТабИсполнителей, БизнесПроцесс, ГрафикРаботы, ДанныеГрафика) Экспорт
КонецФункции







Процедура СоздатьЗаписьРегистраБизн  есПроцессов(БизнесПроцесс, ТочкаМаршрутаБизнесПроцес  са, ГрафикРаботыОрганизации, ДанныеГрафика, ВариантЗавершения = Неопределено) Экспорт
	МенеджерБизнесПроцессы = РегистрыСведений.CRM_Бизнес  роцессы.СоздатьМенеджерЗа  писи();
	МенеджерБизнесПроцессы.Би  несПроцесс = БизнесПроцесс;
	МенеджерБизнесПроцессы.Те  ущийЭтап = БизнесПроцессы[БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя].ТочкиМаршрута.Старт;
	МенеджерБизнесПроцессы.Пр  читать();

	ИмяБП = БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя;

	ДлительностьЗадачПлановая  Фактическая = CRM_ПолучитьДлительностиЗад  ач(БизнесПроцесс);
	ДлительностьЗадачПлановая = 0;
	ДлительностьЗадачФактичес  кая = 0;
	ДлительностьЗадачПлановая  Фактическая.Свойство("Факт  ческаяДлительностьЗадач", ДлительностьЗадачФактичес  кая);
	ДлительностьЗадачПлановая  Фактическая.Свойство("План  руемаДлительностьЗадач", ДлительностьЗадачПлановая  );


	НаборМаршрута = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	НаборМаршрута.Отбор.Бизнес  Процесс.Установить(БизнесП  роцесс);
	НаборМаршрута.Прочитать();
	Шаблон = НаборМаршрута.Выгрузить();

	ИсполнителиТочекМаршрута = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	ИсполнителиТочекМаршрута.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	ИсполнителиТочекМаршрута.  рочитать();
	ТабИсполнителей = ИсполнителиТочекМаршрута.  ыгрузить();

	ИсходящаяТочка = БизнесПроцессы[БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя].ТочкиМаршрута.Старт;
	ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();



	ТабДлительностейТочек = Новый ТаблицаЗначений;
	ТабДлительностейТочек.Кол  нки.Добавить("СтрокаМаршру  та");
	ТабДлительностейТочек.Кол  нки.Добавить("ГрафикПользо  вателя", Новый ОписаниеТипов("СправочникС  сылка.CRM_ГрафикиРаботы"));
	ТабДлительностейТочек.Кол  нки.Добавить("ДанныеГрафик  а");

	ДлительностьБизнесПроцесс  а = 0;
	ПланируемаяДатаЗавершения = Дата('00010101000000');

	Если Не БизнесПроцесс.Шаблон.НеРас  читыватьДлительность Тогда

		БизнесПроцессПараметры = Новый Структура;
		БизнесПроцессПараметры.Вс  авить("ИсходящаяТочка", ИсходящаяТочка);
		БизнесПроцессПараметры.Вс  авить("Шаблон", Шаблон);
		БизнесПроцессПараметры.Вс  авить("ТабИсполнителей", ТабИсполнителей);
		БизнесПроцессПараметры.Вс  авить("БизнесПроцесс", БизнесПроцесс);
		БизнесПроцессПараметры.Вс  авить("ИнициаторБизнесПро  есса", Неопределено);
		БизнесПроцессПараметры.Вс  авить("ГрафикРаботы", ГрафикРаботыОрганизации);
		БизнесПроцессПараметры.Вс  авить("ДанныеГрафика", ДанныеГрафика);
		БизнесПроцессПараметры.Вс  авить("ДеревоМаршрута", Неопределено);
		БизнесПроцессПараметры.Вс  авить("ДатаСтарта", ТекущаяДата());
		БизнесПроцессПараметры.Вс  авить("ЭтоВложенный", Ложь);

		СтруктураДанных = CRM_ПолучитьПланируемаяДата  ЗавершенияИДлительностьБи  знесПроцесса(БизнесПроцес  Параметры);


		СтруктураДанных.Свойство("  лительность", ДлительностьБизнесПроцесс  а);
		Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.CRM  _Поручение") Тогда
			ПланируемаяДатаЗавершения = ?(БизнесПроцесс.ДатаКонтро  я <> Дата('00010101000000'), БизнесПроцесс.ДатаКонтрол  , БизнесПроцесс.ДатаВыполне  ия);
		Иначе
			СтруктураДанных.Свойство("  ата", ПланируемаяДатаЗавершения  );
		КонецЕсли;

	КонецЕсли;

	МенеджерБизнесПроцессы.Би  несПроцесс = БизнесПроцесс;
	МенеджерБизнесПроцессы.Те  ущийЭтап = ТочкаМаршрутаБизнесПроцес  са;


	МенеджерБизнесПроцессы.На  менование = БизнесПроцесс.Наименовани  ;
	МенеджерБизнесПроцессы.Би  несПроцессРодитель = ?(ЗначениеЗаполнено(Бизнес  роцесс.ВедущаяЗадача), БизнесПроцесс.ВедущаяЗада  а.БизнесПроцесс, Неопределено);
	МенеджерБизнесПроцессы.Ви   = Перечисления.CRM_ВидыБизнес  роцессов[БизнесПроцесс.ПолучитьОбъ  кт().Метаданные().Имя];
	МенеджерБизнесПроцессы.Да  а = БизнесПроцесс.Дата;
	МенеджерБизнесПроцессы.Да  аСтарта = БизнесПроцесс.ДатаАвтоСта  та;
	МенеджерБизнесПроцессы.Но  ер = БизнесПроцесс.Номер;
	МенеджерБизнесПроцессы.Ко  трагент = БизнесПроцесс.Контрагент;
	МенеджерБизнесПроцессы.Ко  тактноеЛицоКонтрагента = БизнесПроцесс.КонтактноеЛ  цоКонтрагента;
	МенеджерБизнесПроцессы.От  етственный = БизнесПроцесс.Ответственн  й;
	МенеджерБизнесПроцессы.Ин  циатор = БизнесПроцесс.Инициатор;
	Если ЕстьРеквизитДокумента("Про  ект", БизнесПроцесс.ПолучитьОбъ  кт().Метаданные()) Тогда
		МенеджерБизнесПроцессы.Пр  ект = БизнесПроцесс.Проект;
	КонецЕсли;
	Если ЕстьРеквизитДокумента("Важ  ность", БизнесПроцесс.ПолучитьОбъ  кт().Метаданные()) Тогда
		МенеджерБизнесПроцессы.Ва  ность = БизнесПроцесс.Важность;
	КонецЕсли;
	МенеджерБизнесПроцессы.Ша  лон = БизнесПроцесс.Шаблон;



	МенеджерБизнесПроцессы.Дл  тельностьПлановая = ДлительностьЗадачПлановая  ;
	МенеджерБизнесПроцессы.Дл  тельностьФактическая = ДлительностьЗадачФактичес  кая;
	МенеджерБизнесПроцессы.От  лонение = ДлительностьЗадачФактичес  кая - ДлительностьЗадачПлановая  ;
	МенеджерБизнесПроцессы.Ст  ртован = БизнесПроцесс.Стартован;
	МенеджерБизнесПроцессы.Пл  нируемаяДатаЗавершения = ПланируемаяДатаЗавершения  ;
	МенеджерБизнесПроцессы.За  ершен = БизнесПроцесс.Завершен;
	МенеджерБизнесПроцессы.За  ершенДосрочно = БизнесПроцесс.ЗавершенДос  очно;
	МенеджерБизнесПроцессы.По  еткаУдаления = БизнесПроцесс.ПометкаУдал  ния;
	МенеджерБизнесПроцессы.За  исать();

	Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда
		CRM_УстановитьДатыВедущейЗа  дачи(БизнесПроцесс.Ведущая  Задача, ПланируемаяДатаЗавершения  , Неопределено);
	КонецЕсли;

КонецПроцедуры














































































































































































































































































































Функция CRM_ПолучитьИсполнителя(глК  мпонента, Знач Исполнитель, Знач БизнесПроцесс, Знач ТочкаМаршрута, Знач ЗначениеВыбораВариантаБП = Неопределено)
	Если Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.Инициатор Тогда

		Возврат БизнесПроцесс.Инициатор;

	ИначеЕсли Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.Ответственный Тогда

		Возврат БизнесПроцесс.Ответственн  й;

	ИначеЕсли Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.ИсполнительПре  дыдущейЗадачи Тогда

















		Если Не ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда

			ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
			|	РезультатыВыполненияЗадач  .Исполнитель КАК Исполнитель,
			|	РезультатыВыполненияЗадач  .Период КАК Период,
			|	0 КАК Порядок,
			|	РезультатыВыполненияЗадач  .БизнесПроцесс,
			|	РезультатыВыполненияЗадач  .ТочкаМаршрута
			|ИЗ
			|	РегистрСведений.CRM_Результ  тыВыполненияЗадач КАК РезультатыВыполненияЗадач
			|ГДЕ
			|	РезультатыВыполненияЗадач  .БизнесПроцесс = &БизнесПроцесс
			|	И РезультатыВыполненияЗадач  .ТочкаМаршрута <> &ТочкаМаршрута
			|	И РезультатыВыполненияЗадач  .Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользо  ватели.ПустаяСсылка)
			|
			|УПОРЯДОЧИТЬ ПО
			|	Период УБЫВ";

			ПостроительЗапроса = Новый ПостроительЗапроса;
			ПостроительЗапроса.Текст = ТекстЗапроса;

			ПостроительЗапроса.Параме  ры.Вставить("БизнесПроцесс  ", БизнесПроцесс);
			ПостроительЗапроса.Параме  ры.Вставить("ТочкаМаршрута  ", ТочкаМаршрута);
		Иначе
			ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
			|	РезультатыВыполненияЗадач  .Исполнитель КАК Исполнитель,
			|	РезультатыВыполненияЗадач  .Период КАК Период,
			|	0 КАК Порядок,
			|	РезультатыВыполненияЗадач  .БизнесПроцесс,
			|	РезультатыВыполненияЗадач  .ТочкаМаршрута
			|ИЗ
			|	РегистрСведений.CRM_Результ  тыВыполненияЗадач КАК РезультатыВыполненияЗадач
			|ГДЕ
			|	РезультатыВыполненияЗадач  .БизнесПроцесс = &БизнесПроцесс
			|	И РезультатыВыполненияЗадач  .ТочкаМаршрута <> &ТочкаМаршрута
			|	И РезультатыВыполненияЗадач  .Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользо  ватели.ПустаяСсылка)
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ ПЕРВЫЕ 1
			|	CRM_РезультатыВыполненияЗад  ач.Исполнитель,
			|	CRM_РезультатыВыполненияЗад  ач.Период,
			|	1,
			|	CRM_РезультатыВыполненияЗад  ач.БизнесПроцесс,
			|	CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута
			|ИЗ
			|	РегистрСведений.CRM_Результ  тыВыполненияЗадач КАК CRM_РезультатыВыполненияЗад  ач
			|ГДЕ
			|	CRM_РезультатыВыполненияЗад  ач.БизнесПроцесс = &ВедущийБизнесПроцесс
			|	И CRM_РезультатыВыполненияЗад  ач.ТочкаМаршрута <> &ВедущаяТочкаМаршрута
			|	И CRM_РезультатыВыполненияЗад  ач.Исполнитель <> ЗНАЧЕНИЕ(Справочник.Пользо  ватели.ПустаяСсылка)
			|
			|УПОРЯДОЧИТЬ ПО
			|	Порядок УБЫВ,
			|	Период";

			ПостроительЗапроса = Новый ПостроительЗапроса;
			ПостроительЗапроса.Текст = ТекстЗапроса;

			ПостроительЗапроса.Параме  ры.Вставить("БизнесПроцесс  ", БизнесПроцесс);
			ПостроительЗапроса.Параме  ры.Вставить("ТочкаМаршрута  ", ТочкаМаршрута);
			ПостроительЗапроса.Параме  ры.Вставить("ВедущийБизнес  Процесс", БизнесПроцесс.ВедущаяЗада  а.БизнесПроцесс);
			ПостроительЗапроса.Параме  ры.Вставить("ВедущаяТочкаМ  аршрута", БизнесПроцесс.ВедущаяЗада  а.ТочкаМаршрута);
		КонецЕсли;

		ПостроительЗапроса.Выполн  ть();
		Выборка = ПостроительЗапроса.Резуль  ат.Выбрать();
		Пока Выборка.Следующий() Цикл
			Исполнитель = Выборка.Исполнитель;
		КонецЦикла;

		Если Не ЗначениеЗаполнено(Исполни  ель) Или Исполнитель = Перечисления.CRM_ВидыИсполн  телейЗадач.ИсполнительПре  дыдущейЗадачи Тогда
			Исполнитель = ПараметрыСеанса.ТекущийПо  ьзователь;
		КонецЕсли;

		Возврат Исполнитель;
	Иначе
		Возврат Исполнитель;
	КонецЕсли;

КонецФункции











Функция ПолучитьИсполнителей(Бизн  сПроцесс, ТочкаМаршрута, ВедущаяТочка)
	Перем Исполнители;
	Исполнители = РегистрыСведений.CRM_Исполн  телиТочекМаршрута.Создать  НаборЗаписей();
	Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс);
	Исполнители.Отбор.ТочкаМар  шрута.Установить(ТочкаМарш  рута);
	Исполнители.Прочитать();

	Если Исполнители.Количество() = 0 И ВедущаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Тогда


		ЗаписьРенистраСведенийМар  шрут = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьМен  еджерЗаписи();
		ЗаписьРенистраСведенийМар  шрут.БизнесПроцесс = БизнесПроцесс;
		ЗаписьРенистраСведенийМар  шрут.ТочкаМаршрута = ВедущаяТочка;
		ЗаписьРенистраСведенийМар  шрут.Прочитать();
		Если ЗаписьРенистраСведенийМар  шрут.Выбран() Тогда
			ШаблонВложенного = ЗаписьРенистраСведенийМар  шрут.Шаблон;

			Для каждого СтрокаМаршрута Из ШаблонВложенного.Маршрут Цикл
				Исполнители.Отбор.Сбросить  ();
				Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс);
				Исполнители.Отбор.ТочкаМар  шрута.Установить(СтрокаМар  шрута.ТочкаМаршрута);
				Исполнители.Прочитать();
				Если Исполнители.Количество() > 0 Тогда

					Исполнители.Очистить();
					Исполнители.Записать();
					Прервать;
				КонецЕсли;
			КонецЦикла;

			Исполнители.Отбор.Сбросить  ();

			Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс);
			Исполнители.Прочитать();



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

		КонецЕсли;
	КонецЕсли;


	Если Исполнители.Количество() = 0 Тогда
		Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда
			Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс.ВедущаяЗадача.БизнесП  роцесс);
			Исполнители.Отбор.ТочкаМар  шрута.Установить(ТочкаМарш  рута);
			Исполнители.Прочитать();
		КонецЕсли;

	КонецЕсли;


	Если Исполнители.Количество() = 0 Тогда

		Если ЗначениеЗаполнено(БизнесП  оцесс.ВедущаяЗадача) Тогда
			Исполнители.Отбор.БизнесПр  оцесс.Установить(БизнесПро  цесс.ВедущаяЗадача.БизнесП  роцесс);
			Исполнители.Отбор.ТочкаМар  шрута.Установить(БизнесПро  цесс.ВедущаяЗадача.ТочкаМа  ршрута);
			Исполнители.Прочитать();
		КонецЕсли;

	КонецЕсли;

	СтруктураВозврата = Новый Структура("БизнесПроцесс, ТочкаМаршрута, Исполнитель, РеквизитБП");

	СтруктураВозврата.БизнесП  оцесс = БизнесПроцесс.Ссылка;
	СтруктураВозврата.ТочкаМа  шрута = ТочкаМаршрута;

	Если Исполнители.Количество() > 1 Или ТочкаМаршрута.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие И ТочкаМаршрута.Групповая Тогда
		СписокИсполнителей = Новый СписокЗначений;
		Для каждого Строка Из Исполнители Цикл
			Если ТипЗнч(Строка.Исполнитель) = Тип("Строка") Тогда

				СписокИсполнителей.Добави  ь(Строка.РеквизитБП, Строка.Исполнитель);
			Иначе

















				СписокИсполнителей.Добави  ь(Строка.Исполнитель, Строка.Исполнитель);
			КонецЕсли;

		КонецЦикла;
		СтруктураВозврата.Исполни  ель = СписокИсполнителей;

	ИначеЕсли Исполнители.Количество() = 1 Тогда
		Если ТипЗнч(Исполнители[0].Исполнитель) = Тип("Строка") Тогда
			СтруктураВозврата.Исполни  ель = Исполнители[0].Исполнитель;
			СтруктураВозврата.Реквизи  БП = Исполнители[0].РеквизитБП;
		Иначе








			СтруктураВозврата.Исполни  ель = Исполнители[0].Исполнитель;
		КонецЕсли;

	КонецЕсли;

	Возврат СтруктураВозврата;

КонецФункции








Процедура ДобавитьЗадачу(БизнесПроц  сс, ТочкаМаршрута, ФормируемыеЗадачи, ГрафикРаботы, ДанныеГрафика, Исполнитель)
	НоваяЗадача = Задачи.CRM_Задача.СоздатьЗад  ачу();
	НоваяЗадача.БизнесПроцесс = БизнесПроцесс.Ссылка;
	НоваяЗадача.Наименование = ТочкаМаршрута.Наименовани  Задачи;
	НоваяЗадача.ТочкаМаршрута = ТочкаМаршрута;

	Попытка
		НоваяЗадача.Важность = БизнесПроцесс.Важность;
	Исключение
		НоваяЗадача.Важность = Перечисления.Важность.Сред  няя;
	КонецПопытки;

	НоваяЗадача.Заполнить(Неоп  ределено);

	регМаршрутБизнесПроцесса = РегистрыСведений.CRM_Маршру  БизнесПроцесса.СоздатьНаб  орЗаписей();
	регМаршрутБизнесПроцесса.  тбор.БизнесПроцесс.Устано  ить(БизнесПроцесс);
	регМаршрутБизнесПроцесса.  тбор.ТочкаМаршрута.Устано  ить(ТочкаМаршрута);
	регМаршрутБизнесПроцесса.  рочитать();

	СтрокаШаблона = регМаршрутБизнесПроцесса.  ыгрузить();















	Если ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Поль  ователи") Тогда
		НоваяЗадача.Пользователь = Исполнитель;
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Долж  остиОрганизаций") Тогда
		НоваяЗадача.Должность = Исполнитель;
	ИначеЕсли ТипЗнч(Исполнитель) = Тип("СправочникСсылка.Подр  зделения") Тогда
		НоваяЗадача.Подразделение = Исполнитель;
	КонецЕсли;


	НапомнитьОбОкончанииДней = 0;
	НапомнитьОбОкончанииЧасов = 0;
	НапомнитьОбОкончанииМинут = 0;
	ДлительностьДней = 0;
	ДлительностьЧасов = 0;
	ДлительностьМинут = 0;
	ВероятностьУспешногоОконч  ания = 0;



	Если СтрокаШаблона.Количество() > 0 Тогда

		СтруктураДат = CRM_ПолучитьДатуИДатуВыполн  енияЗадачи(СтрокаШаблона[0], ГрафикРаботы, ДанныеГрафика, ?(БизнесПроцесс.Дата > ТекущаяДата(), БизнесПроцесс.Дата, ТекущаяДата()));

		СтруктураДат.Свойство("Дат  ", НоваяЗадача.Дата);
		СтруктураДат.Свойство("Дат  Напоминания", НоваяЗадача.ВремяНапомина  ия);
		СтруктураДат.Свойство("Дат  Завершения", НоваяЗадача.ДатаВыполнени  );

		НапомнитьОбОкончанииДней = СтрокаШаблона[0].НапомнитьОбОкончанииДней;
		НапомнитьОбОкончанииЧасов = СтрокаШаблона[0].НапомнитьОбОкончанииЧасо  ;
		НапомнитьОбОкончанииМинут = СтрокаШаблона[0].НапомнитьОбОкончанииМину  ;

		НоваяЗадача.НапомнитьОСоб  тии = НапомнитьОбОкончанииДней + НапомнитьОбОкончанииЧасов + НапомнитьОбОкончанииМинут > 0;
		НоваяЗадача.ВероятностьУс  ешногоОкончания = СтрокаШаблона[0].ВероятностьУспешногоОкон  ания;
		НоваяЗадача.ОписаниеТочки  аршрута = СтрокаШаблона[0].Комментарий;
	Иначе
		НоваяЗадача.Дата = ТекущаяДата();
	КонецЕсли;


	НоваяЗадача.НеСкрытая = Истина;

	ФормируемыеЗадачи.Добавит  (НоваяЗадача);
	CRM_ПроверитьАдресацию(Испо  нитель);

	_Итерация = CRM_ПолучитьНомерАктивнойИт  ерации(БизнесПроцесс, ТочкаМаршрута);
	Для каждого Запись Из регМаршрутБизнесПроцесса Цикл
		Запись.Итерация = _Итерация + 1;
	КонецЦикла;
	регМаршрутБизнесПроцесса.  аписать();


КонецПроцедуры


Функция ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочка, НомерРазделения, НомерВетки = 0, ТекущаяСтрокаДерева = Неопределено)
	Перем НоваяСтрока;
	Конец = Ложь;
	Пока Не Конец Цикл

		Если ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Обработка Тогда



			ПровСтрока = ТаблицаПройденныхТочек.На  ти(ИсходящаяТочка, "Точка");
			Если Не (ПровСтрока = Неопределено) Тогда
				Конец = Истина;
				Продолжить;
			Иначе
				НоваяСтрокаТЗ = ТаблицаПройденныхТочек.До  авить();
				НоваяСтрокаТЗ.Точка = ИсходящаяТочка;
			КонецЕсли;

			Если Не (ТекущаяСтрокаДерева = Неопределено) И (ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Действие Или ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВложенныйБизнесПроц  сс) Тогда

				НоваяСтрока = ТекущаяСтрокаДерева.Строк  .Добавить();
				НоваяСтрока.Разделение = НомерРазделения;
				НоваяСтрока.Ветка = НомерВетки;
				НоваяСтрока.Точка = ИсходящаяТочка.Имя;
			КонецЕсли;

			ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.ВыборВарианта Тогда

			ИсходящаяДляРазделения = Неопределено;

			Для Ном = 0 По ИсходящаяТочка.Варианты.Ко  личество() - 1 Цикл
				ИсходящаяТочкаВарианта = ИсходящаяТочка.ПолучитьИс  одящуюТочку(ИсходящаяТочк  а.Варианты[Ном]);

				Если ТекущаяСтрокаДерева = Неопределено Тогда
					ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаВарианта, НомерРазделения);
				Иначе
					Исходящая = ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаВарианта, НомерРазделения, НомерВетки, ТекущаяСтрокаДерева);
					Если Не (Исходящая = Неопределено) Тогда
						ИсходящаяДляРазделения = Исходящая;
					КонецЕсли;
				КонецЕсли;

			КонецЦикла;

			Если ТекущаяСтрокаДерева = Неопределено Тогда
				Конец = Истина;
				Продолжить;
			Иначе
				Возврат ИсходящаяДляРазделения;
			КонецЕсли;

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Условие Тогда

			ИсходящаяДляРазделения = Неопределено;

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

			ИсходящаяТочкаУсловия = ИсходящаяТочка.ПолучитьИс  одящуюТочку(Ложь);
			Если ТекущаяСтрокаДерева = Неопределено Тогда
				ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаУсловия, НомерРазделения);
			Иначе
				Исходящая = ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочкаУсловия, НомерРазделения, НомерВетки, ТекущаяСтрокаДерева);
				Если Не (Исходящая = Неопределено) Тогда
					ИсходящаяДляРазделения = Исходящая;
				КонецЕсли;
			КонецЕсли;

			Если ТекущаяСтрокаДерева = Неопределено Тогда
				Конец = Истина;
				Продолжить;
			Иначе
				Возврат ИсходящаяДляРазделения;
			КонецЕсли;

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Разделение Тогда

			МассивИсходящихТочек = ИсходящаяТочка.ПолучитьИс  одящиеТочки();

			НомерРазделения = НомерРазделения + 1;

			Для Индекс = 0 По МассивИсходящихТочек.ВГра  ица() Цикл
				Если ТекущаяСтрокаДерева = Неопределено Тогда
					СтрокаДерева = ДеревоТочекПоМакету;
				Иначе
					СтрокаДерева = НоваяСтрока;
				КонецЕсли;

				ТекТочка = ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, МассивИсходящихТочек[Индекс], НомерРазделения, Индекс + 1, СтрокаДерева);
			КонецЦикла;

			ИсходящаяТочка = ТекТочка.ПолучитьИсходящу  Точку();

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Слияние Тогда

			Возврат ИсходящаяТочка;

		ИначеЕсли ИсходящаяТочка.Вид = ВидТочкиМаршрутаБизнесПро  цесса.Завершение Тогда

			Конец = Истина;
			Продолжить;
		КонецЕсли;
	КонецЦикла;

	Возврат Неопределено;
КонецФункции







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

	ИсходящаяТочка = БизнесПроцессы[ИмяБизнесПроцесса].ТочкиМаршрута.Старт;
	ИсходящаяТочка = ИсходящаяТочка.ПолучитьИс  одящуюТочку();

	ТаблицаПройденныхТочек = Новый ТаблицаЗначений;
	ТаблицаПройденныхТочек.Ко  онки.Добавить("Точка");

	ПолучитьТочкуСформировать  СтрокуДерева(ДеревоТочекП  Макету, ТаблицаПройденныхТочек, ИсходящаяТочка, 0);

	Возврат ДеревоТочекПоМакету;

КонецФункции

----------

ffmpeg (28.04.2012), Haron12 (05.07.2012), Seacobra (04.05.2018), sergo5 (09.06.2014), Vlad12 (11.12.2011), Радусвет (11.11.2020)

----------


## Maksy_G

*ByStep*, хакер ты наш! не мог чтоли в личку кинуть? думаешь *ЭТО* ВСЕМ интересноИ?

----------


## Sintson

Тема раскрыта :) в архив.

----------


## Topic

глКомпонента - где описана?

----------


## Vlad12

Не надо прятаться, стесняться !
За публичность - молодца !!!

----------


## Topic

Это к чему комментарий?

----------


## Vlad12

> Это к чему комментарий?


Обычно тему читают с начала...
см. страницу 1

----------


## AVS300

Да! Весьма развернутый был коментарий )))

----------


## Topic

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

----------


## qqq111qqq

ByStep, огромное спасибо!

Для всех, кто мучается с закрытыми модулями советую обработку http://help1c.com/files/view/60.html

----------

Fellix (07.04.2013)

----------


## sergey_echo

У кого-то есть опыт взлома защиты конфигураций Раруса? Судя по анализу защищенных модулей (декомпилировать,чтобы посмотреть их содержание, получилось), в них создается защищенная обработка, вот получить эту обработку или выгрузить в файл никак и не получается.

----------


## i-Demon-i

*ByStep*, если есть возможность отпишись как декомпилировал закрытые модули 1с, очень надо и интересно.

----------


## Sintson

Привет, могу помочь. Спрашивай.

----------


## polishchuk.i

Я извиняюсь, а если эта обработка пишет индекс за границами массива, возможно код обфусцирован. Тогда как?

----------


## ams11

Есть внешний модуль внутри файла обновления конфигурации. Кто может посмотреть?

----------


## Радусвет

а этому можно научится?:blush:

----------

