Как правильно составить строку batch запроса для группового обновления полей контактов в битрикс crm

1. rpashkovsky 23 31.10.20 18:08 Сейчас в теме
Добрый день! Вопрос по веб -хукам Битрикса. Подскажите, пожалуйста, как правильно собрать строку для batch запроса с методом crm.contact.update ? Метод crm.contact.add прекрасно добавляет новых пользователей пачкой. А вот с обновлением полей никак не могу разобраться. Битрикс облачная версия. 1с - версия платформы 8.3
Вознаграждение за ответ
Показать полностью
Найденные решения
8. uno-c 235 31.10.20 20:38 Сейчас в теме +1 $m
Можно и урл-энкодед. Тоже успешно
POST /rest/batch HTTP/1.1
Host: ***.bitrix24.ru
Content-Type: application/x-www-form-urlencoded

auth=***&cmd[1]=crm.contact.update?id=1%26fields[NAME]=TestThree&cmd[2]=crm.contact.update?id=3%26fields[NAME]=TestFour


%26 - это амперсанд после урл-кодирования.
Прикрепленные файлы:
23. rpashkovsky 23 31.10.20 21:52 Сейчас в теме
(20)Я победил его :)
/rest/8499/xhxgcmqayuvny0d11/batch?cmd[1]=crm.contact.update%3Fid%3D8225%26fields%5BNAME%5D%3DGoma%20Oleg

Виной была невнимательность) Так вот работает.
Спасибо большое милый человек:) Навели на правильные мысли
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. namazi74 4 31.10.20 19:21 Сейчас в теме
(1)
Подскажите, пожалуйста, как правильно собрать строку для batch запроса с методом crm.contact.update

смотрели?
https://dev.1c-bitrix.ru/rest_help/crm/cases/edit/how_to_change_email_or_phone.php
5. rpashkovsky 23 31.10.20 19:56 Сейчас в теме
(2)все смотрел. Проблем с простыми хуками нет. Проблем с другими методами по типу add, list, get тоже нет. Собрать батч именно с апдейтом не выходит. При отправке запроса код ответа 200, а в карточках клиентов тишина...
3. uno-c 235 31.10.20 19:47 Сейчас в теме
Под рукой есть работающий batch. Правда не вебхуки а обычный REST и метод другой. Но работает - проверил только что. Думаю, у Вас по аналогии.

POST /rest/batch HTTP/1.1
Host: ***.bitrix24.ru
Content-Type: application/json

{
    "auth": "***",
    "cmd": {
        "cmd1": "crm.invoice.get?id=1",
        "cmd2": "crm.invoice.get?id=3"
    }
}
Показать


auth - в вебхуках не нужен, т.е. только cmd
6. rpashkovsky 23 31.10.20 19:57 Сейчас в теме
(3) get отправить у меня получается, с апдейтом проблемы
4. uno-c 235 31.10.20 19:51 Сейчас в теме
Т.е. в Б24 можно json-ами пуляться, так удобнее на мой взгляд. Главное заголовок поставьте Content-Type: application/json, установите тело из JSON-строки, а в cmd1, cmd2 (максимум 50) - передавайте те команды, которые у Вас нормально по одной отрабатываются.
7. uno-c 235 31.10.20 20:20 Сейчас в теме
Вот только что апдейт проверил, опять же не хуки, а обычный рест. Работает.
POST /rest/batch HTTP/1.1
Host: ***.bitrix24.ru
Content-Type: application/json

{
    "auth": "***",
    "cmd": {
        "cmd1": "crm.contact.update?id=1&fields[NAME]=TestCmdNameOne",
        "cmd2": "crm.contact.update?id=3&fields[NAME]=TestCmdNameTwo"
    }
}
Показать
Прикрепленные файлы:
8. uno-c 235 31.10.20 20:38 Сейчас в теме +1 $m
Можно и урл-энкодед. Тоже успешно
POST /rest/batch HTTP/1.1
Host: ***.bitrix24.ru
Content-Type: application/x-www-form-urlencoded

auth=***&cmd[1]=crm.contact.update?id=1%26fields[NAME]=TestThree&cmd[2]=crm.contact.update?id=3%26fields[NAME]=TestFour


%26 - это амперсанд после урл-кодирования.
Прикрепленные файлы:
9. rpashkovsky 23 31.10.20 20:46 Сейчас в теме
(8)спасибо, завтра попробую, вроде все так же делал, видимо что-то упустил
10. rpashkovsky 23 31.10.20 20:48 Сейчас в теме
(8)получается вы кодируете только эту часть %26fields[NAME]=TestFour ?
11. uno-c 235 31.10.20 21:00 Сейчас в теме
(10)Амперсанды нужны незакодированные как разделители полей формы
cmd[1]=***&cmd[2]=***
А саму команду если не урл-кодировать, то амперсанд внутри команды спонталыку собъет разборщика тела.
12. uno-c 235 31.10.20 21:03 Сейчас в теме
(10)Вообще я Postman-ом отправлял предыдущие примеры ) Он сам все сделал как надо. Дальше - в 1С это воспроизводится. Если воспроизводить не получается - можно Fiddler-ом проснифить - сравнить отправляемые данные из Postman-а и из 1С.
13. rpashkovsky 23 31.10.20 21:12 Сейчас в теме
(12) PostMan пока что не осилил. В этой теме пока что новичок. Использую консоль http запросов в 1с-ке
Смотрите, метод авторизации использую basic (логин,пароль)
Строчку запроса пробовал собирать так:
1)rest/8499/tonaxz4ernhf3uy1m/batch?cmd[1]=crm.contact.update?id=8225%26fields%5BNAME%5D%3DGoma%20Oleg

После Вашего совета Так:
2)rest/8499/tonaxz4ernhf3uy1m/batch?cmd[1]=crm.contact.update?id=8225%26fields[NAME]=Goma Oleg
Результат один и тот же , изменений нет.
Ответ получаю: http://joxi.ru/E2pjj0BtGXg78r
При чем собранный по аналогии с вариантом запрос add отрабатывает "на ура"
rest/8499/tonaxz4ernhf3uy1m/batch?halt=1&cmd[tt]=crm.contact.add%3Ffields%5BNAME%5D%3Dsvitlana%20svetlanovna%26fields%5BSECOND_NAME%5D%3DBla%26fields%5BLast_NAME%5D%3Dfamiliy%26fields%5BTYPE_ID%5D%3DCLIENT%0A&cmd[tt2]=crm.contact.add%3Ffields%5BNAME%5D%3Dsvitlana2%20svetlanovna2%26fields%5BSECOND_NAME%5D%3DBla2%26fields%5BLast_NAME%5D%3Dfamiliy%26fields%5BTYPE_ID%5D%3DCLIENT%0A
25. uno-c 235 31.10.20 22:27 Сейчас в теме
(13)
Смотрите, метод авторизации использую basic (логин,пароль)

Кстати, вебхукам авторизация не нужна. Поэтому если утек адрес вебхука - нужно его менять. Тут обычный REST с OAuth тоже побезопасней будет.
14. uno-c 235 31.10.20 21:14 Сейчас в теме
А что у Вас Goma Oleg некодированный?
15. rpashkovsky 23 31.10.20 21:17 Сейчас в теме
(14)&сmd[vla]=crm.contact.update?id=8225%26fields%5BNAME%5D%3DOLEG%26fields%5BLAST_NAME%5D%3DGOMA%26fields%5BSECOND_NAME%5D%3DPetrovich

Опять нет изменений(
Уже просто вариантов перепробовал сотню
16. uno-c 235 31.10.20 21:25 Сейчас в теме
Вот из фидлера успешное тело
POST https://*.bitrix24.ru/rest/batch HTTP/1.1
User-Agent: PostmanRuntime/7.26.5
Accept: */*
Cache-Control: no-cache
Postman-Token: *
Host: ***.bitrix24.ru
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 225
Cookie: BITRIX_SM_SALE_UID=3

auth=***&cmd%5B1%5D=crm.contact.update%3Fid%3D1%26fields%5BNAME%5D%3DGoma%20Oleg&cmd%5B2%5D=­crm.contact.update%3Fid%3D3%26fields%5BNAME%5D%3DGoma%20Oleg%20Two
Показать
17. rpashkovsky 23 31.10.20 21:29 Сейчас в теме
(16)Спасибо, может попробую еще с фиддлером разобраться. В любом случае сильно помогли
18. uno-c 235 31.10.20 21:30 Сейчас в теме
Уже даже любопытно стало. Попробую эти вебхуки, хотя на REST поболе возможностей, даже не заморачивался с хуками )
19. rpashkovsky 23 31.10.20 21:33 Сейчас в теме
(18)Можете, еще пожалуйста, подсказать, что приходит в ответе запроса?
21. uno-c 235 31.10.20 21:36 Сейчас в теме
(19)Если только тело интересует, то вот:
{"result":{"result":{"1":true,"2":true},"result_error":[],"result_total":[],"result_next":[],"result_time":{"1":{"start":1604168630.4675851,"finish":1604168630.5056801,"duration":0.038094997406005859,"processing":0.038038969039916992,"date_start":"2020-10-31T21:23:50+03:00","date_finish":"2020-10-31T21:23:50+03:00"},"2":{"start":1604168630.505722,"finish":1604168630.5278909,"duration":0.022168874740600586,"processing":0.022111892700195312,"date_start":"2020-10-31T21:23:50+03:00","date_finish":"2020-10-31T21:23:50+03:00"}}},"time":{"start":1604168630.442117,"finish":1604168630.5279059,"duration":0.085788965225219727,"processing":0.060374975204467773,"date_start":"2020-10-31T21:23:50+03:00","date_finish":"2020-10-31T21:23:50+03:00"}}
22. rpashkovsky 23 31.10.20 21:39 Сейчас в теме
(21)У меня то же... хм... может действительно придется поменять концепцию..
чего-то через хук он не взлетает(
"result":{"result":{"1":true},"result_error":[],"result_total":[],"result_next":[],"result_time":{"1":{"start":1604169436.8878019,"finish":1604169437.0090699,"duration":0.12126803398132324,"processing":0.12121009826660156,"date_start":"2020-10-31T21:37:16+03:00","date_finish":"2020-10-31T21:37:17+03:00"}}},"time":{"start":1604169436.8589461,"finish":1604169437.0090871,"duration":0.15014100074768066,"processing":0.12133884429931641,"date_start":"2020-10-31T21:37:16+03:00","date_finish":"2020-10-31T21:37:17+03:00"}}
20. uno-c 235 31.10.20 21:35 Сейчас в теме
Инфостарт от себя добавляет в мой копипаст ) <wbr> не было в оригинале (16)
cmd%5B2%5D=<wbr>­crm.contact.update
23. rpashkovsky 23 31.10.20 21:52 Сейчас в теме
(20)Я победил его :)
/rest/8499/xhxgcmqayuvny0d11/batch?cmd[1]=crm.contact.update%3Fid%3D8225%26fields%5BNAME%5D%3DGoma%20Oleg

Виной была невнимательность) Так вот работает.
Спасибо большое милый человек:) Навели на правильные мысли
24. uno-c 235 31.10.20 22:02 Сейчас в теме
(23)Отлично. У меня тоже вебхук пашет.
POST https://*.bitrix24.ru/rest/1/***/batch.json HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.26.5
Accept: */*
Cache-Control: no-cache
Postman-Token: *
Host: *.bitrix24.ru
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 141

{"cmd":{
    "cmd1": "crm.contact.update?id=1&fields[NAME]=HookOneTest",
    "cmd2": "crm.contact.update?id=3&fields[NAME]=HookTwoTest"
}}
Показать

Но обычный REST поудобней на мой взгляд
Прикрепленные файлы:
26. uno-c 235 31.10.20 22:35 Сейчас в теме
(23)и даже в вебхуках POST с Content-Type:application/json рулит - можно не заморачиваться, что URLкодировать, что не кодировать. Просто ХТТПЗапрос.УстановитьТелоИзСтроки(СтрокаЖсон) - и все. И само тело наглядное такое выходит )
rpashkovsky; +1 Ответить
27. rpashkovsky 23 31.10.20 22:37 Сейчас в теме
(26)Наверное перейду на такой вариант, с http запросами связывался раньше "по скольку по стольку", а сейчас придется плотно заниматься
28. uno-c 235 31.10.20 22:49 Сейчас в теме
(27)
СтруктураДляЖсон = Новый Структура;
СтруктураДляЖсон.Вставить("cmd", Новый структура("cmd1,cmd2","crm.contact.update?id=1&fields[NAME]=HookOneTest","crm.contact.update?id=3&fields[NAME]=HookTwoTest"));
ЗаписьЖсон = Новый ЗаписьJSON;
ЗаписьЖсон.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,"   "));
ЗаписатьJSON(ЗаписьЖсон, СтруктураДляЖсон);
СтрокаЖсон = ЗаписьЖсон.Закрыть();
Сообщить(СтрокаЖсон);


{
"cmd": {
"cmd1": "crm.contact.update?id=1&fields[NAME]=HookOneTest",
"cmd2": "crm.contact.update?id=3&fields[NAME]=HookTwoTest"
}
}
rpashkovsky; +1 Ответить
29. uno-c 235 31.10.20 23:02 Сейчас в теме
(27)И даже команду не надо урл-кодировать в жсоне, пробелы в т.ч. хавает.
{"cmd":{
    "cmd1": "crm.contact.update?id=1&fields[NAME]=Hook One Test&fields[LAST_NAME]=Русская фамилия",
    "cmd2": "crm.contact.update?id=3&fields[NAME]=Hook Two Test&fields[LAST_NAME]=Берег Слоновой Кости"
}}


Это из фидлера уже тело, т.е. прямо то, что ушло. Постмэн некоторое урл-кодирование не показывает, сразу не поймешь что он закодировал.
Прикрепленные файлы:
30. rpashkovsky 23 02.11.20 11:46 Сейчас в теме
(29) Можете, пожалуйста, еще подсказать, что ж я тут то не так делаю?
С постменом все ок, более-менее разобрался, оттуда всё меняется.

А вот в 1с почему-то получив тело из строки json контакт остаётся без изменений.

Сервис = "/rest/8499/xhxhgdqhyuvny8d5/batch?";

СтруктураДляЖсон = Новый Структура;
СтруктураДляЖсон.Вставить("cmd", Новый структура("cmd1","crm.contact.update?id=8225&fields[NAME]=Гома Олег"));
ЗаписьЖсон = Новый ЗаписьJSON;
ЗаписьЖсон.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,"   "));
ЗаписатьJSON(ЗаписьЖсон, СтруктураДляЖсон);
СтрокаЖсон = ЗаписьЖсон.Закрыть();

Ssl = Новый ЗащищенноеСоединениеOpenSSL();
Прокси = Новый ИнтернетПрокси(Ложь);
СоединениеHTTP = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, Прокси,,Ssl);

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


ЗапросHTTP = Новый HTTPЗапрос(Сервис, Заголовки);

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

Результат = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);

Если Результат.КодСостояния <> 200 Тогда
   //Ошибка выполнения запроса
КонецЕсли;

Данные = Результат.ПолучитьТелоКакСтроку();
Показать


{"result":{"result":[],"result_error":[],"result_total":[],"result_next":[],"result_time":[]},"time":{"start":1604278364.3289161,"finish":1604278364.353565,"duration":0.024648904800415039,"processing":1.4066696166992188e-5,"date_start":"2020-11-02T03:52:44+03:00","date_finish":"2020-11-02T03:52:44+03:00"}}
31. uno-c 235 02.11.20 12:37 Сейчас в теме
(30)
Сервис = "/rest/8499/xhxhgdqhyuvny8d5/batch?";
Возможно, вопрос в "/batch?" лишний. В fiddler4 - можно взять тела запросов из Постмэна и из 1С - и сравнить - посимвольно или побайтно.
32. uno-c 235 02.11.20 12:40 Сейчас в теме
(30) Заголовок еще не установлен в коде 1С (Content-Type: application/json).
33. rpashkovsky 23 02.11.20 12:56 Сейчас в теме
(32)выставил, к сожалению, блин, не работает(
34. uno-c 235 02.11.20 13:05 Сейчас в теме
(33)Возможно, ему тело нужно без BOM. Но проще не гадать - а в фидлере перехватить и сравнить. Раз есть точно работающий запрос постмэна - то можно добиваться как его в 1С воспроизвести.
rpashkovsky; +1 Ответить
35. rpashkovsky 23 02.11.20 13:29 Сейчас в теме
(34)Бинго! ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапроса,"CESU-8"); Так всё работает! И снова огромнейшее спасибо!
36. rpashkovsky 23 02.11.20 13:32 Сейчас в теме
(34)Ну, или так ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапроса,"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
37. uno-c 235 02.11.20 15:07 Сейчас в теме
(36)Да, лучше так. CESU все-таки не то же самое, что UTF8 без BOM.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот