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

Опубликовал Андрей Андреев (user662672_explorer2000) в раздел Обмен - Обмен с другими системами

Хочу поделиться опытом использования Битрикс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].

См. также

Комментарии
1. script Мальчинко (script) 191 09.01.17 20:07 Сейчас в теме
У меня к Вам огромная просьба. Покажите пожалуйста в какую сторону копать если нужно передавать из 1С реализации а в битрикс 24 загружать "Сделки"
2. Андрей Андреев (user662672_explorer2000) 31 10.01.17 08:38 Сейчас в теме
Добрый день! Смотрите офф документацию, в частности по сделкам 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, так что пробуйте и смотрите что возвращается в качестве ответа. Если ошибка, то будет описание ошибки.
3. bulpi bulpi (bulpi) 107 10.01.17 14:03 Сейчас в теме
Люди, а вы не в курсе, что существует вот это :
http://1c.1c-bitrix.ru/intranet/download.php
Там готовые модули, в частности для УТ 11.1 есть.
Выгружаются организации, контрагенты, контактные лица партнеров, реализации....
Но плюс поставлю, т.к. метод реализован другой.
4. Андрей Андреев (user662672_explorer2000) 31 10.01.17 14:39 Сейчас в теме
Тут неверно я указал привязку к УТ. Данный код можно использовать в любой конфигурации, даже под которую нет готовых модулей. Да и функционал можно реализовать какой угодно, т.к. доступен любой метод REST API
5. script Мальчинко (script) 191 10.01.17 18:52 Сейчас в теме
(3) И не только смотрели, но и внедрили. Только когда внедрили, то оказалось что это полная ерунда.
Выгружает
Из 1С контрагенты в Б24 в клиенты
Из 1С конт. лица в Б24 в контакты
Из 1С все (любые) документы в Б24 в Дела
И все.

А внутри просто шлак. Запросы к базе через две точки.
Обращение к несуществующим полям в справочниках из-за которых все это сразу вываливается в ошибки.
Пишешь на поддержку - тебе дают 1С-ника, который лезет в запросы. Начинает там начинает ограничивать поля неограниченной длины - при тебе.
А сам модуль добавляет столько мусора, столько лишних объектов, что только из-за этого уже начинаешь жалеть что связался с ним.
Aquashop; Starec_I; +2 Ответить 1
6. script Мальчинко (script) 191 11.01.17 03:28 Сейчас в теме
И еще один вопрос.
Это доступ через REST API работает и на облачной версии или только в коробке?
7. Андрей Андреев (user662672_explorer2000) 31 11.01.17 06:32 Сейчас в теме
На облачной работает точно, проверялось на ней. С коробочной не проверял, ее просто нет.
8. Александр Кунташов (kuntashov) 349 12.01.17 17:25 Сейчас в теме
(6) Все нововведения у Б24 сначала в облаке. В коробке REST API добавили совсем-совсем недавно.
9. Александр Прокопенко (alprk) 13.01.17 10:15 Сейчас в теме
Спасибо что поделились, как раз собирались городить свои костыли к Б24))
10. Александр Прокопенко (alprk) 13.01.17 10:36 Сейчас в теме
Удивило что вы сделали авторизацию по логину и паролю. Почему бы не получить токен единожды, регулярно его обновляя?
Хотя конечно определенные плюсы в этом есть, особенно если вызовы нерегулярные. Я например даже не думал что оно даст авторизоваться по Basic, даже через curl проверил сейчас что оно работает, но вдруг перестанет (в документации ведь об этом ни слова).
11. Андрей Андреев (user662672_explorer2000) 31 13.01.17 12:20 Сейчас в теме
(10) Я вроде бы так и хотел сделать) Первоначально по логину и пароль получаю AccessToken и RefreshToken. Далее если время жизни токена истекло, уже обновляю его.
12. Alister (Alister) 9 24.04.17 20:01 Сейчас в теме
(5) еще замечательная поддержка, которая долго ищет какой релиз какой редакции УТ 11 минимально нужен для работы с Б24, а потом не могут объяснить какой же модуль используется для интеграции с УТ - трекер или модуль обмена с сайтом и чем они отличаются.