# Вынос параметров

## Описание

{% hint style="success" %}
Выносите статичные параметры сценариев автоматизации за их пределы.
{% endhint %}

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

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

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

Также вынесение параметров в интерфейс системы позволяет автоматически актуализировать их, если параметры имеют свойство “устаревать”. Например, это относится к токенам доступа сторонних сервисов с ограниченным сроком жизни.

<div><figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2F5916hMgcGrr4anCKW8CQ%2F1.png?alt=media&#x26;token=f47960f4-f9e2-42a5-b893-3956e82c5927" alt="" width="375"><figcaption><p><mark style="color:red;">Вместо указания переменных в сценариях</mark></p></figcaption></figure> <figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2Fs2DwMNdDJrUoCCQiJc9z%2F2.png?alt=media&#x26;token=a60459c2-2840-40fc-aa23-f2370b51727a" alt="" width="563"><figcaption><p><mark style="color:green;">Выносите их в интерфейс системы</mark></p></figcaption></figure></div>

## Проблематика

В качестве примера рассмотрим настроенный каталог “Организации”, в записях которого фиксируется ИНН и другой перечень полей для заполнения.

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FF5W9ewv3gPzCOKP1XjtA%2F3.png?alt=media&#x26;token=706006bf-29df-4466-a5a7-18229c028355" alt="" width="563"><figcaption></figcaption></figure>

В своей работе сотрудники не заполняют все поля вручную. Вручную заполняется только ИНН, а остальная информация подставляется автоматически при нажатии на соответствующую кнопку (пример такой автоматизации описан в статье [Автозаполнение данных по ИНН](https://docs.bpium.ru/~/revisions/YUnqcoiW10inbT9kWjj5/cases/automations/rabota-s-zapisyami/avtozapolnenie-dannykh-po-inn)).

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FynORaoDMUYLP8Js8bgpU%2F4.png?alt=media&#x26;token=95834191-e72a-4b58-b58d-038a0c0b3ce1" alt="" width="563"><figcaption></figcaption></figure>

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

Спустя некоторое время сотрудники пытаются получить данные по очередной организации, но что-то идет не так:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FrvLmH3DjT3DTH80S82Jd%2F5.png?alt=media&#x26;token=3edf9e1f-e8ba-4046-84c2-deb6a209f8e9" alt="" width="563"><figcaption></figcaption></figure>

Отображается системная ошибка выполнения сценария типа “Изменено поле во время редактирования”. В контексте рассматриваемого примера такое может произойти, если *авторизационный токен* сервиса стал недействительным.

Теперь рассмотрим сценарий, который производит получение данных по организации. Видим, что в компоненте “Назначение переменных” есть переменная “token” с фиксированным значением:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FoMsffE2EsGrjrvGBibEJ%2F6.png?alt=media&#x26;token=8c379d62-e6d7-4b79-9ab3-8661ea917518" alt="" width="563"><figcaption></figcaption></figure>

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

* Корректировка сценария при изменении фиксированных значений
* Невозможность автоматической актуализации

### Корректировка сценария при изменении фиксированных значений

Рассмотрим проблему корректировок сценария на реализации, описанной выше.

{% hint style="info" %}
Ряд сторонних сервисов выдает токен с ограниченным сроком жизни - то есть токен действует только определенное время. После окончания срока жизни токена его необходимо обновить - выпустить новый.
{% endhint %}

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

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

При этом сам процесс с поиском сценария, нужного компонента и тестирования занимает некоторое время.

{% hint style="warning" %}
Суть проблемы именно в необходимости ручной замены данных внутри сценария. В качестве данных может выступать как токен, так и любые другие фиксированные параметры, которые могут измениться в будущем.
{% endhint %}

### Невозможность настройки автоматической актуализации

Из-за того, что в реализации выше токен по сути “зашит” в сам сценарий, его невозможно автоматически актуализировать. Это некоторое статичное значение, изменить которое может только сотрудник.

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

## Применение паттерна

Решить обе проблемы можно используя паттерн *выноса параметров*.

Для примера выше необходимо добавить новый каталог “Токены” с перечнем полей, содержащим сам токен и данные, необходимые для его обновления:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FDVucXOj78zU4EXVm3tle%2F7.png?alt=media&#x26;token=9510b6e9-8432-4b2e-9f8e-f5d731ea8af4" alt="" width="563"><figcaption></figcaption></figure>

В созданный каталог нужно добавить запись с актуальным на данный момент токеном и данными, необходимыми для его актуализации:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2Fuzn3YaG4XB3kfLRTfbs2%2F8.png?alt=media&#x26;token=859f6beb-8c56-4f5c-b783-e56080d5fca0" alt="" width="563"><figcaption></figcaption></figure>

Далее в сценарии для заполнения данных по ИНН нужно добавить компонент “Получить запись” и вместо “зашитого” в сценарий токена использовать значение из поле “Токен” созданной в каталоге записи.

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

В такой реализации также становится возможным решить проблему с автоматическим обновлением токена. В системе может быть настроен сценарий, запускаемый по механизму “[*Планировщика задач*](https://docs.bpium.ru/~/revisions/YUnqcoiW10inbT9kWjj5/cases/automations/upravlenie-zadachami-i-taim-menedzhment/planirovshik-zadach)”, который будет получать данные для обновления токена из его записи и самостоятельно выпускать новый. Выпущенный токен сценарий самостоятельно запишет в поле “Токен”, заменив устаревшее значение.

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