Имя: Пароль:
1C
1С v8
Двойное срабатывание 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 делал дубли. А по итогу не каждый элемент цикла должен был создавать сущности.

В общем спасибо за участие, как обычно сам себе злобный буратино. Теперь придется распиливать эту обработку регламентных заданий для понимания чего еще я там не знаю)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.