Опубликован: 06.12.2011 | Доступ: свободный | Студентов: 3558 / 746 | Оценка: 4.50 / 4.39 | Длительность: 03:42:00
Лекция 6:

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

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

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

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

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

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

увеличить изображение
Рис. 6.31. Дополненный регистр адресации

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

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

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

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

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

&НаКлиенте
Процедура ОткрытьСмету(Команда)
  ОткрытьЗначение(ПолучитьСсылкуНаСмету());
  Предупреждение(СообщениеДляПользователя());
КонецПроцедуры

&НаСервере
Функция ПолучитьСсылкуНаСмету()
  Возврат Объект.БизнесПроцесс.Смета;  
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Почему в лекции 1 "Основы организации бухгалтерской подсистемы" курса "Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме "Управляемое приложение"" совершенно нет информации о том что нужно на вкладке данные в табличной части создать табличную часть "ВидыСубконто" и также нет информации о том какие нужно добавить реквизиты и какие у этих реквизитов должен быть тип? Считаю лекцию 1 в данном вопросе недоработанной.

Надежда Федулкина
Надежда Федулкина