Показано с 1 по 10 из 22
Тема: взлом защищённого модуля
Древовидный режим
-
05.12.2010, 23:13 #9
- Регистрация
- 11.11.2009
- Сообщений
- 2
- Сказал(а) спасибо
- 1
- Поблагодарили 10 раз(а) в 2 сообщениях
// ОбщийМодуль.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);
Возврат ДеревоТочекПоМакету;
КонецФункции
-
-
Социальные закладки