Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме Управляемое приложение

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

Разбить на страницы
Показывать лекцию целиком

Цель лекции: научиться автоматизировать бизнес-процессы с использованием средств 1С:Предприятие 8.2.

Постановка задачи

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

Еще один пример – сотрудники отдела получают от руководства фирмы поручение составить отчеты по своим участкам деятельности, после составления всех отчетов руководитель отдела получает сообщение о том, что отчеты составлены, получает их, составляет сводный отчет и передает его руководству.

Таких примеров может существовать бесчисленное множество – все зависит от каждой конкретной организации. Часто подобные явления существуют на уровне устных или письменных распоряжений, часто они даже не выделяются в особые структуры, которые принято называть бизнес-процессами, а существуют лишь благодаря естественным образом заведенному порядку вещей. Но с приходом в организации компьютерных средств обработки информации бизнес-процессы этих организаций могут быть формализованы, описаны с помощью инструментов этих компьютерных средств, и, в конечном счете, автоматизированы.

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

Наша условная организация, в частности, нуждается в автоматизации следующих бизнес-процессов:

  • Первый бизнес-процесс, который будет называться "Клиент", заключается в распределении клиентов по сотрудникам и в контроле за исполнением заказов и "прохождения" клиента по инстанциям организации. В нашем случае он выглядит следующим образом. Администратор салона красоты принимает заказ от клиента, пришедшего в салон или позвонившего по телефону. Клиент называет время, когда он хотел бы быть обслужен у мастера. Администратор передает информацию о клиенте определенному сотруднику – мастеру. Когда мастер выполнит заказанные клиентом работы, он передает сведения о результатах бухгалтеру, после чего бухгалтер получает от клиента оплату и на этом бизнес-процесс завершается.
  • Второй бизнес-процесс ("Отчет") заключается в подготовке всеми мастерами отчетов о проделанной работе. Мастерам, от директора организации, поступает задание на подготовку отчетов на текущий момент. После того, как мастера подготовят отчеты, эти отчеты передаются бухгалтеру, который готовит сводный отчет, и, после подготовки этого отчета, директор собирает весь коллектив для обсуждения результатов работы.
  • Третий бизнес-процесс "Закупка товаров". От директора поступает задание на закупку товаров. Задание может выполнить любой сотрудник отдела Парикмахерская. Сотрудник готовит смету, и, если стоимость приобретаемых товаров не превышает 10000 рублей, смета сразу же попадает на подпись к директору. Если же превышает – то перед тем, как попасть к директору, ее должен утвердить бухгалтер.
  • Четвертый бизнес-процесс "Поручение". От директора поступает поручение, адресованное конкретному сотруднику. Кроме того, может быть указан еще один сотрудник, который должен проконтролировать выполнение поручения. Бизнес-процесс завершается либо, если указан лишь исполнитель, после того, как поручение будет исполнено, либо, если указан исполнитель и контролер, после того, как оно будет исполнено, а исполнение будет проверено контролером.
  • Реализация бизнес-процесса "Клиент" и создание дополнительных объектов

    В 1С:Предприятие существуют два ключевых, для решения задач автоматизации бизнес-процессов, объекта. Первый из них так и называется – Бизнес-процесс. Второй объект – это Задача. Бизнес-процессы и задачи тесно взаимосвязаны.

    Объект Бизнес-процесс содержит в себе карту маршрута бизнес-процесса, при прохождении по карте создаются задачи, адресуемые тем или иным исполнителям. Создаваемые задачи – это объекты Задача.

    Кроме того, для реализации бизнес-процесса нужен регистр сведений, который называют регистром адресации. Этот регистр содержит сведения об организационной структуре организации, важные для распределения задач по исполнителям.

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

    Итак, для того, чтобы заставить механизмы бизнес-процессов работать, нам понадобятся следующие объекты:

  • Параметр сеанса
  • Регистр сведений
  • Задача
  • Бизнес-процесс
  • Начнем решение первой задачи по автоматизации бизнес-процесса "Клиент" с создания параметра сеанса и настройки механизма определения сотрудника, вошедшего в систему.

    Параметр сеанса

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

    Создадим новый параметр сеанса, назовем его .

    (рис 6.1) Параметр сеанса ТекущийПользователь

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

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

    Здесь мы выполняем поиск в справочнике Сотрудники по реквизиту Пользователь, в котором должно храниться имя пользователя системы в таком виде, в каком оно задано в списке пользователей в Конфигураторе. Функция ИмяПользователя() возвращает имя пользователя, вошедшего в систему в виде строки. Найдя элемент справочника Сотрудники, соответствующий пользователю, вошедшему в систему, мы записываем ссылку на найденный элемент в параметр сеанса Текущий пользователь.

    Для того, чтобы этот механизм работал правильно, приведем список пользователей (.

    (рис 6.2) Список пользователей

    Всем пользователям, кроме пользователя Администратор при настройке свойств пользователя назначим роль Сотрудник.

    Проконтролируем заполнение реквизита .

    (рис 6.3) Список сотрудников, заполнение реквизита Пользователь

    Кроме того, в ). Это приведет к тому, что при запуске нашей конфигурации из Конфигуратора, мы получим возможность выбирать пользователя для входа в систему.

    (рис 6.4) Установка, позволяющая выбирать пользователя при запуске из Конфигуратора.

    Мы выводили сообщение пользователю, пользуясь для этого процедурой ПриНачалеРаботыСистемы в модуле управляемого приложения. Мы получали содержимое константы СообщениеПользователю в серверной функции общего модуля СерверныеФункции и выводили его. Выполним подобную операцию для параметра сеанса ТекущийПользователь, реализуем ее с помощью функции ПолучитьПараметрСеанса(), ее код приведен ниже.

    Функция ПолучитьПараметрСеанса() Экспорт
      Попытка
        Возврат ("Параметр сеанса ТекущийПользователь установлен, вы идентифицированы как " + 
    ПараметрыСеанса.ТекущийПользователь.Наименование);
      Исключение
          Возврат ("Параметр сеанса ТекущийПользователь не установлен, вы вошли в систему как "+ ИмяПользователя());
      КонецПопытки;
     КонецФункции
    

    При попытке обращения к неинициализированному параметру сеанса генерируется исключение, поэтому мы, для обработки возможного исключения, используем конструкцию Попытка…Исключение…КонецПопытки. В блоке Попытка мы пытаемся возвратить текст сообщения, содержащего значение параметра сеанса. Если параметр сеанса инициализирован – пользователь увидит сообщение о его идентификации. Если параметр сеанса не установлен, то есть – пользователь, под которым мы вошли в систему, не связан ни с одним сотрудником, будет сгенерировано исключение и мы попадем в блок Исключение. В этом блоке мы сообщаем пользователю о том, что параметр сеанса не установлен и дополняем это сообщение именем пользователя, указанным при его входе в систему. В нашем случае блок Исключение сработает при входе в систему пользователя Администратор, так как он не связан ни с одним сотрудником из справочника Сотрудники.

    Код процедуры ПриНачалеРаботыСистемы в модуле управляемого приложения теперь приобретет такой вид:

    Процедура ПриНачалеРаботыСистемы()
       Сообщить(СерверныеФункции.ПолучитьКонстанту());
       Сообщить(СерверныеФункции.ПолучитьПараметрСеанса());
     КонецПроцедуры
    

    На рис 6.5 вы можете видеть результат работы этого кода.

    (рис 6.5) Сообщение пользователю о его идентификации

    Создадим новый справочник, назовем его ):

  • Администратор
  • Бухгалтер
  • Директор
  • Мастер
  • Расчетчик
  • (рис 6.6) Справочник Должности

    Регистр адресации

    Регистром адресации при организации работы бизнес-процессов является непериодический регистр сведений. Система использует его для определения адресатов задания – то есть – сотрудников, которым нужно назначить задания, созданные при работе бизнес-процесса. В основе структуры регистра, в частности – его измерений, по которым и осуществляется поиск адресатов, лежит обычно штатное расписание организации. В нашем случае руководство салона красоты, автоматизацией которого мы занимаемся, предоставило такое расписание:

    СотрудникПодразделениеДолжность
    Васильев П.П.АдминистрацияДиректор
    Александров А.А.АдминистрацияАдминистратор
    Иванов И.И.ПарикмахерскаяМастер
    Петров П.П.ПарикмахерскаяМастер
    Расчетчиков А.И.БухгалтерияРасчетчик
    Бухгалтерова В.В.БухгалтерияБухгалтер

    Создадим непериодический независимый регистр сведений, дадим ему имя ), включим его в состав подсистемы УчетРаботыМастеров.

    (рис 6.7) Регистр сведений Адресация

    Регистр должен содержать измерения, по которым планируется адресовать задачи. В нашем случае это – три измерения, рис 6.8):

    Сотрудник: Тип – СправочникСсылка.Сотрудники, Ведущее
    Подразделение: Тип – СправочникСсылка.Подразделения, Ведущее
    Должность: Тип – СправочникСсылка.Должности, Ведущее
    

    Исключим регистр Адресация из состава общего реквизита Организация.

    (рис 6.8) Регистр сведений Адресация, состав измерений

    Заполним регистр адресации в пользовательском режиме (рис 6.9) в соответствии с приведенным выше штатным расписанием.

    (рис 6.9) Регистр сведений Адресация, заполнение данными

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

    Задача

    Создадим новый объект Задача, назовем его УниверсальнаяЗадача, включим объект в подсистему УчетРаботыМастеров, исключим объект из состава общего реквизита Организация.

    Перейдем на вкладку ). Настроим свойства этой вкладки следующим образом:

    Адресация: выберем регистр сведений Адресация.
    Текущий исполнитель: параметр сеанса ТекущийПользователь
    В поле Реквизиты адресации добавим следующие реквизиты:
    Сотрудник: 
      Тип: СправочникСсылка.Сотрудники, 
      Измерение адресации: Сотрудник. 
      Измерение адресации позволяет связать реквизит адресации задачи с 
          соответствующим ему измерением регистра адресации.
    Подразделение:
      Тип: СправочникСсылка.Подразделения, 
      Измерение адресации: Подразделение.
    Должность: 
      Тип: СправочникСсылка.Должности, 
      Измерение адресации: Должность.
      Основной реквизит адресации: Сотрудник. 
      Этот реквизит мы можем выбрать после ввода состава реквизитов адресации задачи.
    
    (рис 6.10) Настройка задачи

    Перейдем на вкладку . Этот реквизит мы будем использовать для того, чтобы, при запуске бизнес-процесса, указывать задание для мастера – информацию о клиенте и услугах, которую он хочет получить, а так же о стоимости услуг.

    (рис 6.11) Настройка реквизитов задачи

    Перейдем на вкладку Формы, создадим форму списка задачи, согласившись с параметрами, предложенными по умолчанию, и, на этапе выбора состава элементов, включив отображение всех элементов. В свойствах реквизита формы Список установим в поле ОсновнаяТаблица параметр Задача.УниверсальнаяЗадача.ЗадачиПоИсполнителю. Благодаря этой установке при вызове формы списка автоматически будут открываться задачи, отобранные по исполнителю, то есть – задачи для того сотрудника, который вошел в систему, данные о котором были помещены в параметр сеанса.

    Добавим новую команду формы, назовем ее ПереключениеОтображенияЗадачПоИсполнителю, создадим обработчик команды, перетащим команду на панель инструментов формы, после чего создадим следующий код:

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

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

    На рис 6.12 вы можете видеть редактор формы списка и окно свойств реквизита Список.

    (рис 6.12) Настройка формы списка задачи

    Бизнес-процесс

    Создадим новый объект бизнес-процесс, назовем его .

    (рис 6.13) Создание Бизнес-процесса РаботаСКлиентами

    Логика бизнес-процесса подразумевает ввод некоторых данных при его создании. В частности, бизнес-процесс создает администратор парикмахерской, который задает информацию о клиенте, список услуг, которые хочет получить клиент, данные мастера, к которому направляют клиента, а так же – стоимость услуг и данные бухгалтера, который должен принять оплату. Все это мы реализуем, задав реквизиты бизнес-процесса. Как и в случае с другими объектами реквизиты бизнес-процессов задаются на вкладке ):

    Мастер: Тип: СправочникСсылка.Сотрудники
    КлиентИПереченьУслуг: Тип: Строка, Длина: 50
    ДатаИВремяЗаказа: Тип: Дата, Состав даты: Дата и время
    Бухгалтер: Тип: СправочникСсылка.Сотрудники
    СтоимостьУслуг: Тип: Число, Длина: 10, Точность: 2.
    
    (рис 6.14) Состав данных Бизнес-процесса РаботаСКлиентами

    Теперь займемся разработкой карты маршрута бизнес-процесса. Для этого перейдем на вкладку и панель инструментов Вставка элементов схемы.

    (рис 6.15) Начало создания карты маршрута бизнес-процесса

    Каждый бизнес-процесс должен иметь точку старта. Разместим элемент схемы Точка старта в верхней части карты. Рисование элементов карты маршрута ничем не отличается от рисования предопределенных фигур, например, в Microsoft Word. Точка старта не нуждается в дополнительной настройке.

    Следующий элемент схемы – это .

    (рис 6.16) Работа над картой маршрута бизнес-процесса

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

    Для того, чтобы отменить автоматическое создание задачи и создать задачу самостоятельно, мы можем воспользоваться обработчиком события точки маршрута ПередСозданиемЗадач(). Этот обработчик, кроме прочих, принимает на входе параметр СтандартнаяОбработка. Для того чтобы создать задачи программно, нам нужно установить этот параметр в значение Ложь, после чего создать необходимые задачи (в нашем случае – это одна задача, адресованная конкретному мастеру) и добавить созданные задачи (объекты типа ЗадачаОбъект) в массив ФормируемыеЗадачи. Вот как выглядит код этой процедуры, который располагается в модуле бизнес-процесса:

    Процедура ЗадачаДляМастераПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.УниверсальнаяЗадача.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.РаботаСКлиентами.ТочкиМаршрута.ЗадачаДляМастера;
      НоваяЗадача.Наименование = "БП1 - мастеру";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Мастер;
      НоваяЗадача.Задание
           ="Клиент "+КлиентИПереченьУслуг+" "+ДатаИВремяЗаказа;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Выражение вида НоваяЗадача.Сотрудник=Мастер присваивает реквизиту задачи значение реквизита бизнес-процесса. Мастер – это реквизит бизнес-процесса. Аналогично в данном коде выглядят остальные реквизиты бизнес-процеса.

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

    Создадим вторую точку действия, назовем ее ЗадачаДляБухгалтера. С ней мы поступим аналогичным образом – добавим новую задачу программным образом. Вот код соответствующей процедуры. В целом он аналогичен вышеописанному, за исключением того, что задача адресована бухгалтеру.

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

    После завершения работы с точкой .

    (рис 6.17) Карта маршрута бизнес-процесса

    После реализации логики бизнес-процесса, займемся его визуальным отображением – формой. Перейдем на вкладку .

    (рис 6.18) Карта маршрута бизнес-процесса

    В состав реквизитов формы добавим новый реквизит, назовем его КартаМаршрута, тип – ГрафическаяСхема. Разместим реквизит в форме, добавим обработчик события формы ПриСозданииНаСервере() следующего вида:

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

    Здесь мы сначала проверяем, создается ли новый бизнес-процесс (ссылка на него пока пуста) или мы открываем уже существующий бизнес-процесс. В первом случае мы записываем в реквизит КартаМаршрута карту маршрута, общую для всех бизнес-процессов типа РаботаСКлиентами, во втором – получаем карту маршрута для открываемого экземпляра бизнес-процесса.

    Модифицируем рабочую область .

    (рис 6.19) Отображение списка задач

    Если мы попытаемся войти в систему под учетной записью Администратор, появится сообщение об ошибке, так как при создании данной формы подразумевается наличие инициализированного параметра сеанса ТекущийПользователь. Перейдем в модуль формы списка объекта УниверсальнаяЗадача, добавим следующий код:

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

    Здесь мы пытаемся обратиться к параметру сеанса, если он инициализирован, исключение не происходит, форма открывается с параметрами, настроенными в конфигураторе, если параметр не инициализирован, генерируется исключение, в блоке Исключение мы устанавливаем для свойства ОсновнаяТаблица списка формы значение "Задача.УниверсальнаяЗадача" и блокируем кнопку ПереключениеОтображенияЗадачПоИсполнителю.

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

    Теперь настало время проверить наш бизнес-процесс на практике.

    Войдем в систему под учетной записью .

    (рис 6.20) Заполнение параметров нового бизнес-процесса

    После нажатия на кнопку Стартовать и закрыть, бизнес-процесс будет стартован. Откроем список задач (в данной ситуации мы можем просто перейти на закладку Рабочий стол) – он будет пуст, так как текущий пользователь не соответствует адресату задачи. Нажав на кнопку Переключение отображения задач по исполнителю, убедимся, что в списке присутствует невыполненная задача для мастера .

    (рис 6.21) Невыполненная задача в списке задач

    Теперь войдем в систему под учетной записью . Теперь новая задача появилась у бухгалтера.

    (рис 6.22) Выполненная задача мастера и продвижение бизнес-процесса по маршруту

    После того, как бухгалтер выполнит свою задачу, бизнес-процесс, при просмотре его в списке, будет помечен как завершенный, рис 6.23.

    (рис 6.23) Завершенный бизнес-процесс в списке

    Реализация бизнес-процесса "Отчет"

    Выше мы подготовили все необходимое для реализации этого бизнес-процесса. Опишем его логику. Бизнес-процесс инициирует директор. Он вводит задание для мастеров – подготовить отчет. В первой точке бизнес-процесса создается несколько заданий, которые рассылаются по мастерам. После того, как все мастера подготовят отчет, задание формируется уже для бухгалтера – подготовить сводный отчет. И, после того, как бухгалтер подготовит сводный отчет, формируется последнее задание – теперь уже для директора, который, собрав коллектив на совещание, ставит отметку о выполнении задания и бизнес-процесс завершается. При реализации данного бизнес-процесса мы будем пользоваться автоматическими средствами создания задач, но будем модифицировать некоторые их свойства уже после создания.

    Создадим новый бизнес-процесс, назовем его ОтчетОРаботе, на вкладке Основные выберем задачу УниверсальнаяЗадача, включим бизнес-процесс в состав подсистемы УчетРаботыМастеров.

    Создадим один реквизит бизнес-процесса – Задание, тип – Строка, длина – 100.

    Создадим карту бизнес-процесса. Первую точку действия назовем ЗаданияДляМастеров. Установим ее свойства:

    Групповая: включено
    Подразделение: Парикмахерская
    Должность: Мастер
    

    Благодаря включению признака .

    (рис 6.24) Точка маршрута бизнес-процесса, создающая несколько задач

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

    Мы предусмотрели реквизит бизнес-процесса, который называется Задание. Хотя задачи создаются автоматически, мы можем вмешиваться в этот процесс, в частности, программным путем редактируя их свойства в обработчике события ПриСозданииЗадач. Введем в обработчик такой код:

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

    Здесь мы перебираем массив созданных задач и записываем в них задание, указанное директором при старте бизнес-процесса, а так же – указываем наименование задачи.

    Создадим вторую точку действия, назовем ее ЗаданиеБухгалтеру. Заполним ее реквизиты следующим образом:

    Должность: Бухгалтер.
    Подразделение: Бухгалтерия.
    

    Откроем обработчик ПриСозданииЗадач, введем в него такой код:

    Процедура ЗаданиеБухгалтеруПриСозданииЗадач
    (ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
      Для каждого Задача из ФормируемыеЗадачи Цикл
        Задача.Задание="Подготовить сводный отчет";
        Задача.Наименование="БП2 - бухгалтеру";
      КонецЦикла
    КонецПроцедуры
    

    Теперь создадим третью точку бизнес-процесса, ЗадачаДиректору. Она будет адресована директору – реквизит Должность установим в значение Директор. В коде ПриСозданииЗадач запишем следующее:

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

    Добавим точку завершения бизнес-процесса.

    Создадим форму бизнес-процесса так же, как мы создавали форму для вышеописанного бизнес-процесса.

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

    (рис 6.25) Дополнение регистра адресации

    После запуска бизнес-процесса создаются две задачи – по числу мастеров, работающих в парикмахерской, рис 6.26.

    (рис 6.26) Задачи для нескольких пользователей, созданные бизнес-процессом

    Здесь мы отключили отбор по исполнителю для того, чтобы увидеть все задачи.

    После того, как мастера подготовят отчеты, задание поступит бухгалтеру. И, наконец, когда бухгалтер справится со своей частью работы, директор получит сообщение о том, что сводный отчет по выданному им заданию готов.

    Реализация бизнес-процесса "Закупка материалов"

    Для решения этой задачи дополним нашу конфигурацию новым документом. Назовем его СметаЗакупкиМатериалов, включим в подсистему УчетРаботыМастеров. Документ будет иметь три реквизита:

    СоставСметы: Строка, Длина 100.
    ОбщаяСтоимость: Число, длина 10, точность 2.
    СогласованоПриПревышении: Булево
    

    Ограничимся этими настройками, рис 6.27.

    (рис 6.27) Документ СметаЗакупкиМатериалов

    Создадим новый бизнес-процесс ЗакупкаМатериалов. В качестве задачи укажем объект УниверсальнаяЗадача, включим бизнес-процесс в подсистему УчетРаботыМастеров

    Создадим реквизит ).

    (рис 6.28) Реквизит бизнес-процесса ЗакупкаМатериалов

    Создадим форму бизнес-процесса по уже известной вам технологии, рис 6.29.

    (рис 6.29) Форма бизнес-процесса

    Приступим к созданию карты маршрута бизнес-процесса. Для удобства на рис 6.30. приведена готовая карта маршрута.

    (рис 6.30) Карта маршрута бизнес-процесса

    Начнем с точки Старт. Добавим соответствующий элемент схемы, но для этого бизнес-процесса подвергнем точку старта дополнительной настройке. В частности, наш бизнес-процесс будет основан на работе с документом СметаЗакупкиМатериалов, ссылка на один из таких документов должна храниться в реквизите Смета бизнес-процесса. Если директор, создавая бизнес-процесс, не укажет смету, это приведет к невозможности работы. Так как смета создается изначально пустой, содержащей лишь номер документа и дату, мы можем, в том случае, если документ сметы не указан, создать ее автоматически. Для этого мы воспользуемся обработчиком события Перед стартом точки старта:

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

    Если документ сметы не задан – создаем его программно перед стартом бизнес-процесса и записываем ссылку на него в реквизит Смета.

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

    (рис 6.31) Дополненный регистр адресации

    Доработаем объект УниверсальнаяЗадача специально для использования универсальной задачи с бизнес-процессом ЗакупкаМатериалов. Нам нужно, чтобы пользователь мог из формы задачи, в том случае, если задача создана бизнес-процессом ЗакупкаМатериалов, открывать документ СметаЗакупкиМатериалов, связанный с бизнес-процессом. Добавим в состав команд формы задачи новую команду, назовем ее ОткрытьСмету. Создадим обработчик для этой команды, перетащим задачу на форму и отключим ее свойство Видимость.

    В модуле формы создадим обработчик ПриОткрытии, приведем его к следующему виду:

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

    Здесь мы делаем видимой кнопку ОткрытьСмету в том случае, если задача имеет отношение к бизнес-процессу ЗакупкаМатериалов, сообщаем пользователю о том, что от него потребуется работа с документом, который можно увидеть, нажав на кнопку Открыть смету.

    В обработчик ОткрытьСмету добавим следующий код, создадим некоторые вспомогательные функции:

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

    Мы, с помощью серверной функции ПолучитьСсылкуНаСмету(), получаем ссылку на документ СметаЗакупкиМатериалов, указанный при создании бизнес-процесса.

    Кроме того, мы определяем имя точки бизнес-процесса и в соответствии с именем точки (функция СообщениеДляПользователя) формируем текст сообщения для пользователя.

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

    Внесение изменений в документ не влияет на выполнение задачи сотрудника парикмахерской. Но содержимое документа повлияет на дальнейший ход бизнес-процесса. В частности, по условию было сказано, что при превышении общей стоимости материалов по смете 10000 рублей смета должна попасть на согласование к директору. Если стоимость меньше этой суммы – она направляется напрямую к бухгалтеру, который должен выдать деньги.

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

    Добавим на карту точку условия, назовем ее ПроверкаСуммыСметы и зададим такой код вышеуказанному обработчику:

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

    Здесь мы инициализировали переменную ОбщаяСтоимостьБольшеЗаданной значением Ложь, проверили условие, и при выполнении условия присваиваем ей значение Истина. После чего записываем значение переменной в Результат.

    Если процесс пошел по ветви Нет, то есть, дополнительных согласований не требуется, создается задача для бухгалтера. Добавим точку действия ЗаданиеБухгалтеру, в реквизитах адресации укажем Подразделение: Бухгалтерия, Должность: Бухгалтер.

    Добавим на карту точку завершения бизнес-процесса, назовем ее УспешноеЗавершение. В ее обработчике При завершении создадим такой код:

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

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

    После того, как директор поработает с документом и зафиксирует факт выполнения задачи, проверяется еще одно условие (точка условия УтвержденаЛиСмета). Здесь используется реквизит документа СогласованоПриПревышении:

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

    Если документ согласован, мы проходим по ветви Да и создаем уже обсужденное задание для бухгалтера. Если документ не согласован, мы приходим к точке окончания, названной ЗавершениеБезУтвержденияСметы, со следующим обработчиком При завершении:

    Процедура ЗавершениеБезУтвержденияСметыПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
      Сообщить("Бизнес-процесс  завершен, смета не прошла согласование");
    КонецПроцедуры
    

    Бизнес-процесс "Поручение"

    Создадим новый объект Задача, назовем его ЗадачаДляПоручения, включим в состав подсистемы УчетРаботыМастеров

    На закладке ) укажем следующее:

    Адресация: выберем регистр сведений Адресация.
    Текущий исполнитель: параметр сеанса ТекущийПользователь
    В поле Реквизиты адресации добавим реквизит:
    Сотрудник: 
      Тип: СправочникСсылка.Сотрудники, 
      Измерение адресации: Сотрудник. 
        Измерение адресации позволяет связать реквизит адресации задачи с 
          соответствующим ему измерением регистра адресации.
      Основной реквизит адресации: Сотрудник. 
        Этот реквизит мы можем выбрать после ввода состава реквизитов адресации 
          задачи.
    
    (рис 6.32) Настройка адресации задачи ЗадачаДляПоручения

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

    Создадим бизнес-процесс Поручение, в качестве задачи установим для него задачу ЗадачаДляПоручения, включим его в состав подсистемы УчетРаботыМастеров.

    Перейдем на закладку ):

    Исполнитель, Тип: СправочникСсылка.Сотрудники
    Контролер, Тип: СправочникСсылка.Сотрудники
    НуженПараллельныйКонтроль, Тип: Булево
    ОписаниеЗадания, Тип: Строка, длина – 50
    РезультатПроверки, Тип: Булево
    
    (рис 6.33) Настройка реквизитов бизнес-процесса Поручение.

    Форму бизнес-процесса можно создать по уже известной вам технологии, можно ограничиться формой, создаваемой автоматически.

    Создадим карту маршрута бизнес-процесса, рис 6.34.

    (рис 6.34) Карта маршрута бизнес-процесса Поручение.

    На карте этого бизнес-процесса мы использовали два новых элемента. Это – точки разделения и слияния. Когда бизнес-процесс доходит до точки разделения, ход его выполнения разветвляется. В нашем случае мы создаем две задачи в точке разделения – в том случае, если при старте бизнес-процесса указано, что требуется параллельный контроль. Ход процесса после прохождения им точки разделения, делится на две точки действия, каждая из которых создает собственные задачи.

    Создадим точку старта, она носит имя Старт, присвоенное по умолчанию, дополнительных настроек для нее мы не производим.

    Создадим точку условия, назовем ее НуженПараллельныйКонтроль, зададим обработчик ПроверкаУсловия:

    Процедура НуженПараллельныйКонтрольПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
      Результат=НуженПараллельныйКонтроль;
    КонецПроцедуры
    

    В этой точке мы принимаем решение о движении по одной из ее ветвей на основе присвоения параметру Результат значения реквизита бизнес-процесса НуженПараллельныйКонтроль. Если реквизит установлен в значение Истина – выполнение бизнес-процесса продолжается по ветви точки условия Да, если ложь – по ветви Нет.

    Создадим точку действия, назовем ее ЗаданиеИсполнителю, соединим с ней ветвь Нет точки условия НуженПараллельныйКонтроль. Зададим обработчик ПередСозданиемЗадачи для этой точки:

    Процедура ЗаданиеИсполнителюПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеИсполнителю;
      НоваяЗадача.Наименование = "БП4 - исполнителю";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Исполнитель;
      НоваяЗадача.Задание="Задание для выполнения:"+ОписаниеЗадания;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Эта процедура формирует задание для исполнителя, указанного при старте бизнес-процесса.

    Создадим точку условия, назовем ее НуженКонтроль, соединим с ней выходную линию точки ЗаданиеИсполнителю и зададим обработчик ПроверкаУсловия:

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

    Если поле Контролер при старте бизнес-процесса не заполнено, то, очевидно, контроль не нужен – в таком случае мы идем по ветви Нет и попадаем в точку завершения бизнес-процесса (Создадим точку завершения с именем Завершение). В противном случае, идем по ветви Да.

    Создадим точку действия ЗаданиеКонтролеру, соединим с ним ветвь Да точки условия НуженКонтроль. Зададим обработчик ПередСозданиемЗадач:

    Процедура ЗаданиеКонтролеруПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеКонтролеру;
      НоваяЗадача.Наименование = "БП4 - контролеру, обычный контроль";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Контролер;
      НоваяЗадача.Задание="Проконтролируйте задание:"+ОписаниеЗадания
          +", выполненное "+Исполнитель.Наименование;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Здесь мы обычными средствами создаем новую задачу для заданного при старте бизнес-процесса контролера.

    Создадим для точки действия ЗаданиеКонтролеру обработчик ПриВыполнении:

    Процедура ЗаданиеКонтролеруПриВыполнении
    (ТочкаМаршрутаБизнесПроцесса, Задача, Отказ)
      РезультатПроверки=Задача.РезультатПроверки;
      Записать();
    КонецПроцедуры
    

    Запишем в реквизит бизнес-процесса значение реквизита задачи РезультатПроверки.

    Создадим точку условия КонтрольПройден, соединим с ней выходную линию точки ЗаданиеКонтролеру, напишем следующую процедуру ПроверкаУсловия:

    Процедура КонтрольПройденПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
      Результат=РезультатПроверки;
    КонецПроцедуры
    

    Если реквизит бизнес-процесса РезультатПроверки будет установлен в значение Истина, то есть – проверка выполнения задания пройдена, мы уйдем по ветви Да, которую следует соединить с точкой завершения бизнес-процесса, к завершению.

    Если же результат проверки оказался отрицательным, мы уходим по ветви Нет к точке условия НуженПараллельныйКонтроль, в которой, анализируя данные бизнес-процесса, снова приступаем к выдаче задания исполнителю, и, если нужно, контролеру.

    На данный момент точка НуженПараллельныйКонтроль не имеет точек, связанных с ее выходом Да. Создадим новую точку разделения, оставим ее имя по умолчанию Разделение1, создадим две точки действия, одну назовем ЗаданиеИсполнителю1, вторую – ЗаданиеКонтролеру1 и присоединим к этим точкам действия выходные линии точки разделения.

    Для точки действия ЗаданиеИсполнителю1 зададим следующий обработчик ПередСозданиемЗадач:

    Процедура ЗаданиеИсполнителю1ПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеИсполнителю1;
      НоваяЗадача.Наименование = "БП4 - исполнителю, параллельный контроль";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Исполнитель;
      НоваяЗадача.Задание="Задание для выполнения: "+ОписаниеЗадания;
      ФормируемыеЗадачи.Добавить(НоваяЗадача)
    КонецПроцедуры
    

    Мы создаем задание для исполнителя, указывая в наименовании создаваемой задачи наличие параллельного контроля.

    Для точки действия ЗаданиеКонтролеру1 зададим такой код:

    Процедура ЗаданиеКонтролеру1ПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеКонтролеру1;
      НоваяЗадача.Наименование = "БП4 - контролеру, параллельный контроль";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Контролер;
      НоваяЗадача.Задание="Проконтролируйте задание: "
          +ОписаниеЗадания+", выполняемое "+Исполнитель.Наименование;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Здесь так же мы указываем, что контроль будет выполняться параллельно.

    Создадим новую точку слияния (с именем по умолчанию Слияние1), подключим к ее входу выходы элементов ЗаданиеИсполнителю1 и ЗаданиеКонтролеру1, а выход подключим к точке условия КонтрольПройден. В этой точке, напомним, мы анализируем реквизит бизнес-процесса РезультатПроверки. Реализуем заполнение реквизита бизнес-процесса РезультатПроверки в модуле формы задачи ЗадачаДляПоручения. Для этого создадим форму задачи и в ней – обработчик события ПередВыполнением():

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

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

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

    Выводы

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

    Видеоурок

    Для данной лекции подготовлен видеоурок.

    Страницы:

    Цель лекции: научиться автоматизировать бизнес-процессы с использованием средств 1С:Предприятие 8.2.

    Постановка задачи

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

    Еще один пример – сотрудники отдела получают от руководства фирмы поручение составить отчеты по своим участкам деятельности, после составления всех отчетов руководитель отдела получает сообщение о том, что отчеты составлены, получает их, составляет сводный отчет и передает его руководству.

    Таких примеров может существовать бесчисленное множество – все зависит от каждой конкретной организации. Часто подобные явления существуют на уровне устных или письменных распоряжений, часто они даже не выделяются в особые структуры, которые принято называть бизнес-процессами, а существуют лишь благодаря естественным образом заведенному порядку вещей. Но с приходом в организации компьютерных средств обработки информации бизнес-процессы этих организаций могут быть формализованы, описаны с помощью инструментов этих компьютерных средств, и, в конечном счете, автоматизированы.

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

    Наша условная организация, в частности, нуждается в автоматизации следующих бизнес-процессов:

  • Первый бизнес-процесс, который будет называться "Клиент", заключается в распределении клиентов по сотрудникам и в контроле за исполнением заказов и "прохождения" клиента по инстанциям организации. В нашем случае он выглядит следующим образом. Администратор салона красоты принимает заказ от клиента, пришедшего в салон или позвонившего по телефону. Клиент называет время, когда он хотел бы быть обслужен у мастера. Администратор передает информацию о клиенте определенному сотруднику – мастеру. Когда мастер выполнит заказанные клиентом работы, он передает сведения о результатах бухгалтеру, после чего бухгалтер получает от клиента оплату и на этом бизнес-процесс завершается.
  • Второй бизнес-процесс ("Отчет") заключается в подготовке всеми мастерами отчетов о проделанной работе. Мастерам, от директора организации, поступает задание на подготовку отчетов на текущий момент. После того, как мастера подготовят отчеты, эти отчеты передаются бухгалтеру, который готовит сводный отчет, и, после подготовки этого отчета, директор собирает весь коллектив для обсуждения результатов работы.
  • Третий бизнес-процесс "Закупка товаров". От директора поступает задание на закупку товаров. Задание может выполнить любой сотрудник отдела Парикмахерская. Сотрудник готовит смету, и, если стоимость приобретаемых товаров не превышает 10000 рублей, смета сразу же попадает на подпись к директору. Если же превышает – то перед тем, как попасть к директору, ее должен утвердить бухгалтер.
  • Четвертый бизнес-процесс "Поручение". От директора поступает поручение, адресованное конкретному сотруднику. Кроме того, может быть указан еще один сотрудник, который должен проконтролировать выполнение поручения. Бизнес-процесс завершается либо, если указан лишь исполнитель, после того, как поручение будет исполнено, либо, если указан исполнитель и контролер, после того, как оно будет исполнено, а исполнение будет проверено контролером.
  • Реализация бизнес-процесса "Клиент" и создание дополнительных объектов

    В 1С:Предприятие существуют два ключевых, для решения задач автоматизации бизнес-процессов, объекта. Первый из них так и называется – Бизнес-процесс. Второй объект – это Задача. Бизнес-процессы и задачи тесно взаимосвязаны.

    Объект Бизнес-процесс содержит в себе карту маршрута бизнес-процесса, при прохождении по карте создаются задачи, адресуемые тем или иным исполнителям. Создаваемые задачи – это объекты Задача.

    Кроме того, для реализации бизнес-процесса нужен регистр сведений, который называют регистром адресации. Этот регистр содержит сведения об организационной структуре организации, важные для распределения задач по исполнителям.

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

    Итак, для того, чтобы заставить механизмы бизнес-процессов работать, нам понадобятся следующие объекты:

  • Параметр сеанса
  • Регистр сведений
  • Задача
  • Бизнес-процесс
  • Начнем решение первой задачи по автоматизации бизнес-процесса "Клиент" с создания параметра сеанса и настройки механизма определения сотрудника, вошедшего в систему.

    Параметр сеанса

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

    Создадим новый параметр сеанса, назовем его .

    (рис 6.1) Параметр сеанса ТекущийПользователь

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

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

    Здесь мы выполняем поиск в справочнике Сотрудники по реквизиту Пользователь, в котором должно храниться имя пользователя системы в таком виде, в каком оно задано в списке пользователей в Конфигураторе. Функция ИмяПользователя() возвращает имя пользователя, вошедшего в систему в виде строки. Найдя элемент справочника Сотрудники, соответствующий пользователю, вошедшему в систему, мы записываем ссылку на найденный элемент в параметр сеанса Текущий пользователь.

    Для того, чтобы этот механизм работал правильно, приведем список пользователей (.

    (рис 6.2) Список пользователей

    Всем пользователям, кроме пользователя Администратор при настройке свойств пользователя назначим роль Сотрудник.

    Проконтролируем заполнение реквизита .

    (рис 6.3) Список сотрудников, заполнение реквизита Пользователь

    Кроме того, в ). Это приведет к тому, что при запуске нашей конфигурации из Конфигуратора, мы получим возможность выбирать пользователя для входа в систему.

    (рис 6.4) Установка, позволяющая выбирать пользователя при запуске из Конфигуратора.

    Мы выводили сообщение пользователю, пользуясь для этого процедурой ПриНачалеРаботыСистемы в модуле управляемого приложения. Мы получали содержимое константы СообщениеПользователю в серверной функции общего модуля СерверныеФункции и выводили его. Выполним подобную операцию для параметра сеанса ТекущийПользователь, реализуем ее с помощью функции ПолучитьПараметрСеанса(), ее код приведен ниже.

    Функция ПолучитьПараметрСеанса() Экспорт
      Попытка
        Возврат ("Параметр сеанса ТекущийПользователь установлен, вы идентифицированы как " + 
    ПараметрыСеанса.ТекущийПользователь.Наименование);
      Исключение
          Возврат ("Параметр сеанса ТекущийПользователь не установлен, вы вошли в систему как "+ ИмяПользователя());
      КонецПопытки;
     КонецФункции
    

    При попытке обращения к неинициализированному параметру сеанса генерируется исключение, поэтому мы, для обработки возможного исключения, используем конструкцию Попытка…Исключение…КонецПопытки. В блоке Попытка мы пытаемся возвратить текст сообщения, содержащего значение параметра сеанса. Если параметр сеанса инициализирован – пользователь увидит сообщение о его идентификации. Если параметр сеанса не установлен, то есть – пользователь, под которым мы вошли в систему, не связан ни с одним сотрудником, будет сгенерировано исключение и мы попадем в блок Исключение. В этом блоке мы сообщаем пользователю о том, что параметр сеанса не установлен и дополняем это сообщение именем пользователя, указанным при его входе в систему. В нашем случае блок Исключение сработает при входе в систему пользователя Администратор, так как он не связан ни с одним сотрудником из справочника Сотрудники.

    Код процедуры ПриНачалеРаботыСистемы в модуле управляемого приложения теперь приобретет такой вид:

    Процедура ПриНачалеРаботыСистемы()
       Сообщить(СерверныеФункции.ПолучитьКонстанту());
       Сообщить(СерверныеФункции.ПолучитьПараметрСеанса());
     КонецПроцедуры
    

    На рис 6.5 вы можете видеть результат работы этого кода.

    (рис 6.5) Сообщение пользователю о его идентификации

    Создадим новый справочник, назовем его ):

  • Администратор
  • Бухгалтер
  • Директор
  • Мастер
  • Расчетчик
  • (рис 6.6) Справочник Должности

    Регистр адресации

    Регистром адресации при организации работы бизнес-процессов является непериодический регистр сведений. Система использует его для определения адресатов задания – то есть – сотрудников, которым нужно назначить задания, созданные при работе бизнес-процесса. В основе структуры регистра, в частности – его измерений, по которым и осуществляется поиск адресатов, лежит обычно штатное расписание организации. В нашем случае руководство салона красоты, автоматизацией которого мы занимаемся, предоставило такое расписание:

    СотрудникПодразделениеДолжность
    Васильев П.П.АдминистрацияДиректор
    Александров А.А.АдминистрацияАдминистратор
    Иванов И.И.ПарикмахерскаяМастер
    Петров П.П.ПарикмахерскаяМастер
    Расчетчиков А.И.БухгалтерияРасчетчик
    Бухгалтерова В.В.БухгалтерияБухгалтер

    Создадим непериодический независимый регистр сведений, дадим ему имя ), включим его в состав подсистемы УчетРаботыМастеров.

    (рис 6.7) Регистр сведений Адресация

    Регистр должен содержать измерения, по которым планируется адресовать задачи. В нашем случае это – три измерения, рис 6.8):

    Сотрудник: Тип – СправочникСсылка.Сотрудники, Ведущее
    Подразделение: Тип – СправочникСсылка.Подразделения, Ведущее
    Должность: Тип – СправочникСсылка.Должности, Ведущее
    

    Исключим регистр Адресация из состава общего реквизита Организация.

    (рис 6.8) Регистр сведений Адресация, состав измерений

    Заполним регистр адресации в пользовательском режиме (рис 6.9) в соответствии с приведенным выше штатным расписанием.

    (рис 6.9) Регистр сведений Адресация, заполнение данными

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

    Задача

    Создадим новый объект Задача, назовем его УниверсальнаяЗадача, включим объект в подсистему УчетРаботыМастеров, исключим объект из состава общего реквизита Организация.

    Перейдем на вкладку ). Настроим свойства этой вкладки следующим образом:

    Адресация: выберем регистр сведений Адресация.
    Текущий исполнитель: параметр сеанса ТекущийПользователь
    В поле Реквизиты адресации добавим следующие реквизиты:
    Сотрудник: 
      Тип: СправочникСсылка.Сотрудники, 
      Измерение адресации: Сотрудник. 
      Измерение адресации позволяет связать реквизит адресации задачи с 
          соответствующим ему измерением регистра адресации.
    Подразделение:
      Тип: СправочникСсылка.Подразделения, 
      Измерение адресации: Подразделение.
    Должность: 
      Тип: СправочникСсылка.Должности, 
      Измерение адресации: Должность.
      Основной реквизит адресации: Сотрудник. 
      Этот реквизит мы можем выбрать после ввода состава реквизитов адресации задачи.
    
    (рис 6.10) Настройка задачи

    Перейдем на вкладку . Этот реквизит мы будем использовать для того, чтобы, при запуске бизнес-процесса, указывать задание для мастера – информацию о клиенте и услугах, которую он хочет получить, а так же о стоимости услуг.

    (рис 6.11) Настройка реквизитов задачи

    Перейдем на вкладку Формы, создадим форму списка задачи, согласившись с параметрами, предложенными по умолчанию, и, на этапе выбора состава элементов, включив отображение всех элементов. В свойствах реквизита формы Список установим в поле ОсновнаяТаблица параметр Задача.УниверсальнаяЗадача.ЗадачиПоИсполнителю. Благодаря этой установке при вызове формы списка автоматически будут открываться задачи, отобранные по исполнителю, то есть – задачи для того сотрудника, который вошел в систему, данные о котором были помещены в параметр сеанса.

    Добавим новую команду формы, назовем ее ПереключениеОтображенияЗадачПоИсполнителю, создадим обработчик команды, перетащим команду на панель инструментов формы, после чего создадим следующий код:

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

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

    На рис 6.12 вы можете видеть редактор формы списка и окно свойств реквизита Список.

    (рис 6.12) Настройка формы списка задачи

    Бизнес-процесс

    Создадим новый объект бизнес-процесс, назовем его .

    (рис 6.13) Создание Бизнес-процесса РаботаСКлиентами

    Логика бизнес-процесса подразумевает ввод некоторых данных при его создании. В частности, бизнес-процесс создает администратор парикмахерской, который задает информацию о клиенте, список услуг, которые хочет получить клиент, данные мастера, к которому направляют клиента, а так же – стоимость услуг и данные бухгалтера, который должен принять оплату. Все это мы реализуем, задав реквизиты бизнес-процесса. Как и в случае с другими объектами реквизиты бизнес-процессов задаются на вкладке ):

    Мастер: Тип: СправочникСсылка.Сотрудники
    КлиентИПереченьУслуг: Тип: Строка, Длина: 50
    ДатаИВремяЗаказа: Тип: Дата, Состав даты: Дата и время
    Бухгалтер: Тип: СправочникСсылка.Сотрудники
    СтоимостьУслуг: Тип: Число, Длина: 10, Точность: 2.
    
    (рис 6.14) Состав данных Бизнес-процесса РаботаСКлиентами

    Теперь займемся разработкой карты маршрута бизнес-процесса. Для этого перейдем на вкладку и панель инструментов Вставка элементов схемы.

    (рис 6.15) Начало создания карты маршрута бизнес-процесса

    Каждый бизнес-процесс должен иметь точку старта. Разместим элемент схемы Точка старта в верхней части карты. Рисование элементов карты маршрута ничем не отличается от рисования предопределенных фигур, например, в Microsoft Word. Точка старта не нуждается в дополнительной настройке.

    Следующий элемент схемы – это .

    (рис 6.16) Работа над картой маршрута бизнес-процесса

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

    Для того, чтобы отменить автоматическое создание задачи и создать задачу самостоятельно, мы можем воспользоваться обработчиком события точки маршрута ПередСозданиемЗадач(). Этот обработчик, кроме прочих, принимает на входе параметр СтандартнаяОбработка. Для того чтобы создать задачи программно, нам нужно установить этот параметр в значение Ложь, после чего создать необходимые задачи (в нашем случае – это одна задача, адресованная конкретному мастеру) и добавить созданные задачи (объекты типа ЗадачаОбъект) в массив ФормируемыеЗадачи. Вот как выглядит код этой процедуры, который располагается в модуле бизнес-процесса:

    Процедура ЗадачаДляМастераПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.УниверсальнаяЗадача.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.РаботаСКлиентами.ТочкиМаршрута.ЗадачаДляМастера;
      НоваяЗадача.Наименование = "БП1 - мастеру";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Мастер;
      НоваяЗадача.Задание
           ="Клиент "+КлиентИПереченьУслуг+" "+ДатаИВремяЗаказа;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Выражение вида НоваяЗадача.Сотрудник=Мастер присваивает реквизиту задачи значение реквизита бизнес-процесса. Мастер – это реквизит бизнес-процесса. Аналогично в данном коде выглядят остальные реквизиты бизнес-процеса.

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

    Создадим вторую точку действия, назовем ее ЗадачаДляБухгалтера. С ней мы поступим аналогичным образом – добавим новую задачу программным образом. Вот код соответствующей процедуры. В целом он аналогичен вышеописанному, за исключением того, что задача адресована бухгалтеру.

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

    После завершения работы с точкой .

    (рис 6.17) Карта маршрута бизнес-процесса

    После реализации логики бизнес-процесса, займемся его визуальным отображением – формой. Перейдем на вкладку .

    (рис 6.18) Карта маршрута бизнес-процесса

    В состав реквизитов формы добавим новый реквизит, назовем его КартаМаршрута, тип – ГрафическаяСхема. Разместим реквизит в форме, добавим обработчик события формы ПриСозданииНаСервере() следующего вида:

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

    Здесь мы сначала проверяем, создается ли новый бизнес-процесс (ссылка на него пока пуста) или мы открываем уже существующий бизнес-процесс. В первом случае мы записываем в реквизит КартаМаршрута карту маршрута, общую для всех бизнес-процессов типа РаботаСКлиентами, во втором – получаем карту маршрута для открываемого экземпляра бизнес-процесса.

    Модифицируем рабочую область .

    (рис 6.19) Отображение списка задач

    Если мы попытаемся войти в систему под учетной записью Администратор, появится сообщение об ошибке, так как при создании данной формы подразумевается наличие инициализированного параметра сеанса ТекущийПользователь. Перейдем в модуль формы списка объекта УниверсальнаяЗадача, добавим следующий код:

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

    Здесь мы пытаемся обратиться к параметру сеанса, если он инициализирован, исключение не происходит, форма открывается с параметрами, настроенными в конфигураторе, если параметр не инициализирован, генерируется исключение, в блоке Исключение мы устанавливаем для свойства ОсновнаяТаблица списка формы значение "Задача.УниверсальнаяЗадача" и блокируем кнопку ПереключениеОтображенияЗадачПоИсполнителю.

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

    Теперь настало время проверить наш бизнес-процесс на практике.

    Войдем в систему под учетной записью .

    (рис 6.20) Заполнение параметров нового бизнес-процесса

    После нажатия на кнопку Стартовать и закрыть, бизнес-процесс будет стартован. Откроем список задач (в данной ситуации мы можем просто перейти на закладку Рабочий стол) – он будет пуст, так как текущий пользователь не соответствует адресату задачи. Нажав на кнопку Переключение отображения задач по исполнителю, убедимся, что в списке присутствует невыполненная задача для мастера .

    (рис 6.21) Невыполненная задача в списке задач

    Теперь войдем в систему под учетной записью . Теперь новая задача появилась у бухгалтера.

    (рис 6.22) Выполненная задача мастера и продвижение бизнес-процесса по маршруту

    После того, как бухгалтер выполнит свою задачу, бизнес-процесс, при просмотре его в списке, будет помечен как завершенный, рис 6.23.

    (рис 6.23) Завершенный бизнес-процесс в списке

    Реализация бизнес-процесса "Отчет"

    Выше мы подготовили все необходимое для реализации этого бизнес-процесса. Опишем его логику. Бизнес-процесс инициирует директор. Он вводит задание для мастеров – подготовить отчет. В первой точке бизнес-процесса создается несколько заданий, которые рассылаются по мастерам. После того, как все мастера подготовят отчет, задание формируется уже для бухгалтера – подготовить сводный отчет. И, после того, как бухгалтер подготовит сводный отчет, формируется последнее задание – теперь уже для директора, который, собрав коллектив на совещание, ставит отметку о выполнении задания и бизнес-процесс завершается. При реализации данного бизнес-процесса мы будем пользоваться автоматическими средствами создания задач, но будем модифицировать некоторые их свойства уже после создания.

    Создадим новый бизнес-процесс, назовем его ОтчетОРаботе, на вкладке Основные выберем задачу УниверсальнаяЗадача, включим бизнес-процесс в состав подсистемы УчетРаботыМастеров.

    Создадим один реквизит бизнес-процесса – Задание, тип – Строка, длина – 100.

    Создадим карту бизнес-процесса. Первую точку действия назовем ЗаданияДляМастеров. Установим ее свойства:

    Групповая: включено
    Подразделение: Парикмахерская
    Должность: Мастер
    

    Благодаря включению признака .

    (рис 6.24) Точка маршрута бизнес-процесса, создающая несколько задач

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

    Мы предусмотрели реквизит бизнес-процесса, который называется Задание. Хотя задачи создаются автоматически, мы можем вмешиваться в этот процесс, в частности, программным путем редактируя их свойства в обработчике события ПриСозданииЗадач. Введем в обработчик такой код:

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

    Здесь мы перебираем массив созданных задач и записываем в них задание, указанное директором при старте бизнес-процесса, а так же – указываем наименование задачи.

    Создадим вторую точку действия, назовем ее ЗаданиеБухгалтеру. Заполним ее реквизиты следующим образом:

    Должность: Бухгалтер.
    Подразделение: Бухгалтерия.
    

    Откроем обработчик ПриСозданииЗадач, введем в него такой код:

    Процедура ЗаданиеБухгалтеруПриСозданииЗадач
    (ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
      Для каждого Задача из ФормируемыеЗадачи Цикл
        Задача.Задание="Подготовить сводный отчет";
        Задача.Наименование="БП2 - бухгалтеру";
      КонецЦикла
    КонецПроцедуры
    

    Теперь создадим третью точку бизнес-процесса, ЗадачаДиректору. Она будет адресована директору – реквизит Должность установим в значение Директор. В коде ПриСозданииЗадач запишем следующее:

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

    Добавим точку завершения бизнес-процесса.

    Создадим форму бизнес-процесса так же, как мы создавали форму для вышеописанного бизнес-процесса.

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

    (рис 6.25) Дополнение регистра адресации

    После запуска бизнес-процесса создаются две задачи – по числу мастеров, работающих в парикмахерской, рис 6.26.

    (рис 6.26) Задачи для нескольких пользователей, созданные бизнес-процессом

    Здесь мы отключили отбор по исполнителю для того, чтобы увидеть все задачи.

    После того, как мастера подготовят отчеты, задание поступит бухгалтеру. И, наконец, когда бухгалтер справится со своей частью работы, директор получит сообщение о том, что сводный отчет по выданному им заданию готов.

    Реализация бизнес-процесса "Закупка материалов"

    Для решения этой задачи дополним нашу конфигурацию новым документом. Назовем его СметаЗакупкиМатериалов, включим в подсистему УчетРаботыМастеров. Документ будет иметь три реквизита:

    СоставСметы: Строка, Длина 100.
    ОбщаяСтоимость: Число, длина 10, точность 2.
    СогласованоПриПревышении: Булево
    

    Ограничимся этими настройками, рис 6.27.

    (рис 6.27) Документ СметаЗакупкиМатериалов

    Создадим новый бизнес-процесс ЗакупкаМатериалов. В качестве задачи укажем объект УниверсальнаяЗадача, включим бизнес-процесс в подсистему УчетРаботыМастеров

    Создадим реквизит ).

    (рис 6.28) Реквизит бизнес-процесса ЗакупкаМатериалов

    Создадим форму бизнес-процесса по уже известной вам технологии, рис 6.29.

    (рис 6.29) Форма бизнес-процесса

    Приступим к созданию карты маршрута бизнес-процесса. Для удобства на рис 6.30. приведена готовая карта маршрута.

    (рис 6.30) Карта маршрута бизнес-процесса

    Начнем с точки Старт. Добавим соответствующий элемент схемы, но для этого бизнес-процесса подвергнем точку старта дополнительной настройке. В частности, наш бизнес-процесс будет основан на работе с документом СметаЗакупкиМатериалов, ссылка на один из таких документов должна храниться в реквизите Смета бизнес-процесса. Если директор, создавая бизнес-процесс, не укажет смету, это приведет к невозможности работы. Так как смета создается изначально пустой, содержащей лишь номер документа и дату, мы можем, в том случае, если документ сметы не указан, создать ее автоматически. Для этого мы воспользуемся обработчиком события Перед стартом точки старта:

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

    Если документ сметы не задан – создаем его программно перед стартом бизнес-процесса и записываем ссылку на него в реквизит Смета.

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

    (рис 6.31) Дополненный регистр адресации

    Доработаем объект УниверсальнаяЗадача специально для использования универсальной задачи с бизнес-процессом ЗакупкаМатериалов. Нам нужно, чтобы пользователь мог из формы задачи, в том случае, если задача создана бизнес-процессом ЗакупкаМатериалов, открывать документ СметаЗакупкиМатериалов, связанный с бизнес-процессом. Добавим в состав команд формы задачи новую команду, назовем ее ОткрытьСмету. Создадим обработчик для этой команды, перетащим задачу на форму и отключим ее свойство Видимость.

    В модуле формы создадим обработчик ПриОткрытии, приведем его к следующему виду:

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

    Здесь мы делаем видимой кнопку ОткрытьСмету в том случае, если задача имеет отношение к бизнес-процессу ЗакупкаМатериалов, сообщаем пользователю о том, что от него потребуется работа с документом, который можно увидеть, нажав на кнопку Открыть смету.

    В обработчик ОткрытьСмету добавим следующий код, создадим некоторые вспомогательные функции:

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

    Мы, с помощью серверной функции ПолучитьСсылкуНаСмету(), получаем ссылку на документ СметаЗакупкиМатериалов, указанный при создании бизнес-процесса.

    Кроме того, мы определяем имя точки бизнес-процесса и в соответствии с именем точки (функция СообщениеДляПользователя) формируем текст сообщения для пользователя.

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

    Внесение изменений в документ не влияет на выполнение задачи сотрудника парикмахерской. Но содержимое документа повлияет на дальнейший ход бизнес-процесса. В частности, по условию было сказано, что при превышении общей стоимости материалов по смете 10000 рублей смета должна попасть на согласование к директору. Если стоимость меньше этой суммы – она направляется напрямую к бухгалтеру, который должен выдать деньги.

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

    Добавим на карту точку условия, назовем ее ПроверкаСуммыСметы и зададим такой код вышеуказанному обработчику:

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

    Здесь мы инициализировали переменную ОбщаяСтоимостьБольшеЗаданной значением Ложь, проверили условие, и при выполнении условия присваиваем ей значение Истина. После чего записываем значение переменной в Результат.

    Если процесс пошел по ветви Нет, то есть, дополнительных согласований не требуется, создается задача для бухгалтера. Добавим точку действия ЗаданиеБухгалтеру, в реквизитах адресации укажем Подразделение: Бухгалтерия, Должность: Бухгалтер.

    Добавим на карту точку завершения бизнес-процесса, назовем ее УспешноеЗавершение. В ее обработчике При завершении создадим такой код:

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

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

    После того, как директор поработает с документом и зафиксирует факт выполнения задачи, проверяется еще одно условие (точка условия УтвержденаЛиСмета). Здесь используется реквизит документа СогласованоПриПревышении:

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

    Если документ согласован, мы проходим по ветви Да и создаем уже обсужденное задание для бухгалтера. Если документ не согласован, мы приходим к точке окончания, названной ЗавершениеБезУтвержденияСметы, со следующим обработчиком При завершении:

    Процедура ЗавершениеБезУтвержденияСметыПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
      Сообщить("Бизнес-процесс  завершен, смета не прошла согласование");
    КонецПроцедуры
    

    Бизнес-процесс "Поручение"

    Создадим новый объект Задача, назовем его ЗадачаДляПоручения, включим в состав подсистемы УчетРаботыМастеров

    На закладке ) укажем следующее:

    Адресация: выберем регистр сведений Адресация.
    Текущий исполнитель: параметр сеанса ТекущийПользователь
    В поле Реквизиты адресации добавим реквизит:
    Сотрудник: 
      Тип: СправочникСсылка.Сотрудники, 
      Измерение адресации: Сотрудник. 
        Измерение адресации позволяет связать реквизит адресации задачи с 
          соответствующим ему измерением регистра адресации.
      Основной реквизит адресации: Сотрудник. 
        Этот реквизит мы можем выбрать после ввода состава реквизитов адресации 
          задачи.
    
    (рис 6.32) Настройка адресации задачи ЗадачаДляПоручения

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

    Создадим бизнес-процесс Поручение, в качестве задачи установим для него задачу ЗадачаДляПоручения, включим его в состав подсистемы УчетРаботыМастеров.

    Перейдем на закладку ):

    Исполнитель, Тип: СправочникСсылка.Сотрудники
    Контролер, Тип: СправочникСсылка.Сотрудники
    НуженПараллельныйКонтроль, Тип: Булево
    ОписаниеЗадания, Тип: Строка, длина – 50
    РезультатПроверки, Тип: Булево
    
    (рис 6.33) Настройка реквизитов бизнес-процесса Поручение.

    Форму бизнес-процесса можно создать по уже известной вам технологии, можно ограничиться формой, создаваемой автоматически.

    Создадим карту маршрута бизнес-процесса, рис 6.34.

    (рис 6.34) Карта маршрута бизнес-процесса Поручение.

    На карте этого бизнес-процесса мы использовали два новых элемента. Это – точки разделения и слияния. Когда бизнес-процесс доходит до точки разделения, ход его выполнения разветвляется. В нашем случае мы создаем две задачи в точке разделения – в том случае, если при старте бизнес-процесса указано, что требуется параллельный контроль. Ход процесса после прохождения им точки разделения, делится на две точки действия, каждая из которых создает собственные задачи.

    Создадим точку старта, она носит имя Старт, присвоенное по умолчанию, дополнительных настроек для нее мы не производим.

    Создадим точку условия, назовем ее НуженПараллельныйКонтроль, зададим обработчик ПроверкаУсловия:

    Процедура НуженПараллельныйКонтрольПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
      Результат=НуженПараллельныйКонтроль;
    КонецПроцедуры
    

    В этой точке мы принимаем решение о движении по одной из ее ветвей на основе присвоения параметру Результат значения реквизита бизнес-процесса НуженПараллельныйКонтроль. Если реквизит установлен в значение Истина – выполнение бизнес-процесса продолжается по ветви точки условия Да, если ложь – по ветви Нет.

    Создадим точку действия, назовем ее ЗаданиеИсполнителю, соединим с ней ветвь Нет точки условия НуженПараллельныйКонтроль. Зададим обработчик ПередСозданиемЗадачи для этой точки:

    Процедура ЗаданиеИсполнителюПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеИсполнителю;
      НоваяЗадача.Наименование = "БП4 - исполнителю";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Исполнитель;
      НоваяЗадача.Задание="Задание для выполнения:"+ОписаниеЗадания;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Эта процедура формирует задание для исполнителя, указанного при старте бизнес-процесса.

    Создадим точку условия, назовем ее НуженКонтроль, соединим с ней выходную линию точки ЗаданиеИсполнителю и зададим обработчик ПроверкаУсловия:

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

    Если поле Контролер при старте бизнес-процесса не заполнено, то, очевидно, контроль не нужен – в таком случае мы идем по ветви Нет и попадаем в точку завершения бизнес-процесса (Создадим точку завершения с именем Завершение). В противном случае, идем по ветви Да.

    Создадим точку действия ЗаданиеКонтролеру, соединим с ним ветвь Да точки условия НуженКонтроль. Зададим обработчик ПередСозданиемЗадач:

    Процедура ЗаданиеКонтролеруПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеКонтролеру;
      НоваяЗадача.Наименование = "БП4 - контролеру, обычный контроль";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Контролер;
      НоваяЗадача.Задание="Проконтролируйте задание:"+ОписаниеЗадания
          +", выполненное "+Исполнитель.Наименование;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Здесь мы обычными средствами создаем новую задачу для заданного при старте бизнес-процесса контролера.

    Создадим для точки действия ЗаданиеКонтролеру обработчик ПриВыполнении:

    Процедура ЗаданиеКонтролеруПриВыполнении
    (ТочкаМаршрутаБизнесПроцесса, Задача, Отказ)
      РезультатПроверки=Задача.РезультатПроверки;
      Записать();
    КонецПроцедуры
    

    Запишем в реквизит бизнес-процесса значение реквизита задачи РезультатПроверки.

    Создадим точку условия КонтрольПройден, соединим с ней выходную линию точки ЗаданиеКонтролеру, напишем следующую процедуру ПроверкаУсловия:

    Процедура КонтрольПройденПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
      Результат=РезультатПроверки;
    КонецПроцедуры
    

    Если реквизит бизнес-процесса РезультатПроверки будет установлен в значение Истина, то есть – проверка выполнения задания пройдена, мы уйдем по ветви Да, которую следует соединить с точкой завершения бизнес-процесса, к завершению.

    Если же результат проверки оказался отрицательным, мы уходим по ветви Нет к точке условия НуженПараллельныйКонтроль, в которой, анализируя данные бизнес-процесса, снова приступаем к выдаче задания исполнителю, и, если нужно, контролеру.

    На данный момент точка НуженПараллельныйКонтроль не имеет точек, связанных с ее выходом Да. Создадим новую точку разделения, оставим ее имя по умолчанию Разделение1, создадим две точки действия, одну назовем ЗаданиеИсполнителю1, вторую – ЗаданиеКонтролеру1 и присоединим к этим точкам действия выходные линии точки разделения.

    Для точки действия ЗаданиеИсполнителю1 зададим следующий обработчик ПередСозданиемЗадач:

    Процедура ЗаданиеИсполнителю1ПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеИсполнителю1;
      НоваяЗадача.Наименование = "БП4 - исполнителю, параллельный контроль";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Исполнитель;
      НоваяЗадача.Задание="Задание для выполнения: "+ОписаниеЗадания;
      ФормируемыеЗадачи.Добавить(НоваяЗадача)
    КонецПроцедуры
    

    Мы создаем задание для исполнителя, указывая в наименовании создаваемой задачи наличие параллельного контроля.

    Для точки действия ЗаданиеКонтролеру1 зададим такой код:

    Процедура ЗаданиеКонтролеру1ПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
      СтандартнаяОбработка=Ложь;
      НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
      НоваяЗадача.БизнесПроцесс = Ссылка;
      НоваяЗадача.ТочкаМаршрута 
          = БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеКонтролеру1;
      НоваяЗадача.Наименование = "БП4 - контролеру, параллельный контроль";
      НоваяЗадача.Дата=ТекущаяДата();
      НоваяЗадача.Сотрудник=Контролер;
      НоваяЗадача.Задание="Проконтролируйте задание: "
          +ОписаниеЗадания+", выполняемое "+Исполнитель.Наименование;
      ФормируемыеЗадачи.Добавить(НоваяЗадача);
    КонецПроцедуры
    

    Здесь так же мы указываем, что контроль будет выполняться параллельно.

    Создадим новую точку слияния (с именем по умолчанию Слияние1), подключим к ее входу выходы элементов ЗаданиеИсполнителю1 и ЗаданиеКонтролеру1, а выход подключим к точке условия КонтрольПройден. В этой точке, напомним, мы анализируем реквизит бизнес-процесса РезультатПроверки. Реализуем заполнение реквизита бизнес-процесса РезультатПроверки в модуле формы задачи ЗадачаДляПоручения. Для этого создадим форму задачи и в ней – обработчик события ПередВыполнением():

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

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

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

    Выводы

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

    Видеоурок

    Для данной лекции подготовлен видеоурок.

    Вернуться к учебному плану