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

11.05.18

Интеграция - Внешние источники данных

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

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

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

И так: регистрируем приложение в своем Битрикс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

 

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22457    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9217    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48712    96    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81574    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30005    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19132    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. script 128 11.05.18 22:32 Сейчас в теме
Спасибо огромное - продолжение будет?
2. user662672_explorer2000 225 14.05.18 08:23 Сейчас в теме
Добрый день! Продолжение о чем?
3. пользователь 15.05.18 11:56
Сообщение было скрыто модератором.
...
4. user662672_explorer2000 225 15.05.18 12:29 Сейчас в теме
Согласен, упустил этот момент, проверю. В текущем варианте скорей всего следующие 50 отработает при последующем запуске
5. пользователь 15.05.18 13:49
Сообщение было скрыто модератором.
...
16. novatrade 31.05.18 12:51 Сейчас в теме
(5)Это к Битриксу. Я думаю для регламентного обмена выше крыши.
19. amd1986 06.06.18 19:05 Сейчас в теме
30. berl 66 05.11.18 18:09 Сейчас в теме
(19) Для обхода ограничения в 50 записей используется параметр в запросе "&start=НачальнаяПозиция" где НачальнаяПозиция - номер первого элемента из партии в 50 шт.
При получении ответа в параметре .total находится общее количество элементов, и далее цикл
31. amd1986 08.11.18 17:00 Сейчас в теме
(30) я про другое имел в виду.
6. user662672_explorer2000 225 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 225 22.05.18 12:34 Сейчас в теме
Верно, это лишнее. Может только для того, чтобы показать, что и имя события возвращается.
9. novatrade 22.05.18 15:03 Сейчас в теме
интересно было бы, если выборку делать по нескольким событиям, связанных с сделками. А потом разбор. В фильтре поставить "ONCRMDEAL%"
10. user662672_explorer2000 225 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 225 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?
21. amd1986 06.06.18 19:18 Сейчас в теме
(14) Очень много. Но если есть process_id он повторно не выгрузится. Насколько я знаю, периодически эта табличка очищается. Т.е. записи старше месяца с непустым process_id удаляются
15. novatrade 28.05.18 12:14 Сейчас в теме
подскажите - как в запросе описать фильтр по нескольким условиям с условием "ИЛИ". захотели получать новые сделки и счета сразу. Делать отдельные запрос по каждому виду - два запроса. Хотелось бы объединить в один. Заранее спасибо
17. novatrade 02.06.18 22:18 Сейчас в теме
(15) сам и отвечу - в batch объединил в один запрос, а потом обработал
18. amd1986 06.06.18 19:02 Сейчас в теме
Смотрю во всю используют функционал изменений. Это радует.
Скоро появятся новые события: по пользовательским полям компаний/контактов/сделок/счетов/лидов.
Имейте в виду, что есть ограничение в 2 запроса в секунду(с буфером в 100 запросов), так что рекомендую использовать batch
20. amd1986 06.06.18 19:15 Сейчас в теме
И еще. Описана простая схема. Она не подходит, когда нужна повышенная отказоустойчивость. Например, если не удается обработать событие, то событие повторно не получите.

Если не удалось загрузить изменение(ошибка записи например), то можно пометить запись изменения как ошибочное. А потом повторно его получить по запросу event.offline.get с параметром &clear=0&error=1
22. user662672_explorer2000 225 07.06.18 13:52 Сейчас в теме
(20) Безусловно в статье искусственный пример, возможно можно читать события с clear=0 а затем после обработки каждого вычищать его через event.offline.clear
24. novatrade 08.06.18 14:30 Сейчас в теме
(22)сколько обращений будет к сайту?
25. user662672_explorer2000 225 08.06.18 15:02 Сейчас в теме
(24) Хм, давайте накопим все обработанные ИД сообщений, а затем разом их вычистим, event.offline.clear как раз принимает массив message_id. Я так не делал, просто рассуждения
26. novatrade 09.06.18 15:43 Сейчас в теме
(25)У каждого свой подход.
23. novatrade 08.06.18 00:01 Сейчас в теме
(20)я пишу в док, потом обрабатываю. Иначе никак. если стопорится, то при повторном обращении остаются необработанные события - они обрабатываются в первую очередь
27. goel 07.08.18 10:18 Сейчас в теме
Хотелось бы передавать себестоимость и выручку по Сделке (Заказу покупателя).

Если создать пользовательское поле в Сделке для каждой строчки товара, я так понимаю что делать надо через метод crm.deal.userfield.update?

Как указать значение до каждой строчки товара?
Как я понимаю параметры id данного метода подойдет для пользовательских полей в шапке документа, т.е. для статичных полей. А нам нужно, чтобы это действовало для табличной части товара (размер списка динамический). Как к нему обращаться при помощи данного метода?

Заранее спасибо, разработчики молчат 4ые сутки, проект стоит(
28. user662672_explorer2000 225 09.08.18 08:13 Сейчас в теме
В CRM - Настройки есть раздел Свойства товаров, думаю можно там добавить свойство Себестоимость. Выручка по идее должна быть в строчке сделки, но я там на первый взгляд не вижу возможности добавить поле.

Через crm.deal.userfield.update меняем пользовательское поле на сделке: название, тип, отображение и т.д. Не для изменения значения поля. Да и на мой взгляд это проще настраивать через интерфейс

Товары в сделке меняем через crm.deal.productrows.set - передаем сразу все строки товаров в сделке.

методы взял отсюда
29. user1073447 23.10.18 13:07 Сейчас в теме
Очень нужна интеграция 1с и битрикс - создание обычного счета и счета/оферты в битрикс, синхронизация с 1с, отладка автоматической интеграции номенклатуры и товаров между битрикс/1с интересуют сроки и стоимость, нахождение программиста в спб обязательно!
Оставьте свое сообщение