Передаем контакты из 1С в Битрикс24 через REST API


Хочу поделиться опытом использования Битрикс24 REST API для экспорта контактов из 1С УТ 11

Первым делом регистрирую свое приложение в Битрикс24. Это нужно для получения client_id и client_secret.  Эти коды используются при авторизации.

Необходимо дать приложению требуемые права и поставить отметку «Приложение использует только API»

Ссылка на приложение может быть любая, в дальнейшем это не нужно.

Теперь подключаемся к Битрикс24

Процедура ПодключитьсяКБитрикс()

Если НЕ (AccessToken = "" ИЛИ RefreshToken = "" ИЛИ RefreshTime = Дата(1, 1, 1)) Тогда

Возврат;

КонецЕсли;


ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());

Соединение = Новый HTTPСоединение(
АдресБитрикс24, //"хххххх.bitrix24.ru",
, // порт
"user@mail.ru", // пользователь
"123456", // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);


Заголовки = Новый Соответствие;

Запрос = Новый HTTPЗапрос("oauth/authorize/?client_id=" + <strong>client_id</strong>, Заголовки);
Ответ = Соединение.Получить(Запрос);


// если нас переадрессовали
Если Ответ.КодСостояния = 302 Тогда

//в Location взять code

Параметры = ПолучитьПараметрыИзGetСтроки(Ответ.Заголовки.Получить("Location"));
Cookie = Ответ.Заголовки.Получить("Set-Cookie");
Код = Неопределено;


Если Параметры.Свойство("code", Код) Тогда

// используя Код получаем access_token и refresh_token

Соединение = Новый HTTPСоединение(
"oauth.bitrix.info",
, // порт
, // пользователь
, // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);

Запрос.АдресРесурса = "oauth/token" + ПараметрыАвторизацииВСтроке(Код);
Запрос.Заголовки.Вставить("Cookie", Cookie);


Ответ = Соединение.Получить(Запрос);


Если Ответ.КодСостояния <> 200 Тогда

ВызватьИсключение "Ошибка при получении access_token";

Иначе

// разобрать полученный json
json = Ответ.ПолучитьТелоКакСтроку();


Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(json);
ОтветСтруктура = ПрочитатьJSON(Чтение);

// сохраняю параметры подключения
AccessToken  = ОтветСтруктура.access_token;
RefreshToken = ОтветСтруктура.refresh_token;
RefreshTime  = ТекущаяДата() + ОтветСтруктура.expires_in;


КонецЕсли;



Иначе

ВызватьИсключение "Ошибка при подключении, нет параметра code";

КонецЕсли;


КонецЕсли;

КонецПроцедуры

Функция ПараметрыАвторизацииВСтроке(Код)

// собрать параметры в строку Get запроса
Возврат "/?" + "grant_type=authorization_code" + "&" +
"client_id=" + client_id + "&" +
"client_secret=" + client_secret + "&" +
"code=" + Код;

КонецФункции

client_id и client_secret получили при регистрации приложения в Битрикс24.

Функция «ПолучитьПараметрыИзGetСтроки» из строки вида адрес?параметр1=значение1&параметр2=значение2 возвращает структуру, где ключ = параметр, а значение = значение

Теперь пробуем добавить контакт

СтрПараметров =  "fields[NAME]=" + Имя + "&fields[SECOND_NAME]=" + Отчество + "&fields[LAST_NAME]=" + Фамилия +
"&fields[ADDRESS_CITY]=" + СтруктураПараметров.Город +
"&fields[COMMENTS]=" + СтруктураПараметров.Вашвиддеятельности +
"&fields[EMAIL][0][VALUE_TYPE]=WORK&fields[EMAIL][0][VALUE]=" + СтруктураПараметров.Email +
"&fields[ASSIGNED_BY_ID]=" +  ОтветственныйИД + "&fields[TYPE_ID]=CLIENT" +
"&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0][VALUE]=" + СтруктураПараметров.Телефон;


Рез = ОтправитьRESTЗапрос("crm.contact.add", СтрПараметров, "");

// смотрим что получилось

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Рез);

РезСтр = ПрочитатьJSON(Чтение);

Если РезСтр.Свойство("result", ИдНовогоКонтакта)  Тогда

Сообщить("Контакт добавлен!");

Иначе

ВызватьИсключение "Ошибка при добавлении нового контакта!";

КонецЕсли;

Что делает ОтправитьRESTЗапрос:

Функция ОтправитьRESTЗапрос(RESTЗапрос, Параметры, Тело)

ПроверитьТокен();


ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());

Соединение = Новый HTTPСоединение(
АдресБитрикс24,
, // порт
, // пользователь
, // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", Cookie);



Если Параметры = "" Тогда
Запрос = Новый HTTPЗапрос("rest/" + RESTЗапрос + "?auth=" + AccessToken, Заголовки);
Иначе
Запрос = Новый HTTPЗапрос("rest/" + RESTЗапрос + "?auth=" + AccessToken + "&" + Параметры, Заголовки);
КонецЕсли;

Запрос.УстановитьТелоИзСтроки(тело);



Ответ = Соединение.Получить(Запрос);

Возврат Ответ.ПолучитьТелоКакСтроку();

КонецФункции

Ну и соответственно  процедура ПроверитьТокен:

Процедура ПроверитьТокен()

// проверяю токен на валидность

Если RefreshTime = Дата(1, 1, 1) Тогда

ПодключитьсяКБитрикс();
Возврат;

КонецЕсли;

Если  RefreshTime - 5 < ТекущаяДата() Тогда

ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());
// обновить токен
Соединение = Новый HTTPСоединение(
"oauth.bitrix.info",
, // порт
, // пользователь
, // пароль
, // прокси
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);


Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", Cookie);

Запрос = Новый HTTPЗапрос("oauth/token" + ПараметрыОбновленияВСтроке(), Заголовки);




Ответ = Соединение.Получить(Запрос);


Если Ответ.КодСостояния <> 200 Тогда

ВызватьИсключение "Ошибка при получении access_token";

Иначе

// разобрать полученный json
json = Ответ.ПолучитьТелоКакСтроку();

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(json);
ОтветСтруктура = ПрочитатьJSON(Чтение);


// сохраняю параметры подключения
AccessToken  = ОтветСтруктура.access_token;
RefreshToken = ОтветСтруктура.refresh_token;
RefreshTime  = ТекущаяДата() + ОтветСтруктура.expires_in;

КонецЕсли;


КонецЕсли;

КонецПроцедуры


Функция ПараметрыОбновленияВСтроке()

Возврат "/?" + "grant_type=refresh_token" + "&" +
"client_id=" + client_id + "&" +
"client_secret=" + client_secret + "&" +
"refresh_token=" + RefreshToken;

КонецФункции

Что пока не удалось сделать. Пока не удалось передавать пользовательские поля. И при создании контакта ответственным ставится пользователь, под которым залогинились. А не тот, которого указываю в fields[ASSIGNED_BY_ID].

98 Comments

  1. script

    У меня к Вам огромная просьба. Покажите пожалуйста в какую сторону копать если нужно передавать из 1С реализации а в битрикс 24 загружать «Сделки»

    Reply ↓
  2. user662672_explorer2000

    Добрый день! Смотрите офф документацию, в частности по сделкам http://dev.1c-bitrix.ru/rest_help/crm/cdeals/index.php. Для создания сделки используйте метод crm.deal.add. Перечень передаваемых полей доступен там же. Такой сущности, как реализация нет в Битрикс24, возможно это счета? по ним вся информация здесь http://dev.1c-bitrix.ru/rest_help/crm/invoice/index.php. Там примеры к сожалению только на js, так что пробуйте и смотрите что возвращается в качестве ответа. Если ошибка, то будет описание ошибки.

    Reply ↓
  3. bulpi

    Люди, а вы не в курсе, что существует вот это :

    http://1c.1c-bitrix.ru/intranet/download.php

    Там готовые модули, в частности для УТ 11.1 есть.

    Выгружаются организации, контрагенты, контактные лица партнеров, реализации….

    Но плюс поставлю, т.к. метод реализован другой.

    Reply ↓
  4. user662672_explorer2000

    Тут неверно я указал привязку к УТ. Данный код можно использовать в любой конфигурации, даже под которую нет готовых модулей. Да и функционал можно реализовать какой угодно, т.к. доступен любой метод REST API

    Reply ↓
  5. script

    (3) И не только смотрели, но и внедрили. Только когда внедрили, то оказалось что это полная ерунда.

    Выгружает

    Из 1С контрагенты в Б24 в клиенты

    Из 1С конт. лица в Б24 в контакты

    Из 1С все (любые) документы в Б24 в Дела

    И все.

    А внутри просто шлак. Запросы к базе через две точки.

    Обращение к несуществующим полям в справочниках из-за которых все это сразу вываливается в ошибки.

    Пишешь на поддержку — тебе дают 1С-ника, который лезет в запросы. Начинает там начинает ограничивать поля неограниченной длины — при тебе.

    А сам модуль добавляет столько мусора, столько лишних объектов, что только из-за этого уже начинаешь жалеть что связался с ним.

    Reply ↓
  6. script

    И еще один вопрос.

    Это доступ через REST API работает и на облачной версии или только в коробке?

    Reply ↓
  7. user662672_explorer2000

    На облачной работает точно, проверялось на ней. С коробочной не проверял, ее просто нет.

    Reply ↓
  8. kuntashov

    (6) Все нововведения у Б24 сначала в облаке. В коробке REST API добавили совсем-совсем недавно.

    Reply ↓
  9. alprk

    Спасибо что поделились, как раз собирались городить свои костыли к Б24))

    Reply ↓
  10. alprk

    Удивило что вы сделали авторизацию по логину и паролю. Почему бы не получить токен единожды, регулярно его обновляя?

    Хотя конечно определенные плюсы в этом есть, особенно если вызовы нерегулярные. Я например даже не думал что оно даст авторизоваться по Basic, даже через curl проверил сейчас что оно работает, но вдруг перестанет (в документации ведь об этом ни слова).

    Reply ↓
  11. user662672_explorer2000

    (10) Я вроде бы так и хотел сделать) Первоначально по логину и пароль получаю AccessToken и RefreshToken. Далее если время жизни токена истекло, уже обновляю его.

    Reply ↓
  12. Alister

    (5) еще замечательная поддержка, которая долго ищет какой релиз какой редакции УТ 11 минимально нужен для работы с Б24, а потом не могут объяснить какой же модуль используется для интеграции с УТ — трекер или модуль обмена с сайтом и чем они отличаются.

    Reply ↓
  13. user755384

    Большое спасибо за статью! Очень помогла. Если знаете, подскажите, пожалуйста, в каком виде параметры (СтрПараметров) передавать в функцию для добавления товарных позиций к сделке. (crm.deal.producrows.set). Передаю

    СтрПараметров = «id=»+ИДСделки+

    «&rows[PRODUCT_ID]=»+ИдТовара+

    «&rows[PRICE]=»+»100″+

    «&rows[QUANTITY]=1»;

    Ошибки не выдает, но и товары не добавляет.

    Reply ↓
  14. user662672_explorer2000

    Вам нужно переделать передачу параметров вот так:

    СтрПараметров = «id=»+ИДСделки+

    «&rows[0][PRODUCT_ID]=»+ИдТовара1+

    «&rows[0][PRICE]=»+»100″+

    «&rows[0][QUANTITY]=1″+

    «&rows[1][PRODUCT_ID]=»+ИдТовара2+

    «&rows[1][PRICE]=»+»500″+

    «&rows[1][QUANTITY]=5»;

    Рез = ОтправитьRESTЗапрос(«crm.deal.productrows.set», СтрПараметров, «»);

    Reply ↓
  15. dimasts

    Если авторизоваться по токену а не по логину и паролю, получится [ASSIGNED_BY_ID] правильно передавать??? Кто нибудь пробовал?

    Просто это то, ради чего мы затеваем всю интеграцию 🙂

    Reply ↓
  16. user662672_explorer2000

    Первоначальная регистрация по логинупаролю. Вы получаете токен время жизни которого ограничено. По истечении этого времени Вы обновляете токен без использования логинапароля. Нужен старый токен, client_id и client_secret. Посмотрите процедуру ПроверитьТокен(). ASSIGNED_BY_ID присваивается автоматом. По идее его и в параметрах можно передавать, но у меня всегда ответственный тот, под кем я залогинился. Возможно нужны администраторские права. Точно не знаю.

    Reply ↓
  17. dimasts

    ASSIGNED_BY_ID сделал равным 2

    Контакт создался с ответственным с чужого портала!

    Чё так правда можно?!

    Reply ↓
  18. dimasts

    В названии надо использовать слово «Забираем», а не «Передаём», так как передать из Битрикс24 что либо в 1с ни фига не просто. Создать http-сервис и зарегистрировать обработчик события в Битрикс24 дело не хитрое. А вот как заставить эти события срабатывать и переходить по запросам, которые к ним привязаны? Причём этот запрос в браузере работает как часы. а тут ещё Заговор

    Reply ↓
  19. dimasts

    (18)Причина была в том что в 1с метод был установлен GET. Лучше сначала устанавливать Любой, чтобы проверить, а потом уже определяться с каким работать.

    Reply ↓
  20. user662672_explorer2000

    (18) Контакты все же мы передаем (экспортируем или назовите как хотите, сути не меняет) из 1С в Битрикс24. О чем Вы пишите не тема статьи. Хотите забирать информацию из Битрикс24? Делайте аналогично, забирайте контакты с фильтром по незаполненности ORIGIN_ID например. При записи контакта в 1С пишите его GUID в ORIGIN_ID

    Reply ↓
  21. bytecoded

    А с локализациями не пробовали работать? Пробую создавать валюты, одна не удается задать локализацию — если задавать через параметр LANG при вызове currrency.add, то ругается на пустое поле Format (которого в перечне полей локализации вообще нет). Если уже после создания валюты вызвать currency.localizations.set — ошибок нет, но и данные валюты, касающиеся локализаций, никак не изменяются.

    Reply ↓
  22. Milanick

    А с вебхуками работали?

    Reply ↓
  23. wiseowl

    Делала по вашему примеру. Мне нужно почти тоже самое, только токен необходимо получить для power BI и данные отправлять туда.

    Пишу get запрос (текст ниже), при использовании защищенного сертификата не происходит перенаправление по ссылке, которая указана в redirect_uri, если использовать http, то происходит постоянное перенаправление на тот же адрес, но уже с https соединением.

    При проверке в браузере, перенаправление происходит и все нормально. Как можно решить эту проблему?

    При перенаправлении на office.com я должна в строке получить параметр «code», который потом хочу использовать для получения токена приложения.

    В Set-Cookie есть такое поле как «buid» это одно и тоже? Если да, то в принципе я могу использовать его в качестве кода авторизации, но проблему с перенаправлением все равно надо как то решить, так как при получении токена с запросом тоже самое, редирект не происходит…

    Адрес=»login.microsoftonline.com»;
    АдресРесурса=»&response_mode=query&response_type=code&redire­­ct_uri=https%3A%2F%2Fwww.office.com%2F&nux=1&msafed=0″;
    client_id=»3bf6d724-6dae-4177-a437-cd1e20619bd8″;
    //Если НЕ (AccessToken = «» ИЛИ RefreshToken = «» ИЛИ RefreshTime = Дата(1, 1, 1)) Тогда
    //
    //        Возврат;
    //
    //    КонецЕсли;
    
    
    ssl = Новый ЗащищенноеСоединениеOpenSSL();
    //Новый СертификатКлиентаWindows(
    // СпособВыбораСертификатаWindows.Выбирать),
    //Новый СертификатыУдостоверяющихЦентровWindows());
    
    Соединение = Новый HTTPСоединение(
    Адрес, //»хххххх.bitrix24.ru»,
    , // порт
    , // пользователь
    , // пароль
    , // прокси
    , // таймаут в секундах
    ssl  // защищенное HTTPS соединение
    );
    
    
    //Заголовки = Новый Соответствие;
    
    Запрос = Новый HTTPЗапрос(«/common/OAuth2/Authorize?client_id=» + client_id + АдресРесурса);
    Ответ = Соединение.Получить(Запрос);
    
    Сообщить (Ответ.КодСостояния);
    АдресРесурса = Ответ.Заголовки.Получить(«Location»);
    Сообщить (АдресРесурса);

    Показать

    Reply ↓
  24. wiseowl

    (19) посмотрите, пожалуйста, мой вопрос ниже, может быть вы сможете мне помочь…

    Reply ↓
  25. MakarkinPRO

    А есть наоборот из Битрикс24 в 1С, чтобы Битрикс24 (компании контакты) была материнская система.

    Reply ↓
  26. Milanick

    А как в REST API обходится вывод больше 50 ?

    Например ,хочу получить список пользователей, а там больше 50 пользователей не выводит :(. А у меня их больше 200 🙁

    Reply ↓
  27. salex2002

    Почему-то по стандартной схеме не могу модифицировать сделку crm.deal.update

    Результат = ОтправитьRESTЗапросPOST(«crm.deal.update», «id=»+ИДКлиента+»&fields[TITLE]=»+Выборка.Представление,»»)
    
    

    возвращает Неопределено.

    Reply ↓
  28. user662672_explorer2000

    (25) Есть приложение, которое импортирует сделки в 1С. В периодическом задании запускается процедура, которая через функцию crm.deal.list получает ID сделок, у которых ORIGIN_ID не заполнено. По каждой сделке в 1С создается заказ, GUID заказа записывается в ORIGIN_ID лида. Точно так же по клиентам и контактам. Это по новым, а вот как отреагировать на изменение сделок вопрос. Нужно подписаться на событие, но URL не указать никакой, чисто средствами 1С не обойтись

    Reply ↓
  29. user662672_explorer2000

    (26) Из документации: Списочные методы возвращают данные страницами по 50 элементов (число может изменяться). Для получения следующей страницы данных к запросу нужно добавить параметр start со значением, пришедшем в параметре next ответа. Ссылка https://dev.1c-bitrix.ru/rest_help/rest_sum/index.php

    Reply ↓
  30. user662672_explorer2000

    (27) Сложно что-то сказать, возможна ошибка при получении токена. Зайдите

    отладчиком в ОтправитьRESTЗапросPOST

    Reply ↓
  31. salex2002

    (30)

    Да другие методы работают через ОтправитьRESTЗапросPOST, тот же crm.deal.add. Используется ваша обработка 685093. Может в самом портале что-то включить. Пока его в базовом бесплатном варианте использую для тестов.

    Reply ↓
  32. salex2002

    (31) Включил демо-режим «Компания» — заработал crm.deal.update

    Reply ↓
  33. MakarkinPRO

    (28) сделки или счета?

    Reply ↓
  34. user662672_explorer2000

    (33) Я немного наврал, клиент захотел лиды из Битрикс24 трансформировать в клиентские заказы в УТ. Т.е. ни сделки и ни счета. Давненько было..

    Reply ↓
  35. TSRh

    Здравствуйте всем!

    oauth/token/?grant_type=authorization_code

    &client_id=local.59f9cc5662a690.43624909

    &client_secret=PA5VfcmiEtE8rzkzJupvo0OX468IDPBvuZGTfYaFs3Oae­XMCOs

    &code=8za5opd5bvd6hoynktv351l4zuzn0du2

    КодСостояния: 400

    Тело: {«error»:»invalid_client1″}

    В чём может быть проблема ?

    Reply ↓
  36. isaev2016

    Справился ли кто с crm.activity.list и «COMMUNICATIONS» ? Не могу ни прочитать, ни установить правильно. Пока веду активную переписку с ТП Битрикс24

    Reply ↓
  37. TSRh

    Мой вопрос снимается, была ошибка в тексте

    Reply ↓
  38. user662672_explorer2000

    (38) Уважаемый, это по сути инструмент, а не законченный функционал. Синхронизация контактов одно из применений. Подставьте методы работы с лидами, сделками и т.д., оберните логикой и получите нужный функционал. Это не универсальное решение и для применения требует программирования.

    Reply ↓
  39. amd1986

    (39) да это все понятно. Пост был адресован не вам.

    Reply ↓
  40. user880839

    Немного припозднился к разговору. Заведение нового Клиента получилось сразу. Спасибо! А вот с чтением данных из Bitrixa проблема. Хочу получить Контакт по методу crm.contact.get, а вот как задать ID в параметрах ни как не догоню… Ругается на то, что параметр вообще не задан. «ID is not defined or invalid.»

    Reply ↓
  41. user880839

    Результат получил (нельзя пробелы указывать при задании параметров), но все значения в полях указаны отдельно по буквам. Сейчас посмотрю, что можно сделать.

    Reply ↓
  42. user880839

    Преодолеть последствия экранирования (замены русских букв) в ответе на запрос помогла функция

    Функция УТФвСтроку(ВхСтр)

    ВыхСтр=»»;

    поз=1;

    Пока поз<СтрДлина(ВхСтр) Цикл

    симв=Сред(ВхСтр,поз,1);

    Если симв=»» И Сред(ВхСтр,поз+1,1)=»u» Тогда

    поз=поз+2;

    Вес=4096;

    ВыхКод=0;

    Для п=0 По 3 Цикл

    кодСимв=КодСимвола(ВхСтр,поз+п);

    Если кодСимв>96 Тогда // a-f

    кодСимв=кодСимв-87;

    ИначеЕсли кодСимв>64 Тогда // A-F

    кодСимв=кодСимв-55;

    Иначе

    кодСимв=кодСимв-48; // 0-9

    КонецЕсли;

    ВыхКод=ВыхКод+кодСимв*Вес;

    Вес=Вес/16;

    КонецЦикла;

    ВыхСтр=ВыхСтр+Символ(ВыхКод);

    поз=поз+4;

    Иначе

    ВыхСтр=ВыхСтр+симв;

    поз=поз+1;

    КонецЕсли;

    КонецЦикла;

    Возврат ВыхСтр;

    КонецФункции

    Спасибо добрым людям.

    Но это я похоже сам с собой сегодня на форуме разговариваю…

    Reply ↓
  43. user662672_explorer2000

    Добрый день!

    ПрочитатьJSON не выполняет эту же конвертацию? Не было проблем с получением текста на кириллице

    Reply ↓
  44. ikekoval
    Reply ↓
  45. user662672_explorer2000

    Добрый день! телефон для контакта добавляюобновляю например так «….&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0]» class=» show-hide-props row «>

    46.


    user662672_explorer2000
    171
    26.12.17 08:11
    Сейчас в теме

    Добрый день! телефон для контакта добавляюобновляю например так «….&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0][VALUE]=+71111111111….», работает …

    =+71111111111….», работает …

    Reply ↓
  46. isaev2016

    Сегодня авторизация отвалилась, пока нашел что вместо 302 возвращает состояние 200..

    Reply ↓
  47. user662672_explorer2000

    (47) такое впечатление, что 26-го вечером что-то было, работающие закачки вываливались в неожиданных местах. Все восстановилось, даже не успел толком разобраться, с 27-го точно уже все работает

    Reply ↓
  48. baracuda

    Автору лайк. Можно в личку пару вопросиков. Сейчас курю интеграцию самописной конфы с битриксом…

    Reply ↓
  49. user662672_explorer2000

    Добрый день! Конечно пишите, постараюсь ответить

    Reply ↓
  50. pbabincev

    Добрый день.

    Спасибо за статью, думаю, что многим она пригодилась, в том числе и мне.

    Опишу как в итоге сделал я. Ключевое — то, что я использовал веб-хуки и для формирования тела запроса использовал штатную сериализацию JSON.

    Надеюсь, кому-нибудь пригодится.

    Например, для добавления поста в живую ленту мне же:

    
    Функция ТестПостВЖивуюЛенту() Экспорт
    
    ПараметрыЗапроса = Новый Структура;
    
    
    
    Метод = «log.blogpost.add»;
    
    SPERM_U = Новый Массив;
    SPERM_U.Добавить(«U254»); // это ID пользователя, которому дать доступ читать этот пост
    
    ПараметрыЗапроса.Вставить(«POST_MESSAGE»,  «Hello, World!»);
    ПараметрыЗапроса.Вставить(«POST_TITLE»,  «title — 3»);
    ПараметрыЗапроса.Вставить(«SPERM»,    Новый Структура(«U», SPERM_U));
    
    
    ПараметрыЗапроса = СериализоватьВJSON(ПараметрыЗапроса);
    
    Возврат ВыполнитьЗапрос(Метод, ПараметрыЗапроса);
    
    КонецФункции
    
    Функция ВыполнитьЗапрос(Метод, Знач ПараметрыЗапроса)
    
    АдресСервера = «mycompany.bitrix24.ru»;
    АдресРесурса = «/rest/254/xxxxxxxxxx/» + Метод + «.json»; // тут «254» — пользователь, от имени которого опубликован веб-хук; «xxxxxxxxxx» — сам веб-хук
    
    
    Попытка
    HTTPСоединение = Новый HTTPСоединение(АдресСервера, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL); // соединяемся по https
    Исключение
    Возврат ОписаниеОшибки();
    КонецПопытки;
    
    
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить(«Accept-Language», «ru»);
    Заголовки.Вставить(«Accept-Charset», «utf-8»);
    Заголовки.Вставить(«Content-Language», «ru»);
    Заголовки.Вставить(«Content-Charset», «utf-8»);
    Заголовки.Вставить(«Content-type», «application/json»); // тут обозначаем, что «общаемся» через JSON
    
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса);
    
    
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    
    ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
    
    
    Строка = ДесериализоватьИзJSON(ТелоОтвета);
    
    Возврат HTTPОтвет.КодСостояния;
    
    КонецФункции
    
    Функция СериализоватьВJSON(ПараметрыЗапроса)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , ));
    ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
    
    ПараметрыJSON = ЗаписьJSON.Закрыть();
    
    Возврат ПараметрыJSON;
    
    КонецФункции
    
    Функция ДесериализоватьИзJSON(СтрокаJSON)
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    Строка = ПрочитатьJSON(ЧтениеJSON);
    
    Возврат Строка;
    
    
    КонецФункции
    
    

    Показать

    Как мы видим, всё просто и логично 🙂

    Reply ↓
  51. amd1986

    (51) У вас все просто до того момента, пока не наткнетесь в ограничение в 2 запроса в секунду.

    Reply ↓
  52. pbabincev

    (52)

    Это ограничение продиктовано вэбхуком?

    Reply ↓
  53. amd1986

    (53) Нет, нагрузкой на Б24. Нужно передавать пакетами по 50 элементов.

    Reply ↓
  54. Milanick

    Ребята помогите пожалуйста с такой ерундой как Универсальные списки.

    Есть примеры работы с ними через rest api ?

    Reply ↓
  55. harmless

    Подскажите как сформировать тело POST запроса для передачи не одного, а массива контактов. Такое возможно?

    Reply ↓
  56. user662672_explorer2000

    (56) на мой взгляд такое нельзя, crm.contact.add хоть через GET, хоть через POST подразумевает передачу одного контакта

    Reply ↓
  57. amd1986

    (56)Можно через batch запрос. Пример посмотреть, как реализовано, можно в новом модуле синхронизации от Битрикса

    Reply ↓
  58. user662672_explorer2000

    (58) Верно, вот описание https://dev.1c-bitrix.ru/rest_help/general/batch.php

    Нужно попробовать

    Reply ↓
  59. kobal

    Всем привет.

    Озадачился вопросом слива Задач из Б24 в 1С для выстраивания очереди выполнения задач.

    Приоритетность будет строиться исходя из данных о клиентах в 1Ске (важность, срочность и тд)

    Прочитав ленту понимаю, что есть проблема слива обновленных задач (перенесли дату, ответственного и т.д.)

    Но на первом этапе стоит задача просто слить все задачи в 1Ску.

    Кто может поделиться кодом?

    Спасибо.

    Reply ↓
  60. amd1986

    (60) Используйте новый механизм регистрации изменений. Если для задач есть событий(при добавлении/обновлении задачи), тогда взлетит.

    Reply ↓
  61. pbabincev

    (61)

    Александр, можете уточнить — вы имеете в виду то, что в Б24 появился механизм регистрации изменений? Давно он там есть?

    Спасибо.

    Reply ↓
  62. amd1986

    (62)Примерно месяц — полтора. С выходом нового модуля синхронизации в режиме реального времени.

    Смысл логики такой:

    1) Цепляем офлайн события на нужные типы данных в Б24.

    2) Когда зацепленное событие выполняется, то записывается инфа о событии и ид элемента в спец таблицу.

    3) HTTP запросом С получаем данные из этой таблицы и обрабатываем.

    Также реализован спец метод push&pull сервера, который сразу сообщает, что появилось хоть одно новое офлайн событие(ну это для реал тайм).

    Это все в кратце. Частично дока уже есть тут: https://dev.1c-bitrix.ru/rest_help/general/events_method/index.php

    Но там мизер. По событиям(которые были реализованы почти для всех сущностей CRM) пока только в модуле синхронизации.

    Т.е. можно получить только изменения(например только новые и измененные компании/контакты), а не все данные. А возможность узнать об изменении сразу — дает возможность реализации реал тайм обмена.

    Reply ↓
  63. script
    Т.е. можно получить только изменения(например только новые и измененные компании/контакты), а не все данные. А возможность узнать об изменении сразу — дает возможность реализации реал тайм обмена.

    Ну так это уже совсем другое дело.

    Скажите пожалуйста, кто уже хорошо покопался, я так понял что некоторые манипуляции данными в Б24 из 1С можно сделать только в платных тарифах Б24.

    В частности интересует обмен Сделки-Заказы + статусы, Компании — Контрагенты, и товарами

    Reply ↓
  64. user662672_explorer2000

    (64) Все перечисленное будет работать и на бесплатном тарифе. Думаю, если есть доступ через интерфейс, то и через API будет работать. С ограничениями еще не сталкивался…

    Reply ↓
  65. pbabincev

    (63)

    Благодарю!

    Reply ↓
  66. kobal

    (61) Спасибо за подсказку.

    Я решил попробовать просто сливать задачи по реквизиту CHANGED_DATE — дата последнего изменения;

    Тут скачал пример по созданию задачи и сливу ее по ID.

    Но чтобы получит список по фильтру надо применять метод task.item.list

    В параметры нужно передавать 1= (ORDER) Массив для сортировки, 2= (FILTER) фильтр, 3= (PARAMS) Массив для опций вызова, 4= (SELECT) Массив полей записей. Дока тут https://dev.1c-bitrix.ru/rest_help/tasks/task/item/list.php

    и вот проблема никак не могу его заполнить параметрами.

    Что удалось нарыть.

    Пример кода.

    1) Запрос = Новый HTTPЗапрос(«rest/» + RESTЗапрос + «?auth=» + AccessToken + «&» + Параметры, Заголовки);

    Выдает 50 задач.

    2) если заполнить параметры

    СтрПараметров = fields[CREATED_DATE]=» + «asc»; //desc

    Выдает 50 первых или 50 последний с сортировкой по дате создания.

    Видимо я устанавливают параметр 1 ORDER,

    как установить параметр 2 FILTER (отборы) никак не могу разобраться.

    Кто знает подскажите!

    СПАСИБО!

    Reply ↓
  67. user662672_explorer2000

    (67) Если пользоваться процедурами из статьи, то например так

    Ответ = ОтправитьRESTЗапрос(«task.item.list», «order[]=&filter[RESPONSIBLE_ID]=46&filter[!REAL_STATUS]=5&params[]=&select[]=», «»);

    Запрос получает не выполненные задачи по ответственному с ИД=46

    Это работает, проверено

    Reply ↓
  68. user662672_explorer2000

    (68) какой-то глюк, почему-то вместо & и слитно params[] вставляет ¶ms[]

    Reply ↓
  69. kobal

    (68) Спасибо огромное! Заработало.

    Я лично убил на изучение и поиск проблему часа 3-4 🙂

    Как могу отблагодарить?

    Reply ↓
  70. amd1986

    (65)Регистрация изменений, в полном объеме, на бесплатном тарифе работать не будет.

    Reply ↓
  71. user662672_explorer2000

    Добрый день!

    кусочек кода как обновляю контакт с телефоном

    
    ?(СтруктураПараметров.Свойство(«Телефон»), «&fields[PHONE][0][ID]=» + ИДТелефона + «&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0]» class=»  show-hide-props row «>
    
    
    73. user662672_explorer2000 171 26.04.18 09:30 Сейчас в теме
    Добрый день!

    кусочек кода как обновляю контакт с телефоном

    
    ?(СтруктураПараметров.Свойство(«Телефон»), «&fields[PHONE][0][ID]=» + ИДТелефона + «&fields[PHONE][0][VALUE_TYPE]=WORK&fields[PHONE][0][VALUE]=» + СтруктураПараметров.Телефон
    
    

    ИДТелефона из массива PHONE когда получаю контакт по crm.contact.get

    Хотя коллеги уже это описали здесь https://dev.1c-bitrix.ru/rest_help/crm/contacts/crm_contact_get.php. Смотрите пользовательский комментарий.

    =» + СтруктураПараметров.Телефон

    ИДТелефона из массива PHONE когда получаю контакт по crm.contact.get

    Хотя коллеги уже это описали здесь https://dev.1c-bitrix.ru/rest_help/crm/contacts/crm_contact_get.php. Смотрите пользовательский комментарий.

    Reply ↓
  72. Mva_72

    (41)

    А подскажите, пожалуйста,как вы передали id?

    Reply ↓
  73. user662672_explorer2000

    (74) разве вот так ОтправитьRESTЗапрос(«crm.contact.get», «id=12345», «»); не работает?

    Reply ↓
  74. Mva_72

    (75) Работает. Спасибо!

    Reply ↓
  75. uinx

    Добрый вечер!

    Коллеги, подскажите что такое «AccessToken и RefreshToken» — как их получить?

    Reply ↓
  76. user662672_explorer2000

    AccessToken — некий ID который получается при подключении к Битрикс24, он должен в дальнейшем передаваться при каждом обращении к API. Время действия ограничено. Когда время действия AccessToken истекает, его необходимо получить заново. При помощи RefreshToken, который так же получается при регистрации. Как получить в статье есть пример кода и в обработке из вложения.

    Reply ↓
  77. novatrade

    Я бы строку

        ВызватьИсключение «Ошибка при получении access_token»;
    

    заменил бы на:

      ПодключитьсяКБитрикс();
    Возврат;
    

    в процедуре проверки токена. Столкнулся с этим.

    Reply ↓
  78. ПрестарелыйЗаяц

    А есть этот пример в виде обработки у кого-нибудь ?

    Reply ↓
  79. ПрестарелыйЗаяц

    Функция «ПолучитьПараметрыИзGetСтроки» из строки вида адрес?параметр1=значение1&параметр2=значение2 возвращает структуру, где ключ = параметр, а значение = значение

    Что это за функция и где она ???

    Reply ↓
  80. user662672_explorer2000

    Вот здесь есть законченная обработка. Это тоже моя статья, в ней есть все функции

    Reply ↓
  81. men260181

    Спасибо автору, вариант рабочий, но тормозной. Для больших объемов информации не годится к сожалению.

    Reply ↓
  82. user662672_explorer2000

    не подойдет, т.к. по одному передает. Нужно через batch, как-нибудь дойдут руки сделаю

    Reply ↓
  83. Milanick

    Блин, такой потенциал у инструмента , а пользоваться почти невозможно 🙁

    Reply ↓
  84. user1073447

    нужна интеграция 1с и битрикс — создание обычного счета и счета/оферты в битрикс, синхронизация с 1с, отладка автоматической интеграции номенклатуры и товаров между битрикс/1с интересуют сроки и стоимость, нахождение программиста в спб обязательно!

    автоматические инструменты не подойдут, есть особенности заполнения полей

    Reply ↓
  85. Vladislava-smile

    Добрый день. Как обстоят дела через batch? Пробую так:

    rest/batch.xml?auth=c671135c0031a352003001c600000001706203479f972da7baeb2d9­58790d4f5c68828&halt=0&cmd[task.item.add]=&fields[TITLE]=Проверка Битрикс&fields[DESCRIPTION]=Проверка обмена Битрикс&fields[DEADLINE]=18.12.2018 0:00:00&fields[START_DATE_PLAN]=17.12.2018 0:00:00&fields[RESPONSIBLE_ID]=1&fields[CREATED_BY]=1

    ошибка ( Может знаете в чем проблема?

    Reply ↓
  86. Vladislava-smile

    Проблема с выгрузкой задач из Б24.

    Запрос:

    «rest/task.item.list?auth=ТокенБ24&order[CHANGED_DATE]=asc&filter[CHANGED_DATE]>=2019-01-11T00:00:00+03:00». в ответ пустой массив, если убирать фильтр по дате изменения — сортирует и отображает. Подскажите, как работать с датой????

    Reply ↓
  87. user662672_explorer2000

    попробуйте вместо filter[CHANGED_DATE]>=2019-01-11T00:00:00+03:00 вот так filter[>=CHANGED_DATE]=2019-01-11T00:00:00+03:00

    Перед названием фильтруемого поля может указать тип фильтрации:

    «!» — не равно

    «<» — меньше

    «<=» — меньше либо равно

    «>» — больше

    «>=» — больше либо равно

    взял отсюда https://dev.1c-bitrix.ru/rest_help/tasks/task/item/list.php

    Reply ↓
  88. Vladislava-smile

    (89) Да я тоже читала документацию, это код для php, а я отправляю запрос через url, и не так там это пишется, как они дают в примерах ((.

    Reply ↓
  89. user662672_explorer2000

    больше или равно не проверял, но точно работает например так ….&filter[!REAL_STATUS]=5&….

    Reply ↓
  90. Vladislava-smile

    (91) Прав, трабл был в часовом поясе … СтрПараметров = «order[CHANGED_DATE]=asc» + «&filter[>CHANGED_DATE]=2019-01-10 16:53:00»; работает. Спасибо)

    Reply ↓
  91. user662672_explorer2000

    Пожалуйста

    Reply ↓
  92. kobayoshi

    Доброго времени дня.

    Огромное спасибо за статью, хоть стало понятно с какой стороны к этому битриксу подойти, а то поддержка у них ни бе, ни ме…

    Только вот никак не найду, где можно почитать, какие разновидности field’s и тому подобных переменных бывают? На https://dev.1c-bitrix.ru/rest_help/crm только сами методы описаны, и куцые примеры… Или я не нашёл?

    Reply ↓
  93. user662672_explorer2000

    Добрый день! Всю информацию брал отсюда https://dev.1c-bitrix.ru/rest_help/rest_sum/index.php

    Reply ↓
  94. kobayoshi

    (95) Я тоже, но зачастую нет описания того, что можно передать: «параметры_метода». Например, https://dev.1c-bitrix.ru/rest_help/crm/contacts/crm_contact_add.php, в этом методе есть fields, а вот какие поля можно передавать в этот массив, не сказано((

    Reply ↓
  95. user662672_explorer2000

    есть метод crm.contact.fields, он вернет описание полей. Хотя даже нет необходимости его вызывать — в описании метода все поля перечислены. Их и передавайте в crm.contact.add в массиве fields

    Reply ↓
  96. Flynxx

    Попробовал сделать по статье. не происходит редиректа на страницу с полем code вместо этого идет редирект на страницу авторизации. Хотя я передаю и логин и пароль. причем если из браузера сделать то нормально перебрасывает на страницу где можно взять поле code. Не подскажете куда копать?

    Reply ↓
  97. uno-c

    (81)

    &НаСервере
    Функция ПолучитьПараметрыИзGetСтроки(ГетСтрока)
    
    ТолькоПараметры = Сред(ГетСтрока, СтрНайти(ГетСтрока, «?») + 1);
    МассивПараметров = СтрРазделить(ТолькоПараметры, «&», Ложь);
    Результат = Новый Структура;
    Для каждого эл из МассивПараметров Цикл
    МассивКиЗ = СтрРазделить(эл, «=»); //должны получить массив из двух элементов
    Если МассивКиЗ.Количество() <> 2 Тогда
    ВызватьИсключение(«Неверная строка параметров:» + ТолькоПараметры);
    КонецЕсли;
    Результат.Вставить(МассивКиЗ[0],МассивКиЗ[1]);
    КонецЦикла;
    Возврат Результат;
    
    КонецФункции
    

    Показать

    Reply ↓
  98. Flynxx

    (105) мой вариант

    Функция ПолучитьПараметрыИзGetСтроки(СтрокаОтвета)
    КакаятоСтрока =  УТФвСтроку(СтрокаОтвета);
    Параметры = Новый Структура;
    //ПозицияСимвола =  СтрНайти(СтрокаОтвета,»?»);
    ПозицияСимвола =  Найти(СтрокаОтвета,»?»);
    СтрокаОтветаНовая = Прав(СтрокаОтвета,стрДлина(СтрокаОтвета)-ПозицияСимвола);
    
    //МассивПодстрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаОтветаНовая,»&»);
    МассивПодстрок = РазложитьСтрокуВМассивПодстрок(СтрокаОтветаНовая,»&»);
    Для Индекс = 0 По МассивПодстрок.Количество() — 1 Цикл
    ЗначениеПары = МассивПодстрок[Индекс];
    //ПозицияСимвола = СтрНайти(ЗначениеПары,»=»);
    ПозицияСимвола = Найти(ЗначениеПары,»=»);
    Параметр = Лев(ЗначениеПары,ПозицияСимвола-1);
    ЗначениеПараметра =Прав(ЗначениеПары,СтрДлина(ЗначениеПары)-ПозицияСимвола);
    Параметры.Вставить(Параметр,ЗначениеПараметра);
    
    КонецЦикла;
    
    Возврат Параметры;
    КонецФункции

    Показать

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *