Интеграции Битрикс24 и Power BI силами ваших программистов
Поделиться
- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
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, то обращайтесь - мы поможем!
Поделиться
- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
- Комментарии
Загрузка комментариев...
Категории
Это интересно
Облако тегов
1С
1С Бухгалтерия
1С УНФ
1С УТ
crm
DataMatrix
iiko
Mobile SMARTS
RS.Loyalty
SimplePacking
автоматизация
автоматизация магазина
автоматизация ресторана
автоматизация склада
автоматизация торговли
акциз
алгоритм
банковское оборудование
Битрикс24
битрикс24
весы для склада
видеонаблюдение
детекторы банкнот
Документооборот
документы
ЕГАИС
инвентаризация
инструкция
интеграция
калькуляция
касса
клеверенс
КриптоПро
курсы
лояльность
магазин
Магазин 15
маркетплейсы
маркировка
маркировка молочной продукции
маркировка текстиля
меркурий
мобильная переоценка
накладная
налоги
напитки
настройка
обучение персонала
онлайн-кассы
оптимизация склада
организация в Битрикс
организация работы
отчеты
офис
ошибка чека
печать ценников
подакцизные товары
принтеры для печати этикеток
продукты питания
проектный офис
работа в Битрикс
регистрация кассы
СВХ
сканеры штрихкода
Склад
склад
Склад 15
сортировщики купюр
структура компании
счетчики купюр
терминалы
термотрансферные принтеры
Торговля
торговля
требования к складу
ТСД
Управление предприятием
Учет
учет
фискальные накопители
фискальные регистраторы
ценники
чек коррекции
чеки
Честный Знак
честный знак