Цель лекции: научиться автоматизировать бизнес-процессы с использованием средств 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.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.31) Дополненный регистр адресации
Доработаем объект УниверсальнаяЗадача специально для использования универсальной задачи с бизнес-процессом ЗакупкаМатериалов. Нам нужно, чтобы пользователь мог из формы задачи, в том случае, если задача создана бизнес-процессом ЗакупкаМатериалов, открывать документ СметаЗакупкиМатериалов, связанный с бизнес-процессом. Добавим в состав команд формы задачи новую команду, назовем ее ОткрытьСмету. Создадим обработчик для этой команды, перетащим задачу на форму и отключим ее свойство Видимость.
В модуле формы создадим обработчик ПриОткрытии, приведем его к следующему виду:
НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПроверкаБизнесПроцесса() Тогда
Элементы.ОткрытьСмету.Видимость=Истина;
Предупреждение("Требуется работа с документом Смета закупки материалов, воспользуйтесь кнопкой Открыть смету");
КонецЕсли;
КонецПроцедуры
НаСервере
Функция ПроверкаБизнесПроцесса()
Если
ТипЗнч(Объект.БизнесПроцесс)
=ТипЗнч(БизнесПроцессы.ЗакупкаМатериалов.ПустаяСсылка())
Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Здесь мы делаем видимой кнопку ОткрытьСмету в том случае, если задача имеет отношение к бизнес-процессу ЗакупкаМатериалов, сообщаем пользователю о том, что от него потребуется работа с документом, который можно увидеть, нажав на кнопку Открыть смету.
В обработчик ОткрытьСмету добавим следующий код, создадим некоторые вспомогательные функции:
НаКлиенте
Процедура ОткрытьСмету(Команда)
ОткрытьЗначение(ПолучитьСсылкуНаСмету());
Предупреждение(СообщениеДляПользователя());
КонецПроцедуры
НаСервере
Функция ПолучитьСсылкуНаСмету()
Возврат Объект.БизнесПроцесс.Смета;
КонецФункции
НаСервере
Функция СообщениеДляПользователя()
Если Объект.ТочкаМаршрута.Имя="СоставлениеСметы" Тогда
Возврат "Составьте, пожалуйста, смету и отметьте задачу как выполненную
после составления.";
ИначеЕсли Объект.ТочкаМаршрута.Имя="ЗаданиеБухгалтеру" Тогда
Возврат "Выдайте, пожалуйста, денежные средства и отметьте задачу как
выполненную.";
ИначеЕсли Объект.ТочкаМаршрута.Имя="ЗаданиеДиректору" Тогда
Возврат "Общая стоимость материалов по смете превышает 10000.
Пожалуйста, утвердите или отклоните смету.";
КонецЕсли;
КонецФункции
Мы, с помощью серверной функции ПолучитьСсылкуНаСмету(), получаем ссылку на документ СметаЗакупкиМатериалов, указанный при создании бизнес-процесса.
Кроме того, мы определяем имя точки бизнес-процесса и в соответствии с именем точки (функция СообщениеДляПользователя) формируем текст сообщения для пользователя.
Пользователь должен, при выполнении задачи, произвести некоторые действия с документом, после чего отметить задачу как выполненную.
Внесение изменений в документ не влияет на выполнение задачи сотрудника парикмахерской. Но содержимое документа повлияет на дальнейший ход бизнес-процесса. В частности, по условию было сказано, что при превышении общей стоимости материалов по смете 10000 рублей смета должна попасть на согласование к директору. Если стоимость меньше этой суммы – она направляется напрямую к бухгалтеру, который должен выдать деньги.
Для решения подобных задач в Да, либо Нет. Выбор выполняется программно, в обработчике события Проверка условия. Для того, чтобы направить бизнес-процесс по ветви Да, параметру Результат следует присвоить значение Истина, для продвижения по ветви Нет – Ложь.
Добавим на карту точку условия, назовем ее ПроверкаСуммыСметы и зададим такой код вышеуказанному обработчику:
Процедура ПроверкаСуммыСметыПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
ОбщаяСтоимостьБольшеЗаданной = Ложь;
Если Смета.ОбщаяСтоимость>10000 Тогда
ОбщаяСтоимостьБольшеЗаданной=Истина;
КонецЕсли;
Результат=ОбщаяСтоимостьБольшеЗаданной
КонецПроцедуры
Здесь мы инициализировали переменную ОбщаяСтоимостьБольшеЗаданной значением Ложь, проверили условие, и при выполнении условия присваиваем ей значение Истина. После чего записываем значение переменной в Результат.
Если процесс пошел по ветви Нет, то есть, дополнительных согласований не требуется, создается задача для бухгалтера. Добавим точку действия ЗаданиеБухгалтеру, в реквизитах адресации укажем Подразделение: Бухгалтерия, Должность: Бухгалтер.
Добавим на карту точку завершения бизнес-процесса, назовем ее УспешноеЗавершение. В ее обработчике При завершении создадим такой код:
Процедура УспешноеЗавершениеПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
Сообщить("Бизнес-процесс успешно завершен, по смете выдано "+Смета.ОбщаяСтоимость+" рублей");
КонецПроцедуры
Вернемся к проверке условия на предельную сумму сметы, проходящую в бухгалтерию без согласования. Если сумма больше 10000, документ отправляется на согласование к директору после перехода по ветви Нет точки условия ПроверкаСуммыСметы. Здесь находится точка действия ЗаданиеДиректору, в параметрах адресации которой указано Должность: Директор,
После того, как директор поработает с документом и зафиксирует факт выполнения задачи, проверяется еще одно условие (точка условия УтвержденаЛиСмета). Здесь используется реквизит документа СогласованоПриПревышении:
Процедура УтвержденаЛиСметаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Результат=Смета.СогласованоПриПревышении; КонецПроцедуры
Если документ согласован, мы проходим по ветви Да и создаем уже обсужденное задание для бухгалтера. Если документ не согласован, мы приходим к точке окончания, названной ЗавершениеБезУтвержденияСметы, со следующим обработчиком При завершении:
Процедура ЗавершениеБезУтвержденияСметыПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
Сообщить("Бизнес-процесс завершен, смета не прошла согласование");
КонецПроцедуры
Создадим новый объект Задача, назовем его ЗадачаДляПоручения, включим в состав подсистемы УчетРаботыМастеров
На закладке ) укажем следующее:
Адресация: выберем регистр сведений Адресация.
Текущий исполнитель: параметр сеанса ТекущийПользователь
В поле Реквизиты адресации добавим реквизит:
Сотрудник:
Тип: СправочникСсылка.Сотрудники,
Измерение адресации: Сотрудник.
Измерение адресации позволяет связать реквизит адресации задачи с
соответствующим ему измерением регистра адресации.
Основной реквизит адресации: Сотрудник.
Этот реквизит мы можем выбрать после ввода состава реквизитов адресации
задачи.
(рис 6.32) Настройка адресации задачи ЗадачаДляПоручения
Создадим форму списка задачи по вышеописанной технологии – с возможностью показа задач по исполнителям и с возможностью переключения формы на просмотр всех задач.
Создадим бизнес-процесс Поручение, в качестве задачи установим для него задачу ЗадачаДляПоручения, включим его в состав подсистемы УчетРаботыМастеров.
Перейдем на закладку ):
Исполнитель, Тип: СправочникСсылка.Сотрудники Контролер, Тип: СправочникСсылка.Сотрудники НуженПараллельныйКонтроль, Тип: Булево ОписаниеЗадания, Тип: Строка, длина – 50 РезультатПроверки, Тип: Булево
(рис 6.33) Настройка реквизитов бизнес-процесса Поручение.
Форму бизнес-процесса можно создать по уже известной вам технологии, можно ограничиться формой, создаваемой автоматически.
Создадим
(рис 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.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.31) Дополненный регистр адресации
Доработаем объект УниверсальнаяЗадача специально для использования универсальной задачи с бизнес-процессом ЗакупкаМатериалов. Нам нужно, чтобы пользователь мог из формы задачи, в том случае, если задача создана бизнес-процессом ЗакупкаМатериалов, открывать документ СметаЗакупкиМатериалов, связанный с бизнес-процессом. Добавим в состав команд формы задачи новую команду, назовем ее ОткрытьСмету. Создадим обработчик для этой команды, перетащим задачу на форму и отключим ее свойство Видимость.
В модуле формы создадим обработчик ПриОткрытии, приведем его к следующему виду:
НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПроверкаБизнесПроцесса() Тогда
Элементы.ОткрытьСмету.Видимость=Истина;
Предупреждение("Требуется работа с документом Смета закупки материалов, воспользуйтесь кнопкой Открыть смету");
КонецЕсли;
КонецПроцедуры
НаСервере
Функция ПроверкаБизнесПроцесса()
Если
ТипЗнч(Объект.БизнесПроцесс)
=ТипЗнч(БизнесПроцессы.ЗакупкаМатериалов.ПустаяСсылка())
Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Здесь мы делаем видимой кнопку ОткрытьСмету в том случае, если задача имеет отношение к бизнес-процессу ЗакупкаМатериалов, сообщаем пользователю о том, что от него потребуется работа с документом, который можно увидеть, нажав на кнопку Открыть смету.
В обработчик ОткрытьСмету добавим следующий код, создадим некоторые вспомогательные функции:
НаКлиенте
Процедура ОткрытьСмету(Команда)
ОткрытьЗначение(ПолучитьСсылкуНаСмету());
Предупреждение(СообщениеДляПользователя());
КонецПроцедуры
НаСервере
Функция ПолучитьСсылкуНаСмету()
Возврат Объект.БизнесПроцесс.Смета;
КонецФункции
НаСервере
Функция СообщениеДляПользователя()
Если Объект.ТочкаМаршрута.Имя="СоставлениеСметы" Тогда
Возврат "Составьте, пожалуйста, смету и отметьте задачу как выполненную
после составления.";
ИначеЕсли Объект.ТочкаМаршрута.Имя="ЗаданиеБухгалтеру" Тогда
Возврат "Выдайте, пожалуйста, денежные средства и отметьте задачу как
выполненную.";
ИначеЕсли Объект.ТочкаМаршрута.Имя="ЗаданиеДиректору" Тогда
Возврат "Общая стоимость материалов по смете превышает 10000.
Пожалуйста, утвердите или отклоните смету.";
КонецЕсли;
КонецФункции
Мы, с помощью серверной функции ПолучитьСсылкуНаСмету(), получаем ссылку на документ СметаЗакупкиМатериалов, указанный при создании бизнес-процесса.
Кроме того, мы определяем имя точки бизнес-процесса и в соответствии с именем точки (функция СообщениеДляПользователя) формируем текст сообщения для пользователя.
Пользователь должен, при выполнении задачи, произвести некоторые действия с документом, после чего отметить задачу как выполненную.
Внесение изменений в документ не влияет на выполнение задачи сотрудника парикмахерской. Но содержимое документа повлияет на дальнейший ход бизнес-процесса. В частности, по условию было сказано, что при превышении общей стоимости материалов по смете 10000 рублей смета должна попасть на согласование к директору. Если стоимость меньше этой суммы – она направляется напрямую к бухгалтеру, который должен выдать деньги.
Для решения подобных задач в Да, либо Нет. Выбор выполняется программно, в обработчике события Проверка условия. Для того, чтобы направить бизнес-процесс по ветви Да, параметру Результат следует присвоить значение Истина, для продвижения по ветви Нет – Ложь.
Добавим на карту точку условия, назовем ее ПроверкаСуммыСметы и зададим такой код вышеуказанному обработчику:
Процедура ПроверкаСуммыСметыПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
ОбщаяСтоимостьБольшеЗаданной = Ложь;
Если Смета.ОбщаяСтоимость>10000 Тогда
ОбщаяСтоимостьБольшеЗаданной=Истина;
КонецЕсли;
Результат=ОбщаяСтоимостьБольшеЗаданной
КонецПроцедуры
Здесь мы инициализировали переменную ОбщаяСтоимостьБольшеЗаданной значением Ложь, проверили условие, и при выполнении условия присваиваем ей значение Истина. После чего записываем значение переменной в Результат.
Если процесс пошел по ветви Нет, то есть, дополнительных согласований не требуется, создается задача для бухгалтера. Добавим точку действия ЗаданиеБухгалтеру, в реквизитах адресации укажем Подразделение: Бухгалтерия, Должность: Бухгалтер.
Добавим на карту точку завершения бизнес-процесса, назовем ее УспешноеЗавершение. В ее обработчике При завершении создадим такой код:
Процедура УспешноеЗавершениеПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
Сообщить("Бизнес-процесс успешно завершен, по смете выдано "+Смета.ОбщаяСтоимость+" рублей");
КонецПроцедуры
Вернемся к проверке условия на предельную сумму сметы, проходящую в бухгалтерию без согласования. Если сумма больше 10000, документ отправляется на согласование к директору после перехода по ветви Нет точки условия ПроверкаСуммыСметы. Здесь находится точка действия ЗаданиеДиректору, в параметрах адресации которой указано Должность: Директор,
После того, как директор поработает с документом и зафиксирует факт выполнения задачи, проверяется еще одно условие (точка условия УтвержденаЛиСмета). Здесь используется реквизит документа СогласованоПриПревышении:
Процедура УтвержденаЛиСметаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Результат=Смета.СогласованоПриПревышении; КонецПроцедуры
Если документ согласован, мы проходим по ветви Да и создаем уже обсужденное задание для бухгалтера. Если документ не согласован, мы приходим к точке окончания, названной ЗавершениеБезУтвержденияСметы, со следующим обработчиком При завершении:
Процедура ЗавершениеБезУтвержденияСметыПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
Сообщить("Бизнес-процесс завершен, смета не прошла согласование");
КонецПроцедуры
Создадим новый объект Задача, назовем его ЗадачаДляПоручения, включим в состав подсистемы УчетРаботыМастеров
На закладке ) укажем следующее:
Адресация: выберем регистр сведений Адресация.
Текущий исполнитель: параметр сеанса ТекущийПользователь
В поле Реквизиты адресации добавим реквизит:
Сотрудник:
Тип: СправочникСсылка.Сотрудники,
Измерение адресации: Сотрудник.
Измерение адресации позволяет связать реквизит адресации задачи с
соответствующим ему измерением регистра адресации.
Основной реквизит адресации: Сотрудник.
Этот реквизит мы можем выбрать после ввода состава реквизитов адресации
задачи.
(рис 6.32) Настройка адресации задачи ЗадачаДляПоручения
Создадим форму списка задачи по вышеописанной технологии – с возможностью показа задач по исполнителям и с возможностью переключения формы на просмотр всех задач.
Создадим бизнес-процесс Поручение, в качестве задачи установим для него задачу ЗадачаДляПоручения, включим его в состав подсистемы УчетРаботыМастеров.
Перейдем на закладку ):
Исполнитель, Тип: СправочникСсылка.Сотрудники Контролер, Тип: СправочникСсылка.Сотрудники НуженПараллельныйКонтроль, Тип: Булево ОписаниеЗадания, Тип: Строка, длина – 50 РезультатПроверки, Тип: Булево
(рис 6.33) Настройка реквизитов бизнес-процесса Поручение.
Форму бизнес-процесса можно создать по уже известной вам технологии, можно ограничиться формой, создаваемой автоматически.
Создадим
(рис 6.34) Карта маршрута бизнес-процесса Поручение.
На карте этого бизнес-процесса мы использовали два новых элемента. Это – точки разделения и слияния. Когда бизнес-процесс доходит до точки разделения, ход его выполнения разветвляется. В нашем случае мы создаем две задачи в точке разделения – в том случае, если при старте бизнес-процесса указано, что требуется параллельный контроль. Ход процесса после прохождения им точки разделения, делится на две точки действия, каждая из которых создает собственные задачи.
Создадим точку старта, она носит имя Старт, присвоенное по умолчанию, дополнительных настроек для нее мы не производим.
Создадим точку условия, назовем ее НуженПараллельныйКонтроль, зададим обработчик ПроверкаУсловия:
Процедура НуженПараллельныйКонтрольПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Результат=НуженПараллельныйКонтроль; КонецПроцедуры
В этой точке мы принимаем решение о движении по одной из ее ветвей на основе присвоения параметру Результат значения реквизита бизнес-процесса НуженПараллельныйКонтроль. Если реквизит установлен в значение Истина – выполнение бизнес-процесса продолжается по ветви точки условия Да, если ложь – по ветви Нет.
Создадим точку действия, назовем ее ЗаданиеИсполнителю, соединим с ней ветвь Нет точки условия НуженПараллельныйКонтроль. Зададим обработчик ПередСозданиемЗадачи для этой точки:
Процедура ЗаданиеИсполнителюПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = Ссылка;
НоваяЗадача.ТочкаМаршрута
= БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеИсполнителю;
НоваяЗадача.Наименование = "БП4 - исполнителю";
НоваяЗадача.Дата=ТекущаяДата();
НоваяЗадача.Сотрудник=Исполнитель;
НоваяЗадача.Задание="Задание для выполнения:"+ОписаниеЗадания;
ФормируемыеЗадачи.Добавить(НоваяЗадача);
КонецПроцедуры
Эта процедура формирует задание для исполнителя, указанного при старте бизнес-процесса.
Создадим точку условия, назовем ее НуженКонтроль, соединим с ней выходную линию точки ЗаданиеИсполнителю и зададим обработчик ПроверкаУсловия:
Процедура НуженКонтрольПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)
Если Контролер.Пустая() Тогда
Результат=Ложь;
Иначе
Результат=Истина;
КонецЕсли;
КонецПроцедуры
Если поле Контролер при старте бизнес-процесса не заполнено, то, очевидно, контроль не нужен – в таком случае мы идем по ветви Нет и попадаем в точку завершения бизнес-процесса (Создадим точку завершения с именем Завершение). В противном случае, идем по ветви Да.
Создадим точку действия ЗаданиеКонтролеру, соединим с ним ветвь Да точки условия НуженКонтроль. Зададим обработчик ПередСозданиемЗадач:
Процедура ЗаданиеКонтролеруПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = Ссылка;
НоваяЗадача.ТочкаМаршрута
= БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеКонтролеру;
НоваяЗадача.Наименование = "БП4 - контролеру, обычный контроль";
НоваяЗадача.Дата=ТекущаяДата();
НоваяЗадача.Сотрудник=Контролер;
НоваяЗадача.Задание="Проконтролируйте задание:"+ОписаниеЗадания
+", выполненное "+Исполнитель.Наименование;
ФормируемыеЗадачи.Добавить(НоваяЗадача);
КонецПроцедуры
Здесь мы обычными средствами создаем новую задачу для заданного при старте бизнес-процесса контролера.
Создадим для точки действия ЗаданиеКонтролеру обработчик ПриВыполнении:
Процедура ЗаданиеКонтролеруПриВыполнении (ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) РезультатПроверки=Задача.РезультатПроверки; Записать(); КонецПроцедуры
Запишем в реквизит бизнес-процесса значение реквизита задачи РезультатПроверки.
Создадим точку условия КонтрольПройден, соединим с ней выходную линию точки ЗаданиеКонтролеру, напишем следующую процедуру ПроверкаУсловия:
Процедура КонтрольПройденПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Результат=РезультатПроверки; КонецПроцедуры
Если реквизит бизнес-процесса РезультатПроверки будет установлен в значение Истина, то есть – проверка выполнения задания пройдена, мы уйдем по ветви Да, которую следует соединить с точкой завершения бизнес-процесса, к завершению.
Если же результат проверки оказался отрицательным, мы уходим по ветви Нет к точке условия НуженПараллельныйКонтроль, в которой, анализируя данные бизнес-процесса, снова приступаем к выдаче задания исполнителю, и, если нужно, контролеру.
На данный момент точка НуженПараллельныйКонтроль не имеет точек, связанных с ее выходом Да. Создадим новую точку разделения, оставим ее имя по умолчанию Разделение1, создадим две точки действия, одну назовем ЗаданиеИсполнителю1, вторую – ЗаданиеКонтролеру1 и присоединим к этим точкам действия выходные линии точки разделения.
Для точки действия ЗаданиеИсполнителю1 зададим следующий обработчик ПередСозданиемЗадач:
Процедура ЗаданиеИсполнителю1ПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = Ссылка;
НоваяЗадача.ТочкаМаршрута
= БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеИсполнителю1;
НоваяЗадача.Наименование = "БП4 - исполнителю, параллельный контроль";
НоваяЗадача.Дата=ТекущаяДата();
НоваяЗадача.Сотрудник=Исполнитель;
НоваяЗадача.Задание="Задание для выполнения: "+ОписаниеЗадания;
ФормируемыеЗадачи.Добавить(НоваяЗадача)
КонецПроцедуры
Мы создаем задание для исполнителя, указывая в наименовании создаваемой задачи наличие параллельного контроля.
Для точки действия ЗаданиеКонтролеру1 зададим такой код:
Процедура ЗаданиеКонтролеру1ПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
НоваяЗадача=Задачи.ЗадачаДляПоручения.СоздатьЗадачу();
НоваяЗадача.БизнесПроцесс = Ссылка;
НоваяЗадача.ТочкаМаршрута
= БизнесПроцессы.Поручение.ТочкиМаршрута.ЗаданиеКонтролеру1;
НоваяЗадача.Наименование = "БП4 - контролеру, параллельный контроль";
НоваяЗадача.Дата=ТекущаяДата();
НоваяЗадача.Сотрудник=Контролер;
НоваяЗадача.Задание="Проконтролируйте задание: "
+ОписаниеЗадания+", выполняемое "+Исполнитель.Наименование;
ФормируемыеЗадачи.Добавить(НоваяЗадача);
КонецПроцедуры
Здесь так же мы указываем, что контроль будет выполняться параллельно.
Создадим новую точку слияния (с именем по умолчанию Слияние1), подключим к ее входу выходы элементов ЗаданиеИсполнителю1 и ЗаданиеКонтролеру1, а выход подключим к точке условия КонтрольПройден. В этой точке, напомним, мы анализируем реквизит бизнес-процесса РезультатПроверки. Реализуем заполнение реквизита бизнес-процесса РезультатПроверки в модуле формы задачи ЗадачаДляПоручения. Для этого создадим форму задачи и в ней – обработчик события ПередВыполнением():
НаКлиенте
Процедура ПередВыполнением(Отказ)
УстановкаОтметкиОВыполнении()
КонецПроцедуры
НаСервере
Процедура УстановкаОтметкиОВыполнении()
Если Объект.ТочкаМаршрута.Имя="ЗаданиеКонтролеру1" Тогда
ОбъектБП=Объект.БизнесПроцесс.ПолучитьОбъект();
ОбъектБП.РезультатПроверки=Объект.РезультатПроверки;
ОбъектБП.Записать();
КонецЕсли;
КонецПроцедуры
Здесь мы из процедуры ПередВыполнением вызываем серверную процедуру УстановкаОтметкиОВыполнении(), где, в том случае, если точка маршрута имеет имя "ЗаданиеКонтролеру1" модифицируем параметр РезультатПроверки у бизнес-процесса, сформировавшего задачу. Подобные действия можно выполнить и с помощью других обработчиков, в том числе – в модуле задачи, например, в данном случае мы выбрали ПриЗакрытии().
Когда задачи ЗаданиеКонтролеру1 и ЗаданиеИсполнителю1 будут завершены, будет осуществлен переход от точки слияния к точке КонтрольПройден. Если контроль выполнения задания пройден – мы переходим к завершению бизнес-процесса, в противном случае, как было описано выше, перемещаемся к точке НуженПараллельныйКонтроль, где бизнес-процесс начинает выполняться заново. Так будет происходить до тех пор, пока поручение, заданное при старте бизнес-процесса, не будет выполнено и проконтролировано.
В этой лекции мы рассмотрели основные приемы автоматизации бизнес-процессов. В частности, мы научились работать с задачами, бизнес-процессами, системой адресации бизнес-процессов. Рассмотрели различные блоки карт маршрутов бизнес-процессов, в том числе – точки старта, завершения, условия, слияния, разделения.
Для данной лекции подготовлен видеоурок.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.