Добавить в корзинуПозвонить
Найти в Дзене

Связка МойСклад и Битрикс24: обновление товаров в сделке Битрикс24 при обновлении заказа в МойСклад и обратная интеграция

Данная статья — продолжение серии статей на тему интеграции МойСклад и Битрикс24 (начало здесь). В предыдущей статье мы показали, как настроить интеграцию "МойСклад: заказ обновлён → Битрикс24: обновить сделку", теперь давайте разберем следующий шаг: "Битрикс24: сделка обновлена → обновить товары в сделке". Также разберем обратную интеграцию: Битрикс24: сделка создана в воронке «Продажи» → создать заказ в МойСклад. Вы можете настроить интеграции по описанию ниже или просто установить шаблоны по ссылке и донастроить его под свои бизнес-процессы или настроить интеграции с нуля по описанию ниже. Если возникнут сложности — наши эксперты всегда рядом, настроим первую интеграцию бесплатно. Рассмотрим, как автоматически обновлять товары в сделке.
Триггер: Сделка обновлена в Битрикс24.
Действие: Синхронизировать товары по UUID. Указываем Пинкит и интеграцию, настроенную ранее. 1.2.1. Получаем информацию о товарных позициях Преобразуем строку в массив в поле source.int12081.source.positions.me
Оглавление

Данная статья — продолжение серии статей на тему интеграции МойСклад и Битрикс24 (начало здесь). В предыдущей статье мы показали, как настроить интеграцию "МойСклад: заказ обновлён → Битрикс24: обновить сделку", теперь давайте разберем следующий шаг: "Битрикс24: сделка обновлена → обновить товары в сделке". Также разберем обратную интеграцию: Битрикс24: сделка создана в воронке «Продажи» → создать заказ в МойСклад.

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

Если возникнут сложности — наши эксперты всегда рядом, настроим первую интеграцию бесплатно.

1. Интеграция "Сделка - назначить товары"

Рассмотрим, как автоматически обновлять товары в сделке.
Триггер: Сделка обновлена в Битрикс24.
Действие: Синхронизировать товары по UUID.

1.1. Шаг 1: Откуда

Указываем Пинкит и интеграцию, настроенную ранее.

-2

1.2. Шаг 2: Инструменты

1.2.1. Получаем информацию о товарных позициях

  • Получить Meta ссылку на позиции товара

Преобразуем строку в массив в поле source.int12081.source.positions.meta.href.

-3
  • Получаем позиции товара

Используем API-запрос Методом GET с указанием URL = {{step1.1}}.

-4
  • Для каждого товара из заказа

Используем инструмент Для каждого в поле step2.rows.

-5
  • Сделать одиночный товар снова массивом

Используем Преобразование типов данных в поле step3.

-6
  • Получить Meta ссылку на развернутую информацию о товаре

Преобразуем строку в массив в поле step3.assortment.meta.href.

-7
  • Получаем развернутую информацию о товарной позиции на стороне МойСклад

Используем API-запрос Методом GET с указанием URL ={{step5.1}}

-8

1.2.2. Создание товара при необходимости

  • Выбрать новый товар или уже существующий

Используем инструмент Если-иначе в поле step10.result. Условие - (Логическое) Истина, Результат при успешной проверке = {{step10.result}}, Результат при неуспешной проверке = {{step7.result.0.ID}}.

-9
  • Собрать массив товаров

Объединяем прогоны.

-10
  • Подогнать массив с товаром в нужный формат

Используем Преобразование массива объектов в поле step12.

-11
  • Фильтр

Используем Фильтр элементов массива в поле step13.

-12

1.3. Шаг 3: Куда

Назначаем товары сделке.

-13

1.4. Шаг 4: Сопоставление данных

Сопоставляем данные:

ID сделки - {{source.int12081.step3}}

Массив товаров - {{step14}}

-14

1.5. Шаг 5: Запуск

Запускаем.

-15

2. Битрикс24.Продажи = Сделка - создана => Создать заказ в МойСклад

Данная интеграция будет создавать заказ в МойСклад на основе сделки в Битрикс24.
Триггер: Создана сделка в воронке «Продажи» в Битрикс24.
Действие: Создать заказ в МойСклад.

2.1. Шаг 1: Откуда

Получаем данные в момент создания сделки в Битрикс24.

-16

2.2. Шаг 2: Инструменты

2.2.1. Если есть компания → получаем её реквизиты (ИНН, название, email) → ищем в МойСклад по ИНН → если не нашли, создаём новую компанию

  • Сопоставление_Проверяем выгружался ли ранее заказ в МойСклад

Используем Поиск ID соответствующий сущности в поле source.ID.

-17
  • Сопоставление_Если заказ ранее выгружался, тогда прервать, иначе продолжить

Используем проверку в поле step38. Условие - (Логическое) Истина, Действие - прервать, если проверка пройдена.

-18

Если есть компания →

Используем Если-Иначе в поле source.COMPANY_ID. Условие*(Логическое) Истина, Результат при успешной проверке = 1, Результат при неуспешной проверке = 0.

-19

получаем её реквизиты →

Используем API-запрос Методом GET с указанием URL = /crm.requisite.list?filter[ENTITY_ID]={{source.COMPANY_ID}}.

-20

получаем её телефон, email →

Используем API-запрос Методом GET с указанием URL = /crm.company.get?ID={{source.COMPANY_ID}}

-21

→ ищем в МойСклад по ИНН →

Используем API-запрос Методом GET с указанием URL = /entity/counterparty?filter=inn~{{step2.result.0.RQ_INN}}.

-22

→ Если компания найдена по ИНН в МойСклад, тогда Ложь, иначе Истина →

Используем Если-иначе в поле step4.rows. Условие*Пустое значение, результат при успешной проверке = 1, результат при успешной проверке = 0.

-23
  • Выбрать это ИП или Юр.лицо

Используем Сопоставление данных в поле step2.result.0.PRESET_ID.

-24

→ если не нашли, создаём новую компанию

Используем API-запрос Методом POST с указанием URL = /entity/counterparty

Запрос:

{
"name": "{{step2.result.0.RQ_COMPANY_NAME|escape()}}",
"legalTitle": "{{step2.result.0.RQ_COMPANY_FULL_NAME|escape()}}",
"inn": "{{step2.result.0.RQ_INN}}",
"kpp": "{{step2.result.0.RQ_KPP}}",
"email":"{{step3.result.EMAIL.0.VALUE|default()}}",
"description":"{{step3.result.COMMENTS}}",
"phone":"{{step3.result.PHONE.0.VALUE|default()}}",
"companyType":"{{step6}}"
}

-25

2.2.2. Если нет компании → получаем контакт (ФИО, email, телефон) → ищем в МойСклад по email/телефону → если не нашли, создаём новый контакт

Если нет компании, проверяем контакт →

Используем Если-иначе по полю source.COMPANY_ID. Условие*(Логическое) Ложь, результат при успешной проверке = 1, результат при неуспешной проверке = 0.

-26

→ получаем контакт (ФИО, email, телефон) →

Используем API-запрос Методом GET с указанием URL =/crm.contact.get?ID={{source.CONTACT_ID}}.

-27

→ ищем в МойСклад по Phone →

Используем API-запрос Методом GET с указанием URL /entity/counterparty?filter=phone~{{step9.result.PHONE.0.VALUE}}

-28

Если по телефону контакт не найден, тогда продолжить поиск по Email

Используем Если-Иначе в поле step10.rows.

-29

→ ищем в МойСклад по Email →

Используем API-запрос Методом GET с указанием URL = /entity/counterparty?filter=email~{{step9.result.EMAIL.0.VALUE}}

-30
  • Если по Email контакт не найден, тогда проверяем был ли найден контакт по Email или Телефон

Используем если-Иначе в поле step12.rows. Условие*Пустое значение, Результат при успешной проверке = 1, Результат при неуспешной проверке = 0.

-31

→ если не нашли, создаём новый контакт

Используем API-запрос Методом POST с указанием URL =/entity/counterparty. Запрос:

{
"name": "{{step9.result.NAME|escape()}}",
"email":"{{step9.result.EMAIL.0.VALUE|default()}}",
"description":"{{step9.result.COMMENTS}}",
"phone":"{{step9.result.PHONE.0.VALUE|default()}}",
"companyType":"individual"
}

-32
  • Делаем массив ссылок c полученными контрагентами

Используем Преобразование типов данных в поле step7.meta.href|default(), step4.rows.0.meta.href|default(), step10.rows.0.meta.href|default(), step12.rows.0.meta.href|default(), step14.meta.href|default().

-33
  • Склеить meta ссылки контрагентов, чтобы оставить только одну

Объединяем массивы:

step15.step7_meta_href|default()
step15.step4_rows_0_meta_href|default()
step15.step10_rows_0_meta_href|default()
step15.step12_rows_0_meta_href|default()
step15.step14_meta_href|default()

-34

2.2.3. «Организация»

  • Какую организацию выбрать при создании заказа

Используем Если-Иначе в поле source.UF_CRM_***

. Условие*(Число) Равно, Сравниваемое значение = 330.

-35

2.2.4. «Склад»

  • Сопоставление ID склада

Используем Сопоставление данных в поле source.UF_CRM_*****.

-36
  • Получить список складов в МойСклад

Используем API-запрос Методом GET с указанием URL = /entity/store.

-37
  • Найти нужный клад из списка

Используем Фильтр элементов массива в поле step19.rows.

-38

2.2.5. «План. дата отгрузки» (системное поле) «План. дата отгрузки» (доп. поле)

  • «План. дата отгрузки» (доп. поле)

Используем Форматирование даты/времени в поле source.UF_CRM_*****.

-39

2.2.6. «Проект» (системное поле) «Проект (Pinall)» (доп. поле)

  • Проект

Используем Сопоставление данных в поле source.UF_CRM_*****.

-40
  • Получить список проектов в МойСклад

Используем API-запрос Методом GET с указанием URL = /entity/project

-41
  • Найти нужный Проект из списка

Используем Фильтр элементов массива в поле step23.rows. Условие - (Текст) Полностью совпадает, Сравниваемое значение = step22.

-42

2.2.7. «Канал продаж»

  • Канал продаж

Используем сопоставление данных в поле source.UF_CRM_*****.

-43
  • Получить список Каналов Продаж в МойСклад

Используем API-запрос Методом GET с указанием URL = /entity/saleschannel.

-44
  • Найти нужный Канал Продаж из списка

Используем Фильтр элементов массива в поле step26.rows. Условие*(Текст) Полностью совпадает, Сравниваемое значение = step25.

-45

2.2.8. «Срок резерва» (доп. поле) и Заказ оплачен

  • «Срок резерва» (доп. поле)

Используем Форматирование даты/времени в поле source.UF_CRM_*****.

-46
  • Заказ оплачен

Используем Сопоставление данных в поле source.UF_CRM_*****.

-47

2.2.9. Сборщик заказа

  • Сборщик заказа

Используем сопоставление данных в поле source.UF_CRM_*****.

-48
  • Получить список Сотрудников в МойСклад

Используем API-запрос Методом GET с указанием URL = /entity/employee

-49
  • Выбрать нужного сборщика из списка МойСклад

Используем Фильтр элементов массива в поле step31.rows. Условие*(Текст) Полностью совпадает, Сравниваемое значение = step30.

-50

2.2.10. Метод оплаты

  • Метод оплаты

Используем Сопоставление данных в поле source.UF_CRM_*****.

-51
  • Получить список Метод оплаты в МойСклад

Используем API-запрос Методом GET с указанием URL =/entity/customentity/

-52
  • Выбрать нужный Метод оплаты из списка

Используем Фильтр элементов массива в поле step34.rows. Условие*(Текст) Содержит, Сравниваемое значение = step33.

-53

2.2.11. Сопоставление сотрудников

  • Сотрудники

Используем Сопоставление данных в поле source.ASSIGNED_BY_ID.

-54
  • Выбрать нужного сотрудника из списка МойСклад

Используем Фильтр элементов массива в поле step31.rows. Условие - (Текст) Полностью совпадает, Сравниваемое значение = step36.

-55

2.3. Шаг 3: Куда

Добавляем заказ в МойСклад.

-56

2.4. Шаг 4: Сопоставление данных

Сопоставляем данные:

Название заказа покупателя - {{step38}}

Дополнительное тело запроса:

{
"name": "{{source.UF_CRM_**|default()}}",
"created": "{{now|date(Y-m-d H:i:s)}}",
"shared": false,
"applicable": false,
"owner":{
"meta": {
"href": "{{step37.0.meta.href}}",
"metadataHref": "{{step37.0.meta.metadataHref}}",
"type": "{{step37.0.meta.type}}",
"mediaType": "application/json",
"uuidHref": "{{step37.0.meta.uuidHref}}"
}
},
"store": {
"meta": {
"href": "{{step20.0.meta.href}}",
"metadataHref": "{{step20.0.meta.metadataHref}}",
"type": "{{step20.0.meta.type}}",
"mediaType": "application/json",
"uuidHref": "{{step20.0.meta.uuidHref}}"
}
},
"salesChannel": {
"meta": {
"href": "{{step27.0.meta.href}}",
"metadataHref": "{{step27.0.meta.metadataHref}}",
"type": "{{step27.0.meta.type}}",
"mediaType": "application/json",
"uuidHref": "{{step27.0.meta.uuidHref}}"
}
},
"organization": {
"meta": {
"href": "{{step17}}",
"type": "organization",
"mediaType": "application/json"
}
},
"agent": {
"meta": {
"href": "{{step16.0}}",
"type": "counterparty",
"mediaType": "application/json"
}
},
"shipmentAddress": "{{source.UF_CRM_**|default()}}",
"shipmentAddressFull": {
"comment": "{{source.UF_CRM_***|default()}}",
"addInfo":"{{source.UF_CRM_***|default()}}"
},
"deliveryPlannedMoment": "{{step21}}",
"project": {
"meta": {
"href": "{{step24.0.meta.href}}",
"metadataHref": "{{step24.0.meta.metadataHref}}",
"type": "{{step24.0.meta.type}}",
"mediaType": "application/json",
"uuidHref": "{{step24.0.meta.uuidHref}}"
}
},
"attributes": [
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/1346cbba-dc6a-11e8-9109-f8fc000be52d",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "time",
"value": "{{step28}}"
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/7d55d84f-7b99-11e8-9109-f8fc000a26fe",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "boolean",
"value": {{step29|boolean()}}
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/49922556-d517-11e3-0e3e-002590a28eca",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "string",
"value": "{{source.UF_CRM_1600454081|default()}}"
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/37793c78-2225-11ec-0a80-04cc0016a753",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "employee",
"value": {
"meta": {
"href": "{{step32.0.owner.meta.href}}",
"type": "employee",
"mediaType": "application/json"
}
}
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/99abd13c-0254-11e9-912f-f3d4001e99af",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "link",
"value": "{{source.UF_CRM_***|default()}}"
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/a82ba1fe-0b1a-11f0-0a80-003500266be0",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "link",
"value": "https://crm.smartoffice-online.ru/crm/deal/details/{{source.ID}}/"
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/27bea58b-f9e6-11ea-0a80-0197000f2af1",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "long",
"value": {{source.ID}}
},
{
"meta": {
"href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata/attributes/4f83f12f-e215-11ee-0a80-07480016ebe0",
"type": "attributemetadata",
"mediaType": "application/json"
},
"type": "customentity",
"value": {
"meta": {
"href": "{{step35.0.meta.href}}",
"type": "customentity",
"mediaType": "application/json"
}
}
}
]
}

2.5. Шаг 5: Запуск

Запускаем.

-57

3. Итог

Мы показали, как настроить интеграцию в Пинкит, чтобы автоматически обновлялись товары в сделке если сделка обновлена в Битрикс24.
В результатке работы данной интеграции товары в сделке будут синхронизированы по UUID.

Также рассмотрели обратную интгеграцию: как автоматически создать заказ в МойСклад на основе новой сделки в воронке «Продажи» в Битрикс24.

Напоминаем, что две из 9 интеграций из кейса нашего заказчика, который занимается продажей товаров. МойСклад используется для управления заказами и складом, а Битрикс24 — для ведения сделок.

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

Возникли сложности с настройкой? Напишите нам в Телеграм или WhatsApp, расскажите о вашем бизнес-сценарии. Эксперты Пинкит помогут настроить интеграцию без разработки (настроим первую интеграцию бесплатно).

Если вам нужна интеграция с сервисом, которого в Пинкит нет, или приватное событие/действие, через Пинкитбилдер вы можете самостоятельно добавить авторизацию, необходимые события и действия без разработки.
Подберите свой шаблон интеграции без регистрации здесь.
Алексей Окара, продакт-менеджер Пинкит