Суть проблемы: прерывание обмена с сайтом BITRIX без каких-либо сообщений об ошибках и запуск процесса обмена с самого начала, но вообще не уверен, что проблемы именно с обменом. Скорее всего, так будут себя вести все длительные операции, инициированные из формы по кнопке.
Алгоритмы обмена и прочая мишура взяты с оф. сайта BITRIX. Сам процесс обмена выполняется без ошибок, доходит до момента, когда входящие данные обрабатываются сайтом, а 1С опрашивает текущее состояние. Прерывание процесса происходит спонтанно, регламентных заданий по обмену нет вообще.
Для тестирования создал обработку, с полем для выбора узла обмена и кнопкой "выполнить обмен":
В ходе тестирования выяснилось, что процесс начинается с серверного вызова:
Запуск обмена по кнопке начинается с вызова клиентской процедуры в модуле формы(что вполне ожидаемо).
Пробовал выполнить обмен на копии базы - выполняется корректно, до завершения. В копии все регламентные выключены.
В рабочей базе регламентные задания срабатывают гораздо чаще, чем происходит перезапуск обмена.
Никто не сталкивался?
Для меня это пока выглядит как мистика, либо очередной глюк платформы 1С.
7200 - это как раз 2 часа! Если рабочий процесс был создан ранее начала выполнения обмена - как раз и упадет раньше. Регламентные задания и фоновое выполнение задач - разные вещи. Все сходиться в пользу моей версии. Можно попробовать перезапуск до суток увеличить - 86400 или вообще отключить - 0 тогда будет точно ясно в этом дело или нет!
Да нет обработчиков ожидания, внешняя обработка создана с нуля только для тестирования обмена.
Либо рассказывайте, как искать этот самый обработчик ожидания.
Судя по описанному Вами поведению, регламентное задание 1С завершается аварийно и запускается повторно. Попробуйте установить количество повторов равным 0 в настройках регламентного задания.
(5)нет. Все работает без привлечения регламентных заданий. Нажимаю кнопку на форме внешней обработки, вызывается серверный метод ВыполнитьОбмен() и все.
Даже если не будет, как мне побороть произвольный запуск при работающих регламентных заданиях? :)
Выключать регламентные задания совсем на рабочей БД нельзя.
(35)Со стороны 1С - точно нет, т.к. он отправлен в сторону Битрикс перед обработкой.
Со стороны Битрикс - обрабатывается. Какой еще процесс может обращаться к этому файлу - не в курсе, нужно узнавать у админов Битрикса. Админы Битрикса про проблему вкурсе, пока молчат.
не, не....если бы такое было, то там чудеса посерьезнее были бы.
Еще раз: обмен первый раз инициируется мной нажатием на кнопку на форме внешней обработки, затем начинается с серверного вызова процедуры обмена, находящегося в этой форме.
Такое ощущение, что форма внешней обработки переинициализировалась, но как-то сделала это не полностью/стандартно.
Если бы работало регламентное задание, то были бы конфликты доступа к файлу лога, чего не наблюдается вообще.
Проблема может быть на стороне хостинга. У нас была ситуация: файл обмена маленький - обмен выполнялся без проблем. Файл обмена большой на хостинге возникал обрыв соединения. Может проблема не в 1С?
А почему у Вас выполнение происходит на сервере без контекста? Понятно, что не хотите контекст формы передавать, но в данном конкретном случае это не имеет значения. Попробуйте просто на сервере выполнить процедуру. Это первое. Второе - процедура Б_ОбменСКПСервер.ВыполнитьОбмен() - это процедура, которая вызывает обмен, правильно понимаю? Если так, то никакого перезапуска фонового задания не происходит, а происходит повторный вызов этой процедуры. Поищите, что еще вызывает эту процедуру, если это задание обмена - отключите его на время отладки, попробуйте еще раз запустить вручную. Третье - ИМХО, самое действенное, но нужно чтоб была включена отладка на сервере, на рабочем сервере делать не рекомендуется. Поставить точку отладки в начале процедуры обмена (которая Б_ОбменСКПСервер.ВыполнитьОбмен()), посмотреть по стеку вызовов откуда пришел второй вызов этой процедуры. Ну а по результатам уже будет понятней что там происходит
Б_ОбменСКПСервер.ВыполнитьОбмен() - это процедура, которая вызывает обмен, правильно понимаю? Если так, то никакого перезапуска фонового задания не происходит, а происходит повторный вызов этой процедуры. Поищите, что еще вызывает эту процедуру, если это задание обмена - отключите его на время отладки, попробуйте еще раз запустить вручную.
Понимаете правильно.
Про фоновые задания вообще речи не идет, т.к. на время теста я отключал регламентные задания вообще.
НаСервере/НаСервереБезКонтекста - абсолютно без разницы, изначально было НаСервере, я уж подумал, мож форма чего чудит, убрал контекст, ничего не поменялось.
Стек вызовов при первом запуске выглядит вполне стандартно:
При самопроизвольном запуске стек выглядит так же, за исключением того, что выполнение кода начинается сразу с вызова(выделено красным):
(18)интересный случай, однако. А есть ли что-то еще, что вызывает эту же процедуру? Ну, может подписка какая. А и еще, настроено ли автоматическое подключение к фоновым заданиям? И в коде нету ли какой-нибудь обработки исключений, которая запускает обмен заново?
(21) Обмен запускается мной из внешней обработки, напрямую, без всяких фоновых заданий, нажатием на кнопку. Самопроизвольно он запускается так же из этой внешней обработки, но сразу с серверной части кода.
Даже если бы работали фоновые задания или исключения, оно бы из обработки не запускалось, а запускалось бы из какого-то другого места и конкурировало бы за файл лога.
(27)тогда какой-то локальный глюк. Дальше только танцы с бубном: почистить кэш, переписать процедуру и прочее. Кстати, насчет проверки кэша, под другим пользователем каким-нибудь, не пробовали запускать?
А если в функции которая запускает обмен выполнять проверку на уже запущенные задания обмена? Ну или если есть возможность поставить режим отладки, то точку останова там и посмотреть стек вызовов.
(22) Стек вызовов я уже показал в (18), процедура обмена запускается из внешней обработки сперва мной, нажатием кнопки на форме, а затем спонтанно самопроизвольно из этой же обработки. Разница лишь в том, что при нажатии на кнопку отрабатывает сначала клиентский код, вызывающий серверный без контекста, а самопроизвольный запуск начинается сразу с серверного участка кода.
Была однажды проблема: долгоиграющий отчет, то выполниться, то завершиться. Причина оказалась в перезапуске рабочих процессов. В отчете тоже использовалось фоновое задание. Проверьте, может тоже рабочий процесс с фоновым заданием завершается раньше чем Bitrix успевает обработать выгрузку..
7200 - это как раз 2 часа! Если рабочий процесс был создан ранее начала выполнения обмена - как раз и упадет раньше. Регламентные задания и фоновое выполнение задач - разные вещи. Все сходиться в пользу моей версии. Можно попробовать перезапуск до суток увеличить - 86400 или вообще отключить - 0 тогда будет точно ясно в этом дело или нет!
(39) Да, этот вариант очень похож на правду, т.к. судя по логам глюк именно через 2 часа происходил.
Про интервал перезапуска в 7200 я знал с самого начала, видимо, меня переглючило и я был уверен, что это более 2-х часов.