Интеграции Битрикс24 и Power BI силами ваших программистов
10 декабря 2019 11:38
// Программирование
Мы предлагаем Вам небольшое описание кода, которое сделано на примере “Сделок”из CRM-системы Битрикс24.
Периодически в компанию ДЕНВИК приходят запросы по интеграции Битрикс24 и Power BI. И наши специалисты знают, что не все клиенты готовы делать полноценную интеграцию. Поэтому мы предлагаем вам своими силами проделать эту работу!
Итак, вперед! Первым делом создаем “Функцию” в Power Query - “GetCRMDealListPage”. Она должна быть со следующим содержимым:
(page as number) =>
let
//Find current time
One = DateTime.LocalNow(),
//Define Wait function
Wait = (seconds as number, action as function) =>
if (List.Count(
List.Generate(
() => DateTimeZone.LocalNow() + #duration(0,0,0,seconds),
(x) => DateTimeZone.LocalNow() < x,
(x) => x)
) = 0)
then null else action(),
//Call Wait function to wait 5 seconds
//then return the current time again
Two = Wait(5,DateTime.LocalNow),
Pagestart = page*50,
Источник = Json.Document(Web.Contents("https://ВАШПОРТАЛ.bitrix24.ru/rest/1/ВАШКЛЮЧ/crm.deal.list.json?start=&amp;amp;quot;&......),
dd = Function.InvokeAfter(Источник,#duration(0,0,0,10)),
result = Источник[result],
//result = dd[result],
#"Преобразовано в таблицу" = Table.FromList(result, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Развернутый элемент Column1" = Table.ExpandRecordColumn(#"Преобразовано в таблицу", "Column1", {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"}, {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"})
in
#"Развернутый элемент Column1"
let
Источник = Json.Document(Web.Contents("https://ВАШПОРТАЛ.bitrix24.ru&amp;amp;quot;&amp;amp;amp;&amp;amp;quot;/rest/.....)),
total1 = Источник[total],
#"Значение после деления" = total1 / 50,
#"Округлено вверх" = Number.RoundUp(#"Значение после деления"-1),
ListPages = List.Numbers(0,#"Округлено вверх"),
#"Преобразовано в таблицу" = Table.FromList(ListPages, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Вызвана настраиваемая функция" = Table.AddColumn(#"Преобразовано в таблицу", "GetCRMDealListPage", each GetCRMDealListPage([Column1])),
#"Развернутый элемент GetCRMDealListPage" = Table.ExpandTableColumn(#"Вызвана настраиваемая функция", "GetCRMDealListPage", {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"}, {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"}),
#"Переименованные столбцы" = Table.RenameColumns(#"Развернутый элемент GetCRMDealListPage",{{"Column1", "Страница"}, {"TITLE", "Название сделки"}, {"PROBABILITY", "Вероятность"}, {"OPPORTUNITY", "Сумма сделки"}}),
#"Сортированные строки" = Table.Sort(#"Переименованные столбцы",{{"BEGINDATE", Order.Descending}}),
#"Переименованные столбцы1" = Table.RenameColumns(#"Сортированные строки",{{"ASSIGNED_BY_ID", "ID_Ответственный"}, {"COMPANY_ID", "ID_Компании"}, {"CONTACT_ID", "ID_Контакта"}, {"DATE_CREATE", "Дата создания"}, {"DATE_MODIFY", "Дата модификации"}, {"CLOSEDATE", "Дата закрытия сделки"}, {"BEGINDATE", "Дата начала сделки"}}),
#"Измененный тип" = Table.TransformColumnTypes(#"Переименованные столбцы1",{{"Дата начала сделки", type datetimezone}, {"Дата закрытия сделки", type datetimezone}, {"Дата создания", type datetimezone}, {"Дата модификации", type datetimezone}}),
#"Сортированные строки1" = Table.Sort(#"Измененный тип",{{"Страница", Order.Descending}}),
#"Извлеченный текст перед разделителем" = Table.TransformColumns(#"Сортированные строки1", {{"Сумма сделки", each Text.BeforeDelimiter(_, "."), type text}}),
#"Измененный тип1" = Table.TransformColumnTypes(#"Извлеченный текст перед разделителем",{{"Сумма сделки", type number}}),
#"Сортированные строки2" = Table.Sort(#"Измененный тип1",{{"ID", Order.Ascending}}),
#"Переименованные столбцы2" = Table.RenameColumns(#"Сортированные строки2",{{"STAGE_ID", "Стадия_ID"}, {"TYPE_ID", "Направление_ID"}, {"CLOSED", "Закрыта"}, {"OPENED", "Открыта"}, {"ID", "ID сделки"}})
in
#"Переименованные столбцы2"
Что для этого нужно?
В качестве примера, мы публикуем небольшое описание кода, с которым легко разберутся программисты вашей компании. Оно сделано на примере “Сделок” из CRM-системы Битрикс24:
Итак, вперед! Первым делом создаем “Функцию” в Power Query - “GetCRMDealListPage”. Она должна быть со следующим содержимым:
- ВАШПОРТАЛ - указываете имя вашего портала в Битрикс24;
- ВАШКЛЮЧ - указываете ключ с вашего приложения (webhook);
(page as number) =>
let
//Find current time
One = DateTime.LocalNow(),
//Define Wait function
Wait = (seconds as number, action as function) =>
if (List.Count(
List.Generate(
() => DateTimeZone.LocalNow() + #duration(0,0,0,seconds),
(x) => DateTimeZone.LocalNow() < x,
(x) => x)
) = 0)
then null else action(),
//Call Wait function to wait 5 seconds
//then return the current time again
Two = Wait(5,DateTime.LocalNow),
Pagestart = page*50,
Источник = Json.Document(Web.Contents("https://ВАШПОРТАЛ.bitrix24.ru/rest/1/ВАШКЛЮЧ/crm.deal.list.json?start=&amp;amp;quot;&......),
dd = Function.InvokeAfter(Источник,#duration(0,0,0,10)),
result = Источник[result],
//result = dd[result],
#"Преобразовано в таблицу" = Table.FromList(result, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Развернутый элемент Column1" = Table.ExpandRecordColumn(#"Преобразовано в таблицу", "Column1", {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"}, {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"})
in
#"Развернутый элемент Column1"
После проделанной манипуляции переходим к следующему шагу - подключаемся к к таблице сделок, используя данную функцию.
Получаем данные сделок таким образом:let
Источник = Json.Document(Web.Contents("https://ВАШПОРТАЛ.bitrix24.ru&amp;amp;quot;&amp;amp;amp;&amp;amp;quot;/rest/.....)),
total1 = Источник[total],
#"Значение после деления" = total1 / 50,
#"Округлено вверх" = Number.RoundUp(#"Значение после деления"-1),
ListPages = List.Numbers(0,#"Округлено вверх"),
#"Преобразовано в таблицу" = Table.FromList(ListPages, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Вызвана настраиваемая функция" = Table.AddColumn(#"Преобразовано в таблицу", "GetCRMDealListPage", each GetCRMDealListPage([Column1])),
#"Развернутый элемент GetCRMDealListPage" = Table.ExpandTableColumn(#"Вызвана настраиваемая функция", "GetCRMDealListPage", {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"}, {"ID", "TITLE", "TYPE_ID", "STAGE_ID", "PROBABILITY", "CURRENCY_ID", "OPPORTUNITY", "TAX_VALUE", "LEAD_ID", "COMPANY_ID", "CONTACT_ID", "QUOTE_ID", "BEGINDATE", "CLOSEDATE", "ASSIGNED_BY_ID", "CREATED_BY_ID", "MODIFY_BY_ID", "DATE_CREATE", "DATE_MODIFY", "OPENED", "CLOSED", "COMMENTS", "ADDITIONAL_INFO", "LOCATION_ID", "CATEGORY_ID", "STAGE_SEMANTIC_ID", "IS_NEW", "IS_RECURRING", "IS_RETURN_CUSTOMER", "IS_REPEATED_APPROACH", "SOURCE_ID", "SOURCE_DESCRIPTION", "ORIGINATOR_ID", "ORIGIN_ID", "UTM_SOURCE", "UTM_MEDIUM", "UTM_CAMPAIGN", "UTM_CONTENT", "UTM_TERM"}),
#"Переименованные столбцы" = Table.RenameColumns(#"Развернутый элемент GetCRMDealListPage",{{"Column1", "Страница"}, {"TITLE", "Название сделки"}, {"PROBABILITY", "Вероятность"}, {"OPPORTUNITY", "Сумма сделки"}}),
#"Сортированные строки" = Table.Sort(#"Переименованные столбцы",{{"BEGINDATE", Order.Descending}}),
#"Переименованные столбцы1" = Table.RenameColumns(#"Сортированные строки",{{"ASSIGNED_BY_ID", "ID_Ответственный"}, {"COMPANY_ID", "ID_Компании"}, {"CONTACT_ID", "ID_Контакта"}, {"DATE_CREATE", "Дата создания"}, {"DATE_MODIFY", "Дата модификации"}, {"CLOSEDATE", "Дата закрытия сделки"}, {"BEGINDATE", "Дата начала сделки"}}),
#"Измененный тип" = Table.TransformColumnTypes(#"Переименованные столбцы1",{{"Дата начала сделки", type datetimezone}, {"Дата закрытия сделки", type datetimezone}, {"Дата создания", type datetimezone}, {"Дата модификации", type datetimezone}}),
#"Сортированные строки1" = Table.Sort(#"Измененный тип",{{"Страница", Order.Descending}}),
#"Извлеченный текст перед разделителем" = Table.TransformColumns(#"Сортированные строки1", {{"Сумма сделки", each Text.BeforeDelimiter(_, "."), type text}}),
#"Измененный тип1" = Table.TransformColumnTypes(#"Извлеченный текст перед разделителем",{{"Сумма сделки", type number}}),
#"Сортированные строки2" = Table.Sort(#"Измененный тип1",{{"ID", Order.Ascending}}),
#"Переименованные столбцы2" = Table.RenameColumns(#"Сортированные строки2",{{"STAGE_ID", "Стадия_ID"}, {"TYPE_ID", "Направление_ID"}, {"CLOSED", "Закрыта"}, {"OPENED", "Открыта"}, {"ID", "ID сделки"}})
in
#"Переименованные столбцы2"
Зачем так “сложно”?
Суть в том, что Битрикс24 отдает по json только первые 50 сделок, да и вообще любых записей.
Чтобы перебрать все страницы, нам необходимо:
- Выяснить общее количество записей
- Вычислить количество страниц (по 50 записей в каждой)
- И выбрать все страницы поочередно
-
При этом, учитывая, что нам нужен таймаут между запросами каждой следующей страницы
Смотрите, как все просто! А вы говорили: “Сложно-сложно”...
Особенности:
Такой метод получения данных из Битрикс24 в Power BI доступен только для Power BI Desktop-версии.
Если необходимо данные получать в реляционную базу данных и анализировать их уже web-версии Power BI, то обращайтесь - мы поможем!
Задать вопрос / Заказать интеграциюЕсли необходимо данные получать в реляционную базу данных и анализировать их уже web-версии Power BI, то обращайтесь - мы поможем!
- Комментарии
Загрузка комментариев...