![]() |
![]() |
|
Двойное срабатывание HTTPСоединение.ОтправитьДляОбработки(Запрос) | ☑ | ||
---|---|---|---|---|
0
bazxeno
16.08.20
✎
00:59
|
Всем привет.
Приключилось мне писать обмен между 1с и битрикс24. И столкнулся я с совершенно не понятной ситуацией. Решено было делать обмен на Webhook rest api битрикс24. По сути 1ска отправляет строчку url и ожидает что-то получить в ответ. В результате при выгрузке 2000 элементов справочника через раз наблюдается создание одинаковых сущностей в битриксе. Т.е. я отправляю запрос цель которого создать CRM компанию и ожидаю получить в ответе ID созданного элемента. В результате я получаю id и пишу в этот элемент справочника. А на стороне битрикса создается два элемента, и id первого я получаю. Как сказал разработчик со стороны битрикса он в access logs видит что запросы идут по два друг за другом. Прям два одинаковых запроса практически в одну миллисекунду. Программный код не предполагает двух одинаковых запросов подряд, в каждой итерации цикла перебора элементов как минимум несколько разных запросов. И вот такое ощущение что функция HTTPСоединение.ОтправитьДляОбработки каким то образом дублирует запросы. Может у кого была такая ситуация? P.S. В процессе разбора была воспроизведена ситуация, но на конкретном одном заведомо проблемном элементе. И все отработало как положено. Один запрос, одна сущность создалась в 1с. |
|||
1
Garykom
гуру
16.08.20
✎
01:12
|
Ошибка в коде
|
|||
2
bazxeno
16.08.20
✎
01:49
|
(1) Мне хочется так думать, но тогда все элементы перебираемые в цикле дублировались бы. А в итоге дублируются не все.
И при воспроизведение этой же ситуации, но заведомо только на одном элементе (код тот же, вызов процедуры из того же места) ошибка не воспроизвелась. Выдержка accesslog битрикса [15/Aug/2020:18:30:51 +0300] "POST /rest/доступыwebhook/crm.contact.list.json?filter[TYPE_ID]=1&filter[UF_CRM_15838317]=155459646&select[]=*&select[]=UF_* HTTP/1.0" 200 230 [15/Aug/2020:18:30:51 +0300] "POST /rest/доступыwebhook/crm.contact.list.json?filter[TYPE_ID]=1&filter[UF_CRM_15838317]=155459646&select[]=*&select[]=UF_* HTTP/1.0" 200 230 [15/Aug/2020:18:30:51 +0300] "POST /rest/доступыwebhook/crm.contact.add.json?&Перечисляем поля битрикса и значения HTTP/1.0" 200 225 [15/Aug/2020:18:30:51 +0300] "POST /rest/доступыwebhook/crm.contact.add.json?&Перечисляем поля битрикса и значения HTTP/1.0" 200 223 [15/Aug/2020:18:30:52 +0300] "POST /rest/доступыwebhook/bizproc.workflow.start?TEMPLATE_ID=953&DOCUMENT_ID[0]=crm&DOCUMENT_ID[1]=CCrmDocumentContact&DOCUMENT_ID[2]=&PARAMETERS[PASSWORD]=Пароль HTTP/1.0" 400 53 [15/Aug/2020:18:30:52 +0300] "POST /rest/доступыwebhook/bizproc.workflow.start?TEMPLATE_ID=953&DOCUMENT_ID[0]=crm&DOCUMENT_ID[1]=CCrmDocumentContact&DOCUMENT_ID[2]=24402(вот это id элемента битрикса над которым производится битриксовый бизнес процесс, по сути я его получаю в результате запроса add)&PARAMETERS[PASSWORD]=Пароль HTTP/1.0" 200 244 в идеальной картине мира в рамках одной итерации цикла происходит метод list потом add потом запуск бизнес процесса. Сам запрос отправляется одной и той же функцией, только меняется его содержимое. В рамках одной итерации цикла ровно три вызова функции. Если бы была ошибка в коде тогда порядок запросов думаю был бы другой. Наврятли лог их сортирует по моменту вызова. И получается что на одних и тех же данных, иногда просто три вызова, а иногда вот такие спаренные вызовы. И отличие по итогу только в запуске бизнес процессов, в первом случае id элемента еще нет. т.е. переменная строковая пуста. Мой моск уже сломан( |
|||
3
Злопчинский
16.08.20
✎
02:36
|
(2) "Если бы была ошибка в коде" - так ты ошибку не найдешь, если она есть. ты исходишь из того, что вероятность ошибки мала. исходишь из оптимистичного сценария. исходи так "где-то в коде есть ошибка"...
|
|||
4
Fram
16.08.20
✎
05:08
|
(2) А что твои логи говорят?
|
|||
5
youalex
16.08.20
✎
06:37
|
Проблема только на одном элементе воспроизводится?
Посмотри что отправляется в Б-24, например, в https://www.telerik.com/fiddler |
|||
6
Garykom
гуру
16.08.20
✎
13:16
|
(2) спаренные вызовы могут быть из 1С при авторизации, когда первым вызовом 1С пытается понять по ответу какая нужна
делай авторизацию вручную правильно вместо того чтобы на 1Сную полагаться |
|||
7
bazxeno
16.08.20
✎
14:02
|
Проблема решена.
(3) ну я допускаю что всегда может быть ошибка. Но в данном случае код в принципе не мог отправлять два одинаковых запроса подряд. (4) вот это правильный вопрос. Изначально не увидел там проблему т.к. он тяжелый фильтровал по своему пользователю, а потом присмотрелся и понял что как минимум два пользователя синхронно исполняли код, до каждой запятой что называется. (5) (6) проблема по итогу воспроизводилась на всех элементах, которые инициировали создание объекта в битрикса. Авторизация тут по итогу не при чем. Диагноз в итоге я для себя вывел. Сам виноват и не понимал тонкостей работы консоли регламентных заданий инструментария Irka. Если мы выбираем регламент и нажимаем Выполнить - НаСервере. (всегда использовал такой запуск для удобной отладки) то в этот момент происходит двойное синхронное выполнение кода. Под моим пользователем на сервере, что логично. + Фоновое задание. Вот второго то я и не ожидал увидеть ну никак. Ну и битрикс со своей стороны честно обрабатывал каждый запрос. Но если для метода list это ровным счетом не проблема, то метод add делал дубли. А по итогу не каждый элемент цикла должен был создавать сущности. В общем спасибо за участие, как обычно сам себе злобный буратино. Теперь придется распиливать эту обработку регламентных заданий для понимания чего еще я там не знаю) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |