взлом защищённого модуля
X

Привет дорогой друг

Наш сайт существует и развиваетется за счет рекламы. Пожалуйста, отключите блокировку рекламы AdBlock или подобное, для нашего сайта. Спасибо!
Показано с 1 по 10 из 22

Комбинированный просмотр

  1. #1
    Гость форума

    Регистрация
    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);

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

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

  2. 4 пользователя(ей) сказали cпасибо:

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

  3. #2
    Гость форума

    Регистрация
    11.10.2010
    Сообщений
    3
    Сказал(а) спасибо
    6
    Поблагодарили 1 раз в 1 сообщении

    По умолчанию Re: взлом защищённого модуля

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

  4. #3
    Гость форума

    Регистрация
    05.02.2009
    Сообщений
    3
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию Re: взлом защищённого модуля

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

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •