Blue Prismやるならコレ覚えとこ！

2017年頃からBlue Prismの仕事に関わっていますが、**3年前の自分にBlue Prismを教えるとしたらここだけは伝えておく！**というポイントをまとめてみました。

# Blue Prismで何ができるのかを知る
下の図は**タスクをためて、複数人でさばいて、結果を報告する**業務を行う例です。
割とオーソドックスな例ですが、こういった業務を完全自動で行う仕組みを構築できます。
Blue Prismでよく使う用語と意味も合わせて描いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/1d230e09-e102-d83e-e47f-766581477d40.png)

### バージョン管理ができる
プロセス、オブジェクトのバージョン管理ができます。バージョン間の差分比較もできます。
履歴コメントにチケットNoと修正の詳細をきちんと書くなどして、バグ対応一覧のようなドキュメントとの突合もしやすくしておくと良いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e72d96aa-0037-f673-fe5d-6c091acdabb7.png)

### 複数ユーザーで同時開発ができる
複数の開発ユーザーで同じプロセスやオブジェクトを編集しようとすると、下図の画面が出てきて排他制御がかかります。チーム開発を想定した機能がライセンスコストを気にすることなく使えるのはいいですね。
（**Blue Prismは本番環境での同時実行ロボット数＝ライセンス数**となる。同時開発人数に制限なし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/14b56358-287f-ad68-db47-a39c04e950c5.png)

### いっぱいログを残してくれる
監査に対応すべく、Blue Prismでの操作のログを細かく取ってくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/a3df4031-b24d-31ae-9a79-b04054a6abb5.png)

### 環境別にUIの色を変えられる
開発/本番環境でUIの色を変えられます。リリース先を間違えるなどのミスを防ぐためにも、環境ごとに色は変えておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/1f71ace9-e2c3-a7d4-725e-4b8f54264e60.png)

## 開発を始める前に…
Blue Prismの使う前に、開発ルールや作るものの設計書をざっくりでも作っておくことをおススメします。
運用編でも触れますが、Blue Prismは**ROM（Robotic Operating Model）**という開発・運用の方法論を持っており、その中で開発ドキュメントについて「こういうの作ったらいいよ☆」というのを紹介しています。
詳しくは↓にまとめてますので、読んでみてください。
[ROMとは?](https://falcslab.com/blueprism/rom/993/)

### やりたいことの手順書を作る
自動化したい業務のイメージを関係メンバーに共有するために、画面キャプチャで簡単な操作フローを作ることをおススメします。
時系列に画面キャプチャを貼り付けていき、補足コメントを残すくらいで十分だと思います。
画面操作に複数パターンがある場合は、あらかじめこの資料に網羅しておくと後々手戻りが減ります。

### input / outputの表を作る
**どのシステムのどの画面のどの項目に、どこから値を取ってきてどのように入力するのか**
を整理した資料があると良いです。
業務担当者との認識のズレは、「画面操作の流れ、パターン」「入力項目と入力値」でよく起こります。
なので、認識のズレによって手戻りが起こらないよう、操作フローとin/outの表で仕様の認識を合わせておきます。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/95a0f027-5cd0-7d5d-e915-a99bf3f819ed.png)

### エラー一覧を作る
操作対象システムの各画面別にエラーを洗い出し、

- どのエラーをハンドリングするのか？
- 業務担当者にどのようなメッセージで通知するのか？
- エラーが発生したら業務担当者はどうリカバリするのか？

を資料化しておくと良いです。
詳細設計書に正常系と異常系処理のどっちも書き込んでいくと、例外パターンが多い画面だと設計書がぐちゃぐちゃになりがちです。
エラー一覧とそれらのハンドリングについては別の資料にまとめたほうがスッキリします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/33e04c5c-2eb3-d1a0-88a8-d03d1fb43481.png)

## 命名規則を定義しておく
Blue Prismで開発する様々なコンポーネントの命名規則をなるべく早い段階から定義しておきましょう。
後になって、いろんなプロセスから参照されまくってる状態でリネームしようとすると、入力・出力のパラメータがはがれてしまい再設定するハメになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/bd9bc722-041f-9860-2e2f-e54d0aaede20.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/08f3a470-0107-0a0b-b3d7-2d411a9cf5ac.png)

なので、後からリネームする手戻りを極力避けるために、開発メンバー間で命名規則の定義はしっかり共有しておきましょう。
例えば、プロセス名は頭に連番を振るのか、「システム名\_〇〇」と命名するのか。Salesforceを操作するオブジェクトの名称を「SF\_〇〇」とするのか、「Salesforce\_〇〇」とするのか、など。
代表的な命名規則について列挙しておきます。

| コンポーネント名  | 命名規則の例 |
|:-----------|:------------|
| プロセス       | XX_システム名\_業務名（※） |
| オブジェクト     | システム名\_画面名 |
| ワークキュー       | プロセス名 + キュー |
| 環境変数         | システム名\_用途（Salesforce\_URLなど） |
| 認証情報       | ランタイムリソース名 |
| 認証情報の各プロパティ  | システム名\_用途（Salesforce\_ユーザー名など） |

（※）1業務を複数プロセスで繋いで実行する場合、時系列で連番を振っておくと見やすいです。

### アプリケーションモデラーの命名規則の例
| 画面要素  | 命名規則の例 |
|:-----------|:------------|
| ウインドウ    | window_〇〇 |
| タイトル    | title_〇〇 |
| リンク    | link_〇〇 |
| ボタン    | button_〇〇 |
| テキストボックス    | text_〇〇 |
| チェックボックス | check_〇〇 |
| コンボボックス    | combo_〇〇 |
| ラベル    | label_〇〇 |

## プロセスを上手に作るコツ

### プロセスとは？
例えば、
①処理対象の申込収集 ⇒ ②顧客登録 ⇒ ③承認 ⇒ ④申込内容登録 ⇒ ⑤メール通知
といった大きな業務の流れがある場合、プロセスは5つになります。
複数のロボットにタスクを分散させたい業務単位＝プロセス、と考えると分かりやすいかもしれません。

### プロセステンプレートを使う
Blue Prismが推奨しているプロセスのフレームワークです。
よほど簡単なプロセスでない限りは、この型に当てはめる形でプロセスを作っていくと良いです。
[プロセステンプレート](https://portal.blueprism.com/products/templates/bpa-process-furosesu-tenfureto1-basic-japanese)

### 仕組みをざっと理解する
下の図を理解できればまずはOK。
前述した「やりたいことの手順書を作る」の図と流れが似ていることが分かる…はず。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/9f5ff1a6-cfc6-df2f-5c47-44ce712d0679.png)

### プロセステンプレートをちょっと改良する
基本的にはプロセステンプレートに沿って作っていけば良いのですが、
例えば「スタートアップ」では、さばくべきタスクあるなし関わらず、まずはログインしようとします。
さばくべきタスクがないなら、ログインする操作は無駄ですよね。
…といった具合にプロセステンプレートもいくつか改善の余地がありますし、作ろうとしているプロセスの仕様次第でもカスタマイズが必要になります。

基本的な流れ（タスクをとる⇒さばく⇒完了マークする）は変えないようにしつつ、パフォーマンスを上げるための修正が必要になるかも…とだけ頭の片隅に置いておきましょう。

### グループの分け方
プロセスをグルーピングすることができます。
部署間でシステムを共有することが多いと思うので、ルートはシステム名、サブフォルダは各業務名にすることが多い気がします。
同じ業務でも部署によってやってることが違う場合は、プロセスの入力やワークキューのタグによって処理を分岐させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ca357621-b9a0-5751-d488-95c8b595a8b8.png)


### ページの分け方
「ワークステップ1」などのページをどのくらいの粒度で分割すべきかですが、個人的には**画面単位**で良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/c3c78d77-394c-27ca-806b-6e58fdeaf959.png)

### その他Tips
#### データアイテムを美しく配置する
本来「ブロック」ステージは、TryCatchの範囲指定をするためのステージなのですが、
データアイテムの配置の見栄えをよくするためにも使います。見やすい実装を目指しましょう。
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/201abd08-12fe-7275-7053-804197cb0bcb.png)

## ワークキューを理解する

### ワークキューとは？
さばくべきタスクを溜めるための箱です。
タスクをただ溜めるだけではなく、

- 優先度を設定
- タスクに付箋を貼る（同じ人に振る作業でも、付箋の色によって作業を分けてほしい）
- 「〇時以降にさばいてほしい」タスクを設定
 
などなど、溜め方を工夫することでいろんなことができます。
また、ワークキューに溜まっている各タスクは**ケース**と言ったりします。
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/224b8073-c7f2-9f7a-7a02-3c1ebc1df196.png)

### タグを上手に使う
- タスクに付箋を貼る（同じ人に振る作業でも、付箋の色によって作業を分けてほしい）

これは「タグ」という機能を使うことで実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/f45920d2-b20d-9bf5-a7f6-e28473d6fee9.png)

タグはとても便利な機能で、前述した「特定の人にさばいてほしいタスクを設定」とかもできちゃいます。
例えば、ロボットAが登録した顧客情報に対して、承認処理を行うのはロボットA以外にしたいという場合を考えてみます。
この場合、タグには登録をしたロボット名を設定しておき、承認処理を行うプロセスでケースを取るときに、以下の図のとおり「タグの〇〇というパラメータが含まれていないケースを取得する」ようにフィルターをかければOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4da181c1-40e5-2806-11cd-f090f9cbc448.png)

他にも、タグの値によって同プロセス内で処理を分岐させたり、直接処理には影響しないけどキー以外にも目印にしたい値がある場合はタグ付けしておくことで、エラー発生時に原因究明の時短に繋がったりします。うまく使いこなしたい機能です。

### グループの分け方
ワークキューもグルーピングできます。
1業務を複数プロセスに分割して行っている場合、その業務名をグループとすると良いと思います。
ワークキューは数が増えるとごちゃごちゃしやすく、コントロールルームで目的のワークキューを探す時間がもったいないので、できるだけグループ化して見やすくしておくと良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/d1bcbf16-7983-edcc-450c-03ce127629fc.png)


## オブジェクトを上手に作るコツ

### オブジェクトとは？
主に操作対象のシステムの操作をまとめたパーツです。
システムの操作以外にも、例えばExcelの操作をまとめたオブジェクトや、コレクションの編集を行ったり、ファイル操作を行うオブジェクトがあります。
これらは**VBO（Visual Business Object）**と呼ばれ、Blue Prism標準で用意されています。

### グループの分け方
プロセスと同様、オブジェクトもグルーピングすることができます。
オブジェクトの場合、**メニュー単位**でグルーピングすることが多いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/226f83b5-ebff-ed69-7bec-f30c76fff929.png)


### アクションページ
各オブジェクトにはアクションページと呼ばれる単位があります。
画面操作のオブジェクトの場合は、「〇〇ボタン押下」といった操作単位でアクションページを作っていきます。
基本的には、アタッチ ⇒ 画面表示を確認（待機） ⇒ 操作、の流れで実装することが多いです。
画面遷移を伴う場合は、必ず遷移先の画面であることを確認する処理を挟みます。
検索ボタン押下後など、データ件数によって表示時間が変わるような操作の場合は待機時間を多めにとっておくなどして工夫します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e65f9a28-96fa-f851-9bf4-d75df6fcd261.png)


### よく使うVBOを覚える
よく使うのは以下4つです。扱いに慣れておきましょう。

‐ MS Excel VBO
‐ MS Outlook Email VBO
‐ Utility - Collection Manipulation
‐ Utility - File Management

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/fb09eeec-8d9a-30e2-e0a3-7a672a5a53ab.png)

### その他Tips

- ループ処理や判断ステージ（業務判断）は入れない
- 無条件の待機ステージは極力入れない
- 入力パラメータは汎用的に使えるように定義する
- 値が固定のデータアイテムは極力作らない　⇒　ブラックボックス化を防ぐため
- 環境変数を参照したい場合はオブジェクトに直接書くのではなく、プロセスからインプットさせる


## アプリケーションモデラーを上手に作る（マジで大事☆）

### アプリケーションモデラーとは？
操作対象システムの画面要素（ボタン、コンボボックス、テーブルなど）をBlue Prismが認識できるようにパーツ化したものです。
画面操作を行うオブジェクトを作る際は、このアプリケーションモデラーを定義するところから入ることが多いです。
この定義のコツを知っていないと手戻りが凄まじいことになります…（体験済）

### 属性の選択とパラメータ定義
下図のように画面の各要素をパーツ化していくためには、Blue Prismに画面要素を認識させる（**＝スパイする**）作業をしていきます。スパイするとその画面要素を特定するための「属性」が自動的に選択され、定義されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/271fd63a-e33d-a3a5-b868-5f8195dc9576.png)

属性の選択はケースバイケースなことも多いのですが、

#### 座標系の属性のチェックは外す

#### 値が空白のものはチェックを外す

#### URLはチェックを外す
開発と本番環境でURLが異なる場合など、環境差異に対応するため。

#### マッチインデックスにチェックを入れる
同じようなボタンが並ぶような画面では、何番目のボタンかを明示することで認識ミスが防げる。

#### パスの定義には注意
表示されるデータ件数が変わったり、入力パターンによって構成が変わるような画面の場合、インデックス番号を埋め込みにしておいたり、チェック自体を外して他の属性でカバーするなど工夫が必要。
ただし、要素を一意に特定するには有効な属性ではあるので、画面構成が特殊でなければ極力チェックを入れる。

といったことに注意していれば、まずは大丈夫そうです。
属性を外しすぎると複数の要素にマッチしてしまいますし、多すぎると環境差異に対応できない可能性もあります。この辺りはやっぱりケースバイケースになってしまいますね。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4d8cea84-c2f2-b2f6-4659-bdfa1b95bb9c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e49038ee-b83e-72c8-2913-472ec8fa0373.png)

## 環境ロック
例えば、Excelの処理結果一覧に累積で結果を記入するといった処理をする場合、複数の人が同時にExcelを編集すると、前の人の書き込みに上書きしてしまう恐れがあります。
また、タイミングによっては複数の人が同じシステムに同じアカウントでログインする可能性がある場合、排他制御によって誰かがはじき出されてしまいます。
そうならないように、「環境ロック」と呼ばれる仕組みを使って、**同時にされると都合の悪い処理をする前にロックをかけてから行う**ことができます。
使い方は↓にまとめてますので、読んでみてください。

[環境ロック①　基本的な使い方](https://falcslab.com/blueprism/env-lock/441/)

## 認証情報
ランタイムリソース自身へのアカウント情報や、操作対象システムへのアカウント情報をまとめた領域のことです。
**ランタイムリソースの端末名＝認証情報名**としておくことが多いです。
プロセステンプレートの冒頭で認証情報を取得する前に、自身の端末名を取得しておき、その端末名で認証情報を探しに行き、もしあったらその認証情報のプロパティを使ってシステムにログインする
といった使い方をよくしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ad16357a-3edb-e0de-dc67-f672aee3801b.png)


## 環境変数
その名の通り、環境によって値が変わる変数のことです。
例えば、参照するファイルのパス、メールの宛先などですね。
また、仕様が変わりうる箇所に関連する変数も環境変数として定義しておくと便利です。
例えば、

- 開発環境とは違って本番環境が安定稼働しないといった状況の場合、リトライの回数を変えられるようにしておく
- 処理対象のデータ取得件数の上限値を持っておくことで、タスクが溜まってきてしまった場合に値を大きくすることで一気にさばく

など。
また、**環境変数を別環境にインポートすると値は上書きされません。**
本番環境にすでにある環境変数に対してインポートをしても、本番環境の値は開発環境の値に上書きされません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/620bad8e-480f-4661-ba4e-1f3740b44f63.png)

# まとめ
参考資料のベストプラクティスが理解できれば、Blue Prismエンジニア（？）としてバリバリ現場で活躍できるはずです☆
他にも大事なことが思いついたら随時加筆していきます。

## 参考資料
[開発ベストプラクティス 第1回](https://www.blueprism.com/uploads/resources/white-papers/Blue-Prism-Webinar-20200520_JP.pdf)
[開発ベストプラクティス 第2回](https://www.blueprism.com/uploads/resources/white-papers/Blue-Prism-Webinar-20200527_JP.pdf)
[開発ベストプラクティス 第3回](https://www.blueprism.com/uploads/resources/white-papers/Blue-Prism-Webinar-20200603_JP.pdf)
[Falcslab](https://falcslab.com/)