Решение о переезде из облака Битрикс24 в коробку бизнес принимает по разным причинам. В любом случае, это сложный процесс, требующий много ручного труда, если только не использовать инструменты для автоматизации. В статье даем подробную инструкцию, как перенести данные из облака в коробку Битрикс24 с помощью REST API. Рассмотрим процесс настройки миграции задач, контактов, компаний и сделок.1. Переезд из облачного Битрикс24 в коробочный: проблема и решениеУ каждого заказчика разный подход к миграции и собственный взгляд на то, какие данные необходимо переносить. По большей части это зависит от используемых на портале сущностей. В основном требуется перенос сделок и задач, а также контактов и компаний с сохранением связей между ними. В отдельных случаях переносятся смарт и бизнес-процессы.Инструкцию по настройке обмена данными между облаком Битрикс24 и коробкой (создание и обновление сделок) читайте по ссылке.Но главная проблема миграции — это ручной перенос данных (бэкап облака не предоставляется с 1 сентября 2023 года). Из-за этого процесс может серьезно затянуться, что приведет к простою рабочего портала, а следовательно и потерям клиентов или финансов. Можно перенести базовые настройки и даже пользователей, но когда у компании наработанные годами массивы данных: задачи с чек-листами, таймлайн сделок, смарт-процессы и так далее — их выгрузка невозможна без REST API.Инструкция по обмену задачами Битрикс24 (из коробки в облако) и проверка интеграции на успех здесь.С помощью интеграций на платформе Пинкит мы помогаем нашим заказчикам перенести данные из облака в коробку в том объеме и целостности, который позволит приступить к работе в коробочной версии портала Битрикс24 в короткие сроки. Интеграции можно настроить самостоятельно по подробной инструкции ниже.Передача сделок из коробки Битрикс24 в облако Битрикс24 с сегментацией по пользовательским полям описана в этой нашей статье.2. Инструкция по настройке интеграций Пинкит для переноса задач из облака в коробку Битрикс24Переносить будем задачи вместе с последними 50 комментариями, файлы вложений, названия и пункты чек-листа, а также тайминг. Для этого потребуется настроить шесть интеграций.2.1. Интеграция "Задача создана в облаке -> Задачу создать в коробке"2.1.1. Шаг 1: ОткудаОткуда отправляем данные: Битрикс24 (Webhook), Когда - Задача создана. Подключаем доступ к облаку.2.1.2. Шаг 2: ИнструментыСопоставление групп между облаком и коробкойИспользуем инструмент Сопоставление данных по полю source.groupId, чтобы сопоставить группы задач между облаком и коробкой.Сопоставление Наблюдателей, Исполнителей, Постановщиков, Соисполнителей:Сопоставление настроим по полям задач source.createdBy, source.responsibleId, source.auditors, source.accomplices.Получаем теги задачи:Используем API-запрос GET-методом с указанием URL: /task.item.gettags?TASK_ID={{source.id}}.Получаем вложения задачиИспользуем API-запрос GET-методом с указанием URL: /task.item.getfiles.json?TASKID={{source.id}}.Вложения в задаче найдены?Используем инструмент "Если-Иначе", название поля - step4.result, Условие - "Не пустое значение", Результат при успешной проверке - 1, Результат при неуспешной проверке - 0. Получить ID ХранилищаИспользуем API-запрос GET-методом с указанием URL: /disk.storage.getlist?filter[ENTITY_ID]={{step1}}&filter[ENTITY_TYPE]=groupПолучить стадии канбана в облакеИспользуем API-запрос GET-методом с указанием URL: /task.stages.get?entityId={{source.groupId}}&isAdmin=trueПолучить стадии канбана в коробкеИспользуем API-запрос GET-методом с указанием URL: /task.stages.get?entityId={{step1}}&isAdmin=trueОтфильтровать стадию в облакеИспользуем фильтр элементов массива, Название поля - step7.result, Условие - Текст содержит, Сравниваемое значение - source.stageId.Найти нужную стадию канбана в коробкеИспользуем фильтр элементов массива, Название поля - step8.result, Название поля внутри элемента массива - TITLE, Условие - Текст содержит, Сравниваемое значение - step9.0.TITLE.2.1.3. Шаг 3: КудаКуда отправляем данные - Битрикс24 (это уже будет коробка), Какое действие совершаем - Создать задачу.2.1.4. Шаг 4: Сопоставление данныхСопоставляем название и описание задачи в облаке и коробке. Указываем дополнительные сопоставления из шага 2.Дополнительное тело запроса:{ "fields": { "RESPONSIBLE_ID": "{{step2.source_responsibleId|default()}}", "MARK": "{{source.mark|default()}}", "PRIORITY": "{{source.priority|default()}}", "MULTITASK": "{{source.multitask|default()}}", "NOT_VIEWED": "{{source.notViewed|default()}}", "REPLICATE": "{{source.replicate|default()}}", "STAGE_ID": "{{step10.0.ID|default()}}", "START_DATE_PLAN": "{{source.startDatePlan|default()}}", "END_DATE_PLAN": "{{source.endDatePlan|default()}}", "XML_ID": "{{source.xmlId|default()}}", "ALLOW_CHANGE_DEADLINE": "{{source.allowChangeDeadline|default()}}", "TASK_CONTROL": "{{source.taskControl|default()}}", "ADD_IN_REPORT": "{{source.addInReport|default()}}", "TIME_ESTIMATE": "{{source.timeEstimate|default()}}", "TIME_SPENT_IN_LOGS": "{{source.timeSpentInLogs|default()}}", "MATCH_WORK_TIME": "{{source.matchWorkTime|default()}}", "FORUM_TOPIC_ID": "{{source.forumTopicId|default()}}", "FORUM_ID": "{{source.forumId|default()}}", "SITE_ID": "{{source.siteId|default()}}", "SUBORDINATE": "{{source.subordinate|default()}}", "EXCHANGE_MODIFIED": "{{source.exchangeModified|default()}}", "EXCHANGE_ID": "{{source.exchangeId|default()}}", "OUTLOOK_VERSION": "{{source.outlookVersion|default()}}", "VIEWED_DATE": "{{source.viewedDate|default()}}", "SORTING": "{{source.sorting|default()}}", "DURATION_FACT": "{{source.durationFact|default()}}", "IS_MUTED": "{{source.isMuted|default()}}", "IS_PINNED": "{{source.isPinned|default()}}", "IS_PINNED_IN_GROUP": "{{source.isPinnedInGroup|default()}}", "DURATION_PLAN": "{{source.durationPlan|default()}}", "DURATION_TYPE": "{{source.durationType|default()}}", "FAVORITE": "{{source.favorite|default()}}", "ALLOW_TIME_TRACKING":"Y", "UF_AUTO_299592262349":"{{source.ufAuto418665225732}}" } }И дополнительные сопоставления:groupId Тип: Тело Название параметра: fields.GROUP_ID Значение параметра: {{step1}} Дата создания Тип: Тело Название параметра: fields.CREATED_DATE Значение параметра: {{Дата создания}} Дата изменения Тип: Тело Название параметра: fields.CHANGED_DATE Значение параметра: {{Дата изменения}} Статус Тип: Тело Название параметра: fields.STATUS Значение параметра: {{Статус}} Крайний срок Тип: Тело Название параметра: fields.DEADLINE Значение параметра: {{Крайний срок}} Постановщик Тип: Тело Название параметра: fields.CREATED_BY Значение параметра: {{step2.source_createdBy}} Дата начала Тип: Тело Название параметра: fields.DATE_START Значение параметра: {{Дата начала}} AUDITORS Тип: Тело Название параметра: fields.AUDITORS Значение параметра: {{step2.source_auditors}} ACCOMPLICES Тип: Тело Название параметра: fields.ACCOMPLICES Значение параметра: {{step2.source_accomplices}} TAGS Тип: Тело Название параметра: fields.TAGS Значение параметра: {{step3.result|default()}}2.1.5. Шаг 5: ЗапускУказываем название интеграции, периодичность запросов данных и запускаем. Также можем указать режим отладки (если отметить данный чекбокс, то в журнал будут попадать абсолютно все запросы, которые происходят в интеграции).2.2. Интеграция "Задача - добавить вложения"2.2.1. Шаг 1: ОткудаОткуда отправляем данные - Пинкит, Когда - Интеграция - успех, подключаем аккаунт Пинкит и выбираем интеграцию, настроенную нами ранее.2.2.2. Шаг 2: ИнструментыВложение было?Используем инструмент Проверка, Название поля - source.int6551.step5, Условие - ЧислоРавно, Сравниваемое значение - 1, Действие - Продолжить, если проверка пройдена.Для каждого вложенияТип шага - Для каждого, название поля - source.int6551.step4.result.Получить развернутую информацию о вложенияхИспользуем API-запрос GET-методом с указанием URL: /disk.attachedObject.get?id={{step2.ATTACHMENT_ID|default()}}Скачать файлТип шага - Скачать файл, для этого используем API-запрос GET-методом с указанием URL: {{step3.result.DOWNLOAD_URL|default()}}.2.2.3. Шаг 3: КудаКуда отправляем данные - коробка Битрикс24, когда: Задача - добавить вложение.2.2.4. Шаг 4: Сопоставление данныхНастраиваем сопоставление: ID задачи - {{source.int6551.result.result.task.id|default()}} Название файла - {{step3.result.NAME}} URL файла - {{step4}}2.2.5. Шаг 5: ЗапускЗапускаем интеграцию.2.3. Интеграция "Задача - Добавить комментарии 50 последних"2.3.1. Шаг 1: ОткудаОткуда отправляем данные - Пинкит, Когда - Интеграция - успех, подключаем аккаунт Пинкит и выбираем интеграцию, настроенную нами ранее.2.3.2. Шаг 2: ИнструментыПолучить комментарии из портала, откуда выгружаемИспользуем API-запрос GET-методом с указанием URL: /task.commentitem.getlist.json?TASKID={{source.int6551.source.id}}&order[POST_DATE]=asc.Для каждого комментарияИспользуем инструмент "Для каждого", Название поля - step1.result.Убрать теги из комментарияИспользуем инструмент "Замена по регулярному выражению", Название поля - step2.POST_MESSAGE, Регулярное выражение - /\[USER=\d+\](.*?)\[\/USER\]/.Есть ли вложенияИспользуем тип шага Если-иначе, Название поля - step2.ATTACHED_OBJECTS, Условие - Существует, Результат при успешной проверке - 1, Результат при неуспешной проверке - 0.Отфильтровать файлИспользуем фильтр элементов массива, Условие выполнения - step5, Название поля - step2.ATTACHED_OBJECTS|default(), Название поля внутри элемента массива - DOWNLOAD_URL, Условие - Не пустое значение.Развернутая информация о вложенияхИспользуем API-запрос GET-методом с указанием URL: /disk.attachedObject.get?id={{step6.0.ATTACHMENT_ID}}, Условие выполнения - step5.Скачать файлИспользуем инструмент "Скачать файл", API-запрос GET-методом с указанием URL:{{step7.result.DOWNLOAD_URL}}, Условие выполнения - step5.Загрузить файл на диск в Хранилище группыИспользуем API-запрос POST-методом с указанием URL: /disk.storage.uploadfile.Тело запроса:{ "id": {{source.int6551.step6.result.0.ID}}, "fileContent": ["file", "{{step8|get_http_content()|base64_encode()}}"], "data": {"NAME": "{{step7.result.NAME|default()}}"}, "generateUniqueName": true }Условие выполнения - step5.Закрепить файл или нетИспользуем инструмент "Если-Иначе", название поля - step5, Условие - "ЧислоРавно", Сравниваемое значение - 1, Результат при успешной проверке - n{{step9.result.ID|default()}}, результат при неуспешной проверке - {{step9.result.ID|default()}}. 2.3.3. Шаг 3: КудаКуда отправляем данные - Битрикс24, Какое действие совершаем - "Задача - добавить комментарий", указываем пользователя, от чьего имени будут добавлены комментарии.2.3.4. Шаг 4: Сопоставление данныхНастраиваем сопоставление:ID задачи - {{source.int6551.result.result.task.id}} Текст комментария - от: {{step2.AUTHOR_NAME}} {{step4}}И пользовательское сопоставление:Файл в комментарий Тип: Тело Название параметра: fields.UF_FORUM_MESSAGE_DOC.0 Значение параметра: {{step10}}2.3.5. Шаг 5: ЗапускЗапускаем интеграцию.2.4. Интеграция "Задача. Добавить название чек-листа"2.4.1. Настройка 1 шага выполняется аналогично предыдущей интеграции.2.4.2. Шаг 2: ИнструментыПолучить чек-листы ЗадачиИспользуем API-запрос GET-методом с указанием URL: /task.checklistitem.getlist?TASKID={{source.int6551.source.id}}Чек-листы есть?Тип шага - "Проверка", Название поля - step1.result, Условие - "Пустое значение", Действие - "Прервать, если проверка пройдена". Отфильтровать заголовок чек-листаИнструмент - фильтр элементов массива, Название поля - step1.result, Название поля внутри элемента массива - PARENT_ID, Условие - ЧислоРавно.Для каждого заголовка чек-листаТип шага - "Для каждого", Название поля - step3.2.4.3. Шаг 3: КудаВыбираем Битрикс24, действие - "Создать элемент чек-листа", подключаем доступ к коробке.2.4.4. Шаг 4: Сопоставление данныхСопоставляем данные следующим образом:ID задачи - {{source.int6551.result.result.task.id|default()}} Название - {{step4.TITLE}} Завершено? (Y/N) - {{step4.IS_COMPLETE}} Важное? (Y/N) - {{step4.IS_IMPORTANT}}И пользовательское сопоставление:PARENT_ID Тип: Тело Название параметра: FIELDS.PARENT_ID Значение параметра: 02.4.5. Запускаем интеграцию2.5. Интеграция "Пункты чек-листа"2.5.1. Шаг 1 аналогичен описанному выше, только интеграцию указываем по чек-листам.2.5.2. Шаг 2: ИнструментыОтфильтровать чек-листыИспользуем фильтр элементов массива, Название поля - source.int6690.step1.result, Название поля внутри элемента массива -PARENT_ID, Условие - ЧислоРавно, Сравниваемое значение -source.int6690.step3.0.ID.Для каждого пунктаТип шага - Для каждого, Название поля - step1.2.5.3. Шаг 3: КудаВыбираем Битрикс24, действие - Создать элемент чек-листа, подключаем доступ к коробке.2.5.4. Шаг 4: Сопоставление данныхНастраиваем сопоставление:ID задачи - {{source.int6551.result.result.task.id}} Название - Тест Завершено? (Y/N) - {{step2.IS_COMPLETE}} Важное? (Y/N) - {{step2.IS_IMPORTANT}}Дополнительное тело запроса:{ "FIELDS": { "TITLE": "{{step2.TITLE}}" } }Пользовательское сопоставление:PARENT_ID Тип: Тело Название параметра: FIELDS.PARENT_ID Значение параметра: {{source.int6690.result.result|default()}} SORT_INDEX Тип: Тело Название параметра: FIELDS.SORT_INDEX Значение параметра: {{step2.SORT_INDEX}}2.5.5. Шаг 5: ЗапускЗапускаем интеграцию.2.6. Интеграция "Учёт рабочего времени"2.6.1. Шаг 1 аналогичен описанному выше, выбираем самую первую интеграцию.2.6.2. Шаг 2: ИнструментыПолучить тайминг по задачеИспользуем API-запрос GET-методом с указанием URL: /task.elapseditem.getlist?TASKID={{source.int6551.source.id}}Для каждого таймингаТип шага - Для каждого, Название поля - step1.result.Сопоставить пользователейИспользуем сопоставление данных по названию поля step2.USER_ID.2.6.3. Шаг 3: КудаВыбираем Битрикс24, действие - Добавить запись учета времени.2.6.4. Шаг 4: Сопоставление данныхСопоставляем данные:Идентификатор задачи - {{source.int6551.result.result.task.id|default()}} Длительность (секунд) - {{step2.SECONDS}} Комментарий - {{step2.COMMENT_TEXT}} Пользователь - {{step3}} Время создания - {{step2.CREATED_DATE}}2.6.5. Запускаем.3. ИтогТак же переносятся контакты, компании, сделки и другие нужные сущности из облака Битрикс24 в коробку с сохранением связей между сущностями.Регистрируйтесь по ссылке: https://lk.pinkit.io/register в личном кабинете Пинкит и тестируйте интеграции переноса облака в коробку самостоятельно по нашей инструкции или с нашей помощью.Алексей Окара, основатель Пинол и продакт-менеджер Пинкит#пинкит_миграция#пинол #пинкит #pinall #pinkit #bitrix24#битрикс24 #amo #amocrm #амо #амоцрм #crm #црм #црмсистема #црм_система #внедрениецрм #интеграция #миграция #обмен