# Бизнес процессы

Бизнес-процесс стартует при вызове метода Старт() или нажатии кнопки "Стартовать и закрыть" в форме объекта. Бизнес-процесс может быть записан, но не стартован.

```
БП = БизнесПроцессы.Согласование.СоздатьБизнесПроцесс();
БП.Дата = ТекущаяДата();
БП.Записать();
БП.Старт();
```

При вызове метода ВыполнитьЗадачу() осуществляется проверка выполнения, после которой задача помечается как выполненная и об этом оповещается бизнес-процесс. Если все необходимые условия выполнены, то бизнес-процесс осуществляет переход на следующую точку маршрута.

Свойство Групповая в Адресации создает задание каждому исполнителю в группе, поэтому, чтобы шаг был выполнен, необходимо выполнение всеми участниками группы.

**Работа с точками процесса.**

**События**

В свойствах задачи на схеме процесса настраиваются события.

"ПередСозданиемЗадач" – вызывается когда задачи еще не созданы, можно создать новые задачи и полностью заполнить их свойства.   
"ПриСозданииЗадач" – задачи уже созданы их можно отредактировать.

**Заполнение бизнес процессом реквизитов задачи**

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

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

**Изменение реквизитов бизнес процесса при выполнении задачи**

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

**Условия и выбор варианта**

Для условного ветвления есть обработчик проверки условия, наличие которого обязательно и контролируется при проверке карты маршрута перед сохранением бизнес-процесса. Если обработчик отсутствует, то будет выдано предупреждение: Точка условия не имеет обработчика события "Проверка условия". Этот обработчик должен вернуть результат проверки условия, от которого будет зависеть выбор следующей точки маршрута. Если результат Истина, то бизнес-процесс пойдет по ветке Да, в противном случае – по ветке Нет. По умолчанию результат устанавливается равным значению Ложь.

```
Процедура ОграничениеСкидкиПроверкаУсловия(ТочкаМаршрутаБП, Результат)
  Если ПолучитьСкидкуПоСчету() > ПолучитьОбычнуюСкидку() Тогда
    Результат = Истина;
  Иначе
    Результат = Ложь;
  КонецЕсли;
КонецПроцедуры
```

Для выбора одного из нескольких возможных путей используется точка выбора варианта. Для каждого варианта обязателен обработчик выбора варианта, контролируется при проверке карты маршрута. Если обработчик отсутствует, то будет выдано предупреждение: Точка выбора варианта не имеет обработчика события Выбор варианта. Этот обработчик должен установить параметр Результат равным одному из предусмотренных вариантов.

```
Процедура ВыборВарианта (ТочкаВыбораВарианта, Результат)
  Если ВидОплаты = Перечисления.ВидОплаты.Наличная Тогда
    Результат = ТочкаВыбораВарианта.Варианты.Наличная;
  ИначеЕсли ВидОплаты = Перечисления.ВидОплаты.Безналичная Тогда
    Результат = ТочкаВыбораВарианта.Варианты.Безналичная;
  ИначеЕсли ВидОплаты = Перечисления.ВидОплаты.Взаимозачет Тогда
    Результат = ТочкаВыбораВарианта.Варианты.Взаимозачет;
  ИначеЕсли ВидОплаты = Перечисления.ВидОплаты.Кредит Тогда
    Результат = ТочкаВыбораВарианта.Варианты.Кредит;
  КонецЕсли;
КонецПроцедуры
//ВидОплаты – реквизит бизнес-процесса.

```

**Шаблоны кода**

**Программный старт БП из формы нового БП с дополнительным изменением параметров**

```
&НаСервере
Процедура СтартоватьБПНаСервере()
	ТекОбъект = Объект.Ссылка.ПолучитьОбъект();
	ТекОбъект.Старт();
КонецПроцедуры

&НаКлиенте
Процедура СтартоватьБП(Команда)  
	Если Не ЗначениеЗаполнено(Объект.Дата) Тогда
		Объект.Дата = ТекущаяДата();
	КонецЕсли;
	Объект.СервисДоступен = Ложь;
	ЭтаФорма.Записать();
	СтартоватьБПНаСервере();
КонецПроцедуры 
```

**Проверка и выполнение задачи.**

Например, если задача предусматривает проведение документа, то автоматическая процедура слежения за такими задачами может определять, что нужный документ уже проведен, и помечать задачу как выполненную путем вызова у нее метода Выполнить(). Для организации такого рода автоматизированных процедур предназначен метод ПроверкаВыполнения() у задачи и соответствующие ему обработчики у точек маршрута.

```
Если Задача.ПроверитьВыполнение() Тогда
  Задача.ВыполнитьЗадачу();
КонецЕсли
```

**Получить ссылки на процессы**

```
СписокБП = БизнесПроцессы.ТестовыйПроцесс.Выбрать();
Пока СписокБП.Следующий() Цикл 
	Если Не СписокБП.Завершен Тогда
		Сообщить(СписокБП.Номер);      
	КонецЕсли;
КонецЦикла;
```

**Получить имена всех бизнес процессов**

```
&НаСервереБезКонтекста
Процедура ВывестиВыполненныеПроцессыНаСервере()   
    // Получаем коллекцию всех объектов типа БизнесПроцессы
    КоллекцияБизнесПроцессов = Метаданные.БизнесПроцессы;
    Для Каждого БизнесПроцесс Из КоллекцияБизнесПроцессов Цикл
        //БизнесПроцесс.Имя; БизнесПроцесс.Синхронизация; БизнесПроцесс.Комментарий;
		Сообщить(БизнесПроцесс.Имя);
    КонецЦикла;;
КонецПроцедуры

//В предыдущем скрипте можно заменить имя для просмотра в цикле
//ИмяШаблонаБП = БизнесПроцесс.Имя;
//СписокБП = БизнесПроцессы[ИмяШаблонаБП].Выбрать();
```

**Получение текущей задачи для бизнес процесса**

```
ВЫБРАТЬ
   Задача.Ссылка
ИЗ
   Задача.Задача КАК Задача
ГДЕ
   (НЕ Задача.Выполнена)
   И Задача.ГлавныйБП = &ГлавныйБП
   И Задача.ГлавныйБП.Стартован
```

**Получение всех точек бизнес процесса:**

```
&НаСервереБезКонтекста
Процедура СписокТочекПроцессаНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ПроцессМониторингаИиЗТочки.Ссылка КАК Ссылка,
	               |	ПроцессМониторингаИиЗТочки.Порядок КАК Порядок
	               |ИЗ
	               |	БизнесПроцесс.ПроцессМониторингаИиЗ.Точки КАК ПроцессМониторингаИиЗТочки";
	РезультатЗапроса = Запрос.Выполнить();
	ТЗ = РезультатЗапроса.Выгрузить();
	Для Каждого СтрокаТЗ из ТЗ Цикл
		Сообщить(Строка(СтрокаТЗ[1]) + ": " + Строка(СтрокаТЗ[0]));
	КонецЦикла
КонецПроцедуры
```

**Получение следующих точек для конкретной точки**

```
&НаСервереБезКонтекста
Функция ПолучитьИсходящиеТочки(пТочкаМаршрута)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПроцессМониторингаИиЗТочки.Ссылка
        |ИЗ
        |    БизнесПроцесс.ПроцессМониторингаИиЗ.Точки КАК ПроцессМониторингаИиЗТочки";
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    лРезультат = Новый Массив;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        лВходящиеТочки = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьВходящиеТочки();
        Если лВходящиеТочки.Найти(пТочкаМаршрута) <> Неопределено Тогда
            лРезультат.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
        КонецЕсли;
    КонецЦикла;
    Возврат лРезультат;
КонецФункции
```