Битрикс24. Работаем с оффлайн событиями

Обмен - Обмен с другими системами

Появление оффлайн событий упростило синхронизацию Битрикс24 -> 1С. Теперь, например, можно загрузить только измененные между сеансами обмена сделки. А не тащить все незавершенные. В статье описание, как это можно сделать.

И так: регистрируем приложение в своем Битрикс24. Как это сделал описал в //infostart.ru/public/574117/. Помимо прав на CRM дайте еще права на пользователей. В примере по ИД пользователя вытаскивается ФИО. А без прав будет ошибка.

 

Запустим обработку и внесем все регистрационные данные

Сохраните чтобы потом не вводить заново.

Первое, что можно попробовать, это получить список доступных событий. Жмите Получить список событий. Получим что-то вроде этого.

В примере используется событие ONCRMDEALUPDATE. 

Для того, чтобы события начали регистрироваться жмем Начать регистрацию событий.

Теперь перейдем в наш Битрикс24 и изменим уже заранее добавленные сделки. Например изменим статус.

 

Вернемся в обработку и прочитаем события

 

Можно завершить регистрацию и убедится, что после этого события не регистрируются, обработка ничего не вернет.

 

Теперь код. Процедуры ОтправитьRESTЗапрос  и другие используются из модуля описанного в предыдущей статье.

 

Получить список событий

Процедура ПолучитьСписокСобытий() Экспорт
	
	СписокСобытий = "";
	
	Ответ = ОтправитьRESTЗапрос("events", "");
	М = Неопределено;
	Если Ответ.Свойство("result", М) Тогда
		
		Для Каждого С Из М Цикл
			
			СписокСобытий = СписокСобытий + С + Символы.ПС;
			
		КонецЦикла;
		
	КонецЕсли;	
	Сообщить(СписокСобытий);

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

Начать регистрацию событий

Процедура НачатьРегистрациюИзменений() Экспорт
	
	Ответ = ОтправитьRESTЗапрос("event.bind", "event=ONCRMDEALUPDATE&event_type=offline");
	Если Ответ.Свойство("result") Тогда
		Сообщить("Ок");
	Иначе
		Сообщить("Ошибка!");
	КонецЕсли;


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

 

Обработка изменений сделок

Процедура ПрочитатьСобытия() Экспорт
	
	Ответ = ОтправитьRESTЗапрос("event.offline.get", "filter[EVENT_NAME]=ONCRMDEALUPDATE");
	Р = Неопределено;
	Если Ответ.Свойство("result", Р) Тогда
		
		Для Каждого С Из Р.Events Цикл
			
			Если С.EVENT_NAME = "ONCRMDEALUPDATE" Тогда
				
				// вытащу сделку
				
				Сделка = ОтправитьRESTЗапрос("crm.deal.get", "id=" + С.EVENT_DATA.FIELDS.ID);
				ИмяСделки = "";
				Если Сделка.Свойство("result") Тогда
					ИмяСделки = Сделка.result.TITLE;
				КонецЕсли;
				
				// кто менял
				Пользователь = ОтправитьRESTЗапрос("user.get", "filter[id]=" + С.EVENT_ADDITIONAL.user_id);
				ИмяПользователя = "";
				Если Пользователь.Свойство("result") Тогда
					ИмяПользователя = Пользователь.result[0].LAST_NAME + " " + Пользователь.result[0].NAME;
				КонецЕсли;
				
				
				Сообщить("В " + С.TIMESTAMP_X + " сделку " + ИмяСделки + " изменил пользователь " + ИмяПользователя);
			КонецЕсли;
			
			
		КонецЦикла;
		
	КонецЕсли;		

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

 

Вся документация по REST API Битрикс24 здесь

Обработка тестировалась на платформе 8.3.10.2580

 

Скачать файлы

Наименование Файл Версия Размер
Битрикс24. Работаем с оффлайн событиями. Пример обработки.
.epf 11,25Kb
11.05.18
1
.epf 11,25Kb 1 Скачать

См. также

Комментарии
1. script Мальчинко (script) 189 11.05.18 22:32 Сейчас в теме
Спасибо огромное - продолжение будет?
2. Андрей Андреев (user662672_explorer2000) 105 14.05.18 08:23 Сейчас в теме
Добрый день! Продолжение о чем?
3. Евгений Янеев (yaneev) 39 15.05.18 11:56 Сейчас в теме
если событий больше 50 - отработает корректно?
4. Андрей Андреев (user662672_explorer2000) 105 15.05.18 12:29 Сейчас в теме
Согласен, упустил этот момент, проверю. В текущем варианте скорей всего следующие 50 отработает при последующем запуске
5. Евгений Янеев (yaneev) 39 15.05.18 13:49 Сейчас в теме
когда ждать обновление с отработкой более 50 записей?
6. Андрей Андреев (user662672_explorer2000) 105 18.05.18 14:17 Сейчас в теме
Добрый день!

Метод crm.deal.get не списочный, к тому же доп. параметр clear у меня не передается и по умолчанию он равен 1. Т.е. после прочтения событий они удаляются. Для обработки всех событий (если их больше 50) можно доработать например следующим образом

Процедура ПрочитатьСобытия() Экспорт
	
	
	Пока Истина Цикл
	
		Ответ = ОтправитьRESTЗапрос("event.offline.get", "filter[EVENT_NAME]=ONCRMDEALUPDATE");
		
		Р = Неопределено;
		Если Ответ.Свойство("result", Р) Тогда
			
			Если Р.Events.Количество() = 0 Тогда
				Возврат;
			КонецЕсли;
			
			Для Каждого С Из Р.Events Цикл
				
				Если С.EVENT_NAME = "ONCRMDEALUPDATE" Тогда
					
					// вытащу сделку
					
					Сделка = ОтправитьRESTЗапрос("crm.deal.get", "id=" + С.EVENT_DATA.FIELDS.ID);
					ИмяСделки = "";
					Если Сделка.Свойство("result") Тогда
						ИмяСделки = Сделка.result.TITLE;
					КонецЕсли;
					
					// кто менял
					Пользователь = ОтправитьRESTЗапрос("user.get", "filter[id]=" + С.EVENT_ADDITIONAL.user_id);
					ИмяПользователя = "";
					Если Пользователь.Свойство("result") Тогда
						ИмяПользователя = Пользователь.result[0].LAST_NAME + " " + Пользователь.result[0].NAME;
					КонецЕсли;
					
					
					Сообщить("В " + С.TIMESTAMP_X + " сделку " + ИмяСделки + " изменил пользователь " + ИмяПользователя);
				КонецЕсли;
				
				
			КонецЦикла;
			
		КонецЕсли;		
	
	КонецЦикла;

	
КонецПроцедуры
Показать
7. Геннадий Ходячих (novatrade) 22.05.18 11:42 Сейчас в теме
А зачем проверка типа:
Если С.EVENT_NAME = "ONCRMDEALUPDATE" Тогда

Ведь Вы уже сделали выборку по данному событию?
8. Андрей Андреев (user662672_explorer2000) 105 22.05.18 12:34 Сейчас в теме
Верно, это лишнее. Может только для того, чтобы показать, что и имя события возвращается.
9. Геннадий Ходячих (novatrade) 22.05.18 15:03 Сейчас в теме
интересно было бы, если выборку делать по нескольким событиям, связанных с сделками. А потом разбор. В фильтре поставить "ONCRMDEAL%"
10. Андрей Андреев (user662672_explorer2000) 105 23.05.18 08:42 Сейчас в теме
(9) Проверил, все работает.

1. Регистрируем интерес к нескольким событиям

	Ответ = ОтправитьRESTЗапрос("event.unbind", "event=ONCRMDEALUPDATE&event_type=offline");
	
	Ответ = ОтправитьRESTЗапрос("event.unbind", "event=ONCRMDEALADD&event_type=offline");
	
	Ответ = ОтправитьRESTЗапрос("event.unbind", "event=ONCRMLEADADD&event_type=offline");


2. А забирать буду только события по сделкам

	Ответ = ОтправитьRESTЗапрос("event.offline.get", "filter[EVENT_NAME]=ONCRMDEAL%");


Приходят события и на изменение сделок и на добавление

По лидам события можно прочитать например так

	Ответ = ОтправитьRESTЗапрос("event.offline.get", "filter[EVENT_NAME]=ONCRM%");
11. Геннадий Ходячих (novatrade) 23.05.18 13:11 Сейчас в теме
Я работаю со счетами.
но что интересно - на каждое изменение счета приходят два ответа: Статус и Действие. И только на изменение статуса счета - только Статус.

Ответ = ОтправитьRESTЗапрос("event.offline.get", "filter[EVENT_NAME]=ONCRM%");

получите список всех событий для CRM - которые включены и произошли.
12. Андрей Андреев (user662672_explorer2000) 105 23.05.18 14:45 Сейчас в теме
(11) получите список всех событий для CRM - которые включены и произошли. - про лиды в контексте подписки только на 3 события. Если же думаю подписаться на все события CRM то да, будет так.

Про счета интересно, но наверное есть какой-то смысл в этом?
13. Геннадий Ходячих (novatrade) 23.05.18 14:59 Сейчас в теме
подписки только на 3 события. Если же думаю подписаться на все события CRM то да, будет так.
Ну это, чтоб потом не забыть, на что подписался))
задача моя выросла из стандартного обмена. Там получали счета. Потом уткнулись - то нельзя, это нельзя, то не нравится... Пришлось в REST ползти)))
14. Геннадий Ходячих (novatrade) 24.05.18 10:01 Сейчас в теме
А кто может сказать - какое количество оффлайн событий хранится? чтобы не потерялись?500? 1000?
Оставьте свое сообщение