Данная статья — продолжение серии статей на тему интеграции МойСклад и Битрикс24 (начало здесь). В предыдущей статье мы показали, как настроить интеграцию "МойСклад: заказ обновлён → Битрикс24: обновить сделку", теперь давайте разберем следующий шаг: "Битрикс24: сделка обновлена → обновить товары в сделке". Также разберем обратную интеграцию: Битрикс24: сделка создана в воронке «Продажи» → создать заказ в МойСклад.
Вы можете настроить интеграции по описанию ниже или просто установить шаблоны по ссылке и донастроить его под свои бизнес-процессы или настроить интеграции с нуля по описанию ниже.
Если возникнут сложности — наши эксперты всегда рядом, настроим первую интеграцию бесплатно.
1. Интеграция "Сделка - назначить товары"
Рассмотрим, как автоматически обновлять товары в сделке.
Триггер: Сделка обновлена в Битрикс24.
Действие: Синхронизировать товары по UUID.
1.1. Шаг 1: Откуда
Указываем Пинкит и интеграцию, настроенную ранее.
1.2. Шаг 2: Инструменты
1.2.1. Получаем информацию о товарных позициях
- Получить Meta ссылку на позиции товара
Преобразуем строку в массив в поле source.int12081.source.positions.meta.href.
- Получаем позиции товара
Используем API-запрос Методом GET с указанием URL = {{step1.1}}.
- Для каждого товара из заказа
Используем инструмент Для каждого в поле step2.rows.
- Сделать одиночный товар снова массивом
Используем Преобразование типов данных в поле step3.
- Получить Meta ссылку на развернутую информацию о товаре
Преобразуем строку в массив в поле step3.assortment.meta.href.
- Получаем развернутую информацию о товарной позиции на стороне МойСклад
Используем API-запрос Методом GET с указанием URL ={{step5.1}}
1.2.2. Создание товара при необходимости
- Выбрать новый товар или уже существующий
Используем инструмент Если-иначе в поле step10.result. Условие - (Логическое) Истина, Результат при успешной проверке = {{step10.result}}, Результат при неуспешной проверке = {{step7.result.0.ID}}.
- Собрать массив товаров
Объединяем прогоны.
- Подогнать массив с товаром в нужный формат
Используем Преобразование массива объектов в поле step12.
- Фильтр
Используем Фильтр элементов массива в поле step13.
1.3. Шаг 3: Куда
Назначаем товары сделке.
1.4. Шаг 4: Сопоставление данных
Сопоставляем данные:
ID сделки - {{source.int12081.step3}}
Массив товаров - {{step14}}
1.5. Шаг 5: Запуск
Запускаем.
2. Битрикс24.Продажи = Сделка - создана => Создать заказ в МойСклад
Данная интеграция будет создавать заказ в МойСклад на основе сделки в Битрикс24.
Триггер: Создана сделка в воронке «Продажи» в Битрикс24.
Действие: Создать заказ в МойСклад.
2.1. Шаг 1: Откуда
Получаем данные в момент создания сделки в Битрикс24.
2.2. Шаг 2: Инструменты
2.2.1. Если есть компания → получаем её реквизиты (ИНН, название, email) → ищем в МойСклад по ИНН → если не нашли, создаём новую компанию
- Сопоставление_Проверяем выгружался ли ранее заказ в МойСклад
Используем Поиск ID соответствующий сущности в поле source.ID.
- Сопоставление_Если заказ ранее выгружался, тогда прервать, иначе продолжить
Используем проверку в поле step38. Условие - (Логическое) Истина, Действие - прервать, если проверка пройдена.
Если есть компания →
Используем Если-Иначе в поле source.COMPANY_ID. Условие*(Логическое) Истина, Результат при успешной проверке = 1, Результат при неуспешной проверке = 0.
получаем её реквизиты →
Используем API-запрос Методом GET с указанием URL = /crm.requisite.list?filter[ENTITY_ID]={{source.COMPANY_ID}}.
получаем её телефон, email →
Используем API-запрос Методом GET с указанием URL = /crm.company.get?ID={{source.COMPANY_ID}}
→ ищем в МойСклад по ИНН →
Используем API-запрос Методом GET с указанием URL = /entity/counterparty?filter=inn~{{step2.result.0.RQ_INN}}.
→ Если компания найдена по ИНН в МойСклад, тогда Ложь, иначе Истина →
Используем Если-иначе в поле step4.rows. Условие*Пустое значение, результат при успешной проверке = 1, результат при успешной проверке = 0.
- Выбрать это ИП или Юр.лицо
Используем Сопоставление данных в поле step2.result.0.PRESET_ID.
→ если не нашли, создаём новую компанию
Используем 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}}"
}
2.2.2. Если нет компании → получаем контакт (ФИО, email, телефон) → ищем в МойСклад по email/телефону → если не нашли, создаём новый контакт
Если нет компании, проверяем контакт →
Используем Если-иначе по полю source.COMPANY_ID. Условие*(Логическое) Ложь, результат при успешной проверке = 1, результат при неуспешной проверке = 0.
→ получаем контакт (ФИО, email, телефон) →
Используем API-запрос Методом GET с указанием URL =/crm.contact.get?ID={{source.CONTACT_ID}}.
→ ищем в МойСклад по Phone →
Используем API-запрос Методом GET с указанием URL /entity/counterparty?filter=phone~{{step9.result.PHONE.0.VALUE}}
Если по телефону контакт не найден, тогда продолжить поиск по Email
Используем Если-Иначе в поле step10.rows.
→ ищем в МойСклад по Email →
Используем API-запрос Методом GET с указанием URL = /entity/counterparty?filter=email~{{step9.result.EMAIL.0.VALUE}}
- Если по Email контакт не найден, тогда проверяем был ли найден контакт по Email или Телефон
Используем если-Иначе в поле step12.rows. Условие*Пустое значение, Результат при успешной проверке = 1, Результат при неуспешной проверке = 0.
→ если не нашли, создаём новый контакт
Используем 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"
}
- Делаем массив ссылок 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().
- Склеить 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()
2.2.3. «Организация»
- Какую организацию выбрать при создании заказа
Используем Если-Иначе в поле source.UF_CRM_***
. Условие*(Число) Равно, Сравниваемое значение = 330.
2.2.4. «Склад»
- Сопоставление ID склада
Используем Сопоставление данных в поле source.UF_CRM_*****.
- Получить список складов в МойСклад
Используем API-запрос Методом GET с указанием URL = /entity/store.
- Найти нужный клад из списка
Используем Фильтр элементов массива в поле step19.rows.
2.2.5. «План. дата отгрузки» (системное поле) «План. дата отгрузки» (доп. поле)
- «План. дата отгрузки» (доп. поле)
Используем Форматирование даты/времени в поле source.UF_CRM_*****.
2.2.6. «Проект» (системное поле) «Проект (Pinall)» (доп. поле)
- Проект
Используем Сопоставление данных в поле source.UF_CRM_*****.
- Получить список проектов в МойСклад
Используем API-запрос Методом GET с указанием URL = /entity/project
- Найти нужный Проект из списка
Используем Фильтр элементов массива в поле step23.rows. Условие - (Текст) Полностью совпадает, Сравниваемое значение = step22.
2.2.7. «Канал продаж»
- Канал продаж
Используем сопоставление данных в поле source.UF_CRM_*****.
- Получить список Каналов Продаж в МойСклад
Используем API-запрос Методом GET с указанием URL = /entity/saleschannel.
- Найти нужный Канал Продаж из списка
Используем Фильтр элементов массива в поле step26.rows. Условие*(Текст) Полностью совпадает, Сравниваемое значение = step25.
2.2.8. «Срок резерва» (доп. поле) и Заказ оплачен
- «Срок резерва» (доп. поле)
Используем Форматирование даты/времени в поле source.UF_CRM_*****.
- Заказ оплачен
Используем Сопоставление данных в поле source.UF_CRM_*****.
2.2.9. Сборщик заказа
- Сборщик заказа
Используем сопоставление данных в поле source.UF_CRM_*****.
- Получить список Сотрудников в МойСклад
Используем API-запрос Методом GET с указанием URL = /entity/employee
- Выбрать нужного сборщика из списка МойСклад
Используем Фильтр элементов массива в поле step31.rows. Условие*(Текст) Полностью совпадает, Сравниваемое значение = step30.
2.2.10. Метод оплаты
- Метод оплаты
Используем Сопоставление данных в поле source.UF_CRM_*****.
- Получить список Метод оплаты в МойСклад
Используем API-запрос Методом GET с указанием URL =/entity/customentity/
- Выбрать нужный Метод оплаты из списка
Используем Фильтр элементов массива в поле step34.rows. Условие*(Текст) Содержит, Сравниваемое значение = step33.
2.2.11. Сопоставление сотрудников
- Сотрудники
Используем Сопоставление данных в поле source.ASSIGNED_BY_ID.
- Выбрать нужного сотрудника из списка МойСклад
Используем Фильтр элементов массива в поле step31.rows. Условие - (Текст) Полностью совпадает, Сравниваемое значение = step36.
2.3. Шаг 3: Куда
Добавляем заказ в МойСклад.
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: Запуск
Запускаем.
3. Итог
Мы показали, как настроить интеграцию в Пинкит, чтобы автоматически обновлялись товары в сделке если сделка обновлена в Битрикс24.
В результатке работы данной интеграции товары в сделке будут синхронизированы по UUID.
Также рассмотрели обратную интгеграцию: как автоматически создать заказ в МойСклад на основе новой сделки в воронке «Продажи» в Битрикс24.
Напоминаем, что две из 9 интеграций из кейса нашего заказчика, который занимается продажей товаров. МойСклад используется для управления заказами и складом, а Битрикс24 — для ведения сделок.
Вы можете просто установить шаблоны по ссылке и донастроить их под свои бизнес-процессы или настроить интеграции с нуля по инструкции, которую мы привели в статье.
Возникли сложности с настройкой? Напишите нам в Телеграм или WhatsApp, расскажите о вашем бизнес-сценарии. Эксперты Пинкит помогут настроить интеграцию без разработки (настроим первую интеграцию бесплатно).
Если вам нужна интеграция с сервисом, которого в Пинкит нет, или приватное событие/действие, через Пинкитбилдер вы можете самостоятельно добавить авторизацию, необходимые события и действия без разработки.
Подберите свой шаблон интеграции без регистрации здесь.
Алексей Окара, продакт-менеджер Пинкит