# Переброс данных между связанными каталогами

## 1. Введение

Если вы хотите автоматически перебрасывать значения однотипных полей из одного каталога в другой, то нужно писать для целевого каталога переброса сценарий автоматизаций.&#x20;

Например: у вас есть каталог «‎Контакты» с полями «‎Фамилия», «‎Имя» и «‎Отчество». Также, у вас есть каталог «‎Заявки», в котором есть связь с каталогом «‎Контакты» и точно такие же поля «‎Фамилия», «‎Имя», «‎Отчество». Вы хотите заполнять поля в «‎Заявках» автоматически и пишете для этого сценарий переброса данных из связанного каталога «‎Контакты». В случае с одним каталогом — процесс несложный, но если каталогов становится несколько, то писать под каждый отдельный сценарий — нецелесообразно.&#x20;

Процесс переброса данных — однотипный, поэтому в этом случае используется универсальный каталог с правилами переброса.&#x20;

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

## **2. Принцип работы**

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FZQWPbSIWM8y8m2auxpfG%2F%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9.png?alt=media&#x26;token=2e83b3ee-976a-4569-b512-dfbe7286f7a8" alt=""><figcaption></figcaption></figure>

* При сохранении записи в каталоге с правилами сценарий обработки каталога проверяет типы полей для переброса в целевом каталоге и его связанном каталоге. Типы перебрасываемых полей в обоих каталогах должны быть идентичными. Если они не совпадают, то сценарий выдаст ошибку и завершится.
* Если проверка прошла успешно, в каталоге «События» создается новая запись (или обновляется существующая), которая будет отслеживать изменения указанных полей в выбранном каталоге.
* При необходимости можно обновить все ранее созданные записи согласно новому правилу переброса, выбрав соответствующий пункт в записи каталога правил.
* При изменении записи в выбранном каталоге сценарий переброса автоматически обновит запись в связанном каталоге.

## **3. Реализация**

### **3.1. Открытие каталога каталогов**

Бипиум хранит список всех каталогов в виде записей в служебном каталоге «Каталоги». Этот каталог по умолчанию скрыт в системе. Для того, чтобы реализовать механизм переброса значений полей нужно открыть отображение этого каталога.

Создайте новую запись в каталоге «Внешние запросы». В качестве сценария прикрепите следующий [файл сценария](https://drive.google.com/file/d/1mcxJw2Ib1a6ZGs990OAcBDQsoZ20LwXY/view?usp=sharing).

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FZRTTqpcgu1ZbWNadEJzs%2F0.png?alt=media&#x26;token=56eaefe5-242a-4831-a288-40cc5a08ad37" alt=""><figcaption></figcaption></figure>

Этот сценарий открывает отображение каталога «Каталоги» в вашей системе.

В сценарии нужно изменить:

* Компонент «Открываем каталог каталогов». В поле «Заголовки (headers)» в значении заголовка «from» укажите поддомен вашей системы. Например, для домена <https://test.bpium.ru> нужно указать «test».

Запустите сценарий во внешнем запросе, перейдя по полному адресу внешнего запроса.&#x20;

Если все сделано правильно, в отделе «Управление» появится каталог «Каталоги» со списком всех каталогов в системе.

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FY9slFnvhAp8ZYSxPjQDU%2Fkk.png?alt=media&#x26;token=e446240a-9870-4453-80f4-ed7b6a3b37e4" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
Каталог каталогов является системной сущностью, поэтому запрещено создавать/изменять/удалять записи в данном каталоге, а также вносить изменения в структуру каталога. Ручное внесение изменений может повлечь дальнейшую некорректную работу системы.\
Восстановление работоспособности в этом случае выполняется на платной основе.
{% endhint %}

### **3.2. Создание каталога правил переброса**

Создайте каталог «Правила». В этом каталоге будут собраны правила переброса значений полей между каталогами. Поля каталога нужно создавать в том же порядке, не нарушая последовательность id полей:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FtlRMD3DtljeTC1zttqKz%2F1.png?alt=media&#x26;token=b8b585d6-1884-4093-b5de-d4d39bb4523d" alt=""><figcaption></figcaption></figure>

* **Правило** (секция)
* **Каталог** (Связанный каталог)\
  Описание: Содержит каталог, для которого будет применено правило переброса.\
  Настройки: Обязательно поле, связь с каталогом «Каталоги».
* **Направление** (статус)\
  Описание: Выборка целевого каталога для переброса: возможен переброс данных в связанную запись основного каталога или из связанного каталога в основной.\
  Значения: «Из связанной записи», «В связанную запись».\
  Настройки: Обязательное поле.
* **ID поля связанного каталога** (текст)\
  Описание: Содержит id поля связанного каталога в основном каталоге. \
  Настройки: Обязательное поле.
* **Правила сопоставления полей** (Контакт)\
  Описание: Содержит сопоставление полей основного и связанного каталогов, данные из которых будут синхронизироваться. В основном поле указываются id полей связанного каталога, в дополнительном – основного.\
  Настройки: Обязательное поле, телефон.
* **Доп. параметры** (Набор галочек)\
  Описание: Содержит дополнительные параметры синхронизации. По умолчанию параметр один - «Обновить предыдущие записи». Если он проставлен, то вместе с созданием правила синхронизации будут обновлены все предыдущие записи в целевом каталоге.\
  Настройки: По умолчанию: первый элемент.
* **Событие** (Связанный каталог)\
  Описание: Содержит в себе созданное по правилу переброса событие. Будет проставляться автоматически при создании правила.\
  Настройки: Связь с каталогом «События», редактируемое только через API.

### **3.3. События обработки каталога правил**

В системном каталоге «События» нужно создать три события для каталога «Правила»:

* Событие: Создание/обновление событий по правилу

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FdyLtwy5DF0dREQPD61i8%2F2.png?alt=media&#x26;token=4eba6992-2acf-4905-be4e-2ebbfc2ee033" alt=""><figcaption></figcaption></figure>

Событие отслеживает создание/изменение записей (уведомление) в каталоге правил и запускает сценарий создания или обновления события для целевого каталога.

В качестве сценария прикрепите [сценарий создания/обновления события по правилу](https://drive.google.com/file/d/1sxePcmsDZLEO-LOMqZKL8Wx4yZarXulr/view?usp=sharing).

* Событие: Проверка типов связанных полей

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FyT2LKofG5BS7ontepV1h%2F3.png?alt=media&#x26;token=bee2bcf8-9291-46bf-b7b9-0ab04c8864c0" alt=""><figcaption></figcaption></figure>

Событие отслеживает создание/изменение записей (запрос) в каталоге правил и запускает сценарий проверки типов синхронизируемых полей. Сценарий проверяет типы полей в целевом и связанном каталогах из поля «Правила сопоставления полей» на соответствие друг другу. Если поля идентичны по типу, то сценарий завершается. Если тип полей не идентичен – выбивает ошибку и не дает сохранить запись в каталоге правил. В качестве сценария прикрепите [сценарий проверки типов связанных полей](https://drive.google.com/file/d/1XwCVxV7OTuQGKQ8_0cRtB-6YAnc850NI/view?usp=sharing).

* Событие: Проверка типа поля связанного каталога

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FwFSrKlVlllSwg2KryMNP%2F4.png?alt=media&#x26;token=db3d353c-313e-4fe3-818b-3376e6c07b1e" alt=""><figcaption></figcaption></figure>

Событие отслеживает создание/изменение записей (запрос) в каталоге правил и запускает сценарий проверки типа поля связанного каталога. Сценарий проверяет на заполненность поля «Каталог» и «ID связанного каталога» и не дает сохранить запись, если они заполнены некорректно. В качестве сценария прикрепите [сценарий проверки типа поля связанного каталога](https://drive.google.com/file/d/17Mg7noEV6a-gPrbelKTzjeVVQwgX4kNO/view?usp=sharing).

### **3.4. Сценарии переброса данных**

В системном каталоге «Сценарии» создайте две записи и приложите к ним файлы сценария:

* [**Сценарий «В связанную запись»**](https://drive.google.com/file/d/1FIFqshxfZURoB4yexkkH1KwUwHPm5IIF/view?usp=sharing)
* [**Сценарий «Из связанной записи»**](https://drive.google.com/file/d/10dGhKaGg-jUmzWll2jhkoTYD_15rSYwz/view?usp=sharing)

Эти сценарии не связаны с событиями описанными выше. Они запускаются из создаваемого сценарием «Создание/обновление событий по правилу» (описан выше) событию. Это событие создается для целевого каталога при сохранении записи в каталоге правил.

Оба сценария идентичны по алгоритму работы, но различаются по направлению переброса данных. Первый прокидывает данные полей в целевой каталог ИЗ его связанной записи («Из связанной записи»). Второй прокидывает данные из целевого каталога В его связанную запись («В связанную запись»).

#### **Сценарий переброса в связанную запись**

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FR6oyNK1jjdSRSeVUQrWj%2F5.png?alt=media&#x26;token=f2162983-8d35-44d2-af7e-0c7467215d26" alt=""><figcaption></figcaption></figure>

Сценарий выполняет:

* Поиск правила сопоставления полей в каталоге правил (поле «Правила сопоставления полей»)
* Изменение значений полей в связанной записи по правилам сопоставления.

В сценарии нужно изменить:

* В компоненте «Ищем правило дублирования полей» в поле «Каталог» выберите ваш каталог с правилами переброса.

#### **Сценарий переброса из связанной записи**

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2Fo4MpvsXrD7jQfZ5GTdF8%2F6.png?alt=media&#x26;token=99dc7217-458a-4e49-9002-1b15b5e704b9" alt=""><figcaption></figcaption></figure>

Сценарий выполняет:

* Поиск правила сопоставления полей в каталоге правил (поле «Правила сопоставления полей»).
* Получение значения полей связанной записи.
* Изменение значений полей в основной записи по правилам сопоставления.

В сценарии нужно изменить:

* В компоненте «Ищем правило дублирования полей» в поле «Каталог» выберите ваш каталог с правилами переброса.

### **3.5. Сценарии обработки каталога правил**

#### **3.5.1. Сценарий создания/обновления события по правилу**

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FHSA9vAz4ftgWovBouPtr%2F7.png?alt=media&#x26;token=a9012e45-7342-4ccf-b9ab-06939870b72b" alt=""><figcaption></figcaption></figure>

Сценарий выполняет:

* Формирование списка отслеживаемых полей из поля «Правила сопоставления полей».
* Создание для указанного в поле «Каталог» нового события с одним из сценариев переброса («Из связанной записи», «В связанную запись») или изменение существующего события.
* Обновление предыдущих записей в каталоге, если был выбран доп. параметр «Обновить предыдущие записи».

В сценарии нужно изменить:

* В компоненте «Изменяем событие по правилу» выберите системный каталог «События».
* В компоненте «Создать событие для правила» выберите системный каталог «События».
* В компонента «Зафиксировать созданное событие» выберите каталог правил.
* В компоненте «Запуск процесса» выберите сценарий обновления предыдущих записей (описан ниже).

#### **3.5.2. Сценарий обновления предыдущих записей**

Если в каталоге правил выбран доп. параметр «Обновить предыдущие записи», то сценарий «Создания/обновления событий по правилу» запускает сценарий обновления предыдущих записей в целевом каталоге. Создайте в системном каталоге «Сценарии» новую запись и прикрепите к ней сценарий обновления предыдущих записей. Этот же сценарий нужно выбрать в компоненте «Запуск процесса» сценария, описанного выше.

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2Fs0lZ5CCuOTbl38OAvPKG%2F8.png?alt=media&#x26;token=bfb11252-6ef2-4041-9916-ddb4f2b3d13d" alt=""><figcaption></figcaption></figure>

Сценарий выполняет:

* Получение всех записей целевого каталога.
* Изменение данных в полученных записях по полю «Правила сопоставления полей» каталога правил.

#### **3.5.3. Сценарий проверки типов связанных полей**

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2F2POH3loN78fmJQSjv7uq%2F9.png?alt=media&#x26;token=f9bbfa77-6dc9-48d9-9547-ab18c32dd60f" alt=""><figcaption></figcaption></figure>

Сценарий выполняет:

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

**3.5.4. Сценарий проверки типа поля связанного каталога**

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2Fx5pP7zMk5RvUarcwz2RP%2F10.png?alt=media&#x26;token=9623758a-dd47-4421-b459-eaf9620e6749" alt=""><figcaption></figcaption></figure>

Сценарий выполняет:

* Получение структуры основного каталога.
* Проверку типа поля с id из «ID поля связанного каталога».
* Если тип поля не связанный каталог, то выводится сообщение с ошибкой и запись не сохраняется.

### **4. Тестирование**

Для тестирования создайте два тестовых каталога с одинаковыми по типу полями, из которых планируется перебрасывать данные. В одном из каталогов добавьте поле типа «Связанный каталог» и свяжите его со вторым тестируемым каталогом.

В каталоге «Правила» создайте новую запись с направлением «Из связанной записи». Выберите тестовый каталог (основной), в котором есть связь со вторым тестовым каталогом. Введите id поля типа «Связанный каталог» выбранного каталога и укажите поля, которые должны синхронизироваться в поле «Правила сопоставления полей». В основное поле введите нужные поля из связанного каталога. В дополнительное – поля основного каталога. При необходимости, отметьте доп. параметр «Обновить предыдущие записи». Пример заполнения записи в каталоге «Правила»**:**

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FYDHONnf0j5efCRBwFFhD%2Fmissed1.png?alt=media&#x26;token=70095c7a-18c9-4777-ac6f-c879285c45db" alt=""><figcaption></figcaption></figure>

Если правила сопоставления каталогов верны, то сценарий создаст новую запись в каталоге «‎События»:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FVIA7MEF7lsMhgUnXauXJ%2Fmissed2.png?alt=media&#x26;token=fbd692fd-a54a-4093-baa4-570a57fdbf8e" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2F0e0z4dZy5hyku7HBkSKn%2Fmissed3.png?alt=media&#x26;token=4fe0b352-c9f5-45f5-92fa-5d2fcb16646d" alt=""><figcaption></figcaption></figure>

В каталоге «Правила» измените направление на «В связанную запись». При необходимости, отметьте доп. параметр «Обновить предыдущие записи». Пример заполнения записи в каталоге «Правила»:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FP3tASG8SDVvTWBXJfh5f%2F13.png?alt=media&#x26;token=b57e8dc2-e3e6-40a6-a561-7a7319d99ca0" alt=""><figcaption></figcaption></figure>

Если правила сопоставления каталогов верны, то сценарий изменит созданную ранее запись в каталоге «‎События»:

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2FZVOTT7TeVrPYH20Do6tF%2F14.png?alt=media&#x26;token=165e98ef-363a-4c9a-9b55-48c0ea74bef9" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://1283378397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LACZmmM2xUWbZxyRr4s%2Fuploads%2F0e0z4dZy5hyku7HBkSKn%2Fmissed3.png?alt=media&#x26;token=4fe0b352-c9f5-45f5-92fa-5d2fcb16646d" alt=""><figcaption></figcaption></figure>
