Передаем контакты из 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 не будет опубликован. Обязательные поля помечены *