1с 77 ОткрытьФормуМодально не всегда работает
Добрый день.
Имеется 1с 77, и внешняя обработка, которая вызывается через определенный промежуток времени через ОткрытьФормуМодально.
Пример кода:
Эта обработка вызывается целый день, через каждый час. Возникла такая проблема, что первое время все работает нормально, допустим часа 2, а потом вызов обработки перестает проходить. Код обработки не меняется, доступ к файлу есть. Через отладчик посмотрел что происходит, после строки с ОткрытьФормуМодально в переменную параметры попадает вот такая вещь:
У поля "Параметр" у Формы, который не раскрыт тот же самый набор параметров, т.е. это рекурсия.
Кто-нибудь с таким встречался? В какую сторону смотреть?
Имеется 1с 77, и внешняя обработка, которая вызывается через определенный промежуток времени через ОткрытьФормуМодально.
Пример кода:
Путь = "D:\ВнешниеОбработки\Обработка.ert";
Параметры = "Какой-нибудь параметр";
ОткрытьФормуМодально("Обработка", Параметры, Путь);
Сообщить(Параметры);
Эта обработка вызывается целый день, через каждый час. Возникла такая проблема, что первое время все работает нормально, допустим часа 2, а потом вызов обработки перестает проходить. Код обработки не меняется, доступ к файлу есть. Через отладчик посмотрел что происходит, после строки с ОткрытьФормуМодально в переменную параметры попадает вот такая вещь:

У поля "Параметр" у Формы, который не раскрыт тот же самый набор параметров, т.е. это рекурсия.
Кто-нибудь с таким встречался? В какую сторону смотреть?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
- ну и смотри что делается внутри твоей модальной обработки, может она внутрях каждую секунду еще что-то вызывает на протяжении 5 минут и передача параметров криво сделана, тогда тупо может стек переполнится. Потому что для обработки, которая вызывается каждый час и падает после 2-3 вызова - даже еслди рекурсия - то это мизер.
.внутри модальной обработки что-то (возможно криво) делается с полученным Параметры.
У поля "Параметр" у Формы, который не раскрыт тот же самый набор параметров, т.е. это рекурсия.
- ну и смотри что делается внутри твоей модальной обработки, может она внутрях каждую секунду еще что-то вызывает на протяжении 5 минут и передача параметров криво сделана, тогда тупо может стек переполнится. Потому что для обработки, которая вызывается каждый час и падает после 2-3 вызова - даже еслди рекурсия - то это мизер.
.внутри модальной обработки что-то (возможно криво) делается с полученным Параметры.
Разница между ОткрытьФорму и ОткрытьФормуМодально - очень большая.
Второй параметр - это то, что передаётся форме в Форма.Параметр.
В случае модального открытия никакого контекста обратно не возвращается, так как операторы после ОткрытьФормуМодально выполняются уже после закрытия формы (контекст в этом случае уже не существует).
Сообщить (Параметры) будет работать уже при закрытой форме обработки и что там будет вообще не понятно.
Второй параметр - это то, что передаётся форме в Форма.Параметр.
В случае модального открытия никакого контекста обратно не возвращается, так как операторы после ОткрытьФормуМодально выполняются уже после закрытия формы (контекст в этом случае уже не существует).
Сообщить (Параметры) будет работать уже при закрытой форме обработки и что там будет вообще не понятно.
(3)
Будет там ровно то, что положили до вызова формы, если внутри открываемой модальной формы через полученный параметр Форма.Параметр (в котором и сидит само значение Параметры) не сделали что нибудь иное с полученным параметром.
Сообщить (Параметры) будет работать уже при закрытой форме обработки и что там будет вообще не понятно.
Будет там ровно то, что положили до вызова формы, если внутри открываемой модальной формы через полученный параметр Форма.Параметр (в котором и сидит само значение Параметры) не сделали что нибудь иное с полученным параметром.
С модальными формами работаю много. все там нормально отрабатывает. Вплоть до того, что я из формы в офрму вообще извращенно сквозняком передаю в качестве параметра сам же параметр
ОткрытьФормуМодально("Отчет",Форма.Параметр,Дочерняяформа)
ОткрытьФормуМодально("Отчет",Форма.Параметр,Дочерняяформа)
Апдейт.
На самом деле 1с как таковая не открывается, создается ком-соединение из php к семерке, там все тоже самое, формы и т.д., только они не показываются визуально, просто висит процесс 1cv7s.exe, но код 1с-ка работает штатно, как будто при обычном пользователе.
Код что я написал примерный, т.е. есть функция в глобальном модуле с таким кодом, у нее на входе 2 параметра: путь к обработке и параметры для этой обработки. Эта функция вызывается из php через ком соединение. Пример:
Далее отрабатывает сама обработка автоматом, т.е. открытие нужно именно модальное:
Функция Start из Глобального модуля запускается каждые 10 секунд (так надо). Суть в том что через 2, 5, 7, 9 часов, когда как, она начинает возвращать то, что на скриншоте. Скорее всего прав Ivanov_OM, в какой то момент форма не закрывается и остается висеть, поэтому решил перед вызовом функции Start вызывать процедуру, которая закрывает все формы, если они есть:
Эта процедура вызывается не в потоке с функцией Start(), а перед ней, т.е. у 1с есть время, чтобы самой "интерактивно" эти окна закрыть.
Но и это не помогло. Т.е. com соединение не рвется с ним все в порядке, просто не вызывается обработка, как будто она уже открыта.
И еще вопрос почему рекурсия в Параметре, т.е. как будто где то есть вызов самой себя, но этого в коде нет и близко, и функцию Start я тоже рекрусивно не вызываю.
На самом деле 1с как таковая не открывается, создается ком-соединение из php к семерке, там все тоже самое, формы и т.д., только они не показываются визуально, просто висит процесс 1cv7s.exe, но код 1с-ка работает штатно, как будто при обычном пользователе.
Код что я написал примерный, т.е. есть функция в глобальном модуле с таким кодом, у нее на входе 2 параметра: путь к обработке и параметры для этой обработки. Эта функция вызывается из php через ком соединение. Пример:
Функция Start(Путь, Параметры = "") Экспорт
ОткрытьФормуМодально("Обработка", Параметры, Путь);
Возврат Параметры;
КонецФункции // launchProcessingFromWeb
Далее отрабатывает сама обработка автоматом, т.е. открытие нужно именно модальное:
Процедура ПриОткрытии()
Если (ПустоеЗначение(Форма.Параметр) = 1) Тогда
Форма.Параметр = -1;
СтатусВозврата(0);
Возврат;
КонецЕсли;
Парам = Форма.Параметр;
//Тут что то делаем с Форма.Параметр, ну например если число, то умножаем на 10
Если ТипЗначенияСтр(Парам) = "Число" Тогда
Форма.Параметр = Парам * 10;
КонецЕсли;
Форма.Закрыть(0);
КонецПроцедуры // ПриОткрытии
ПоказатьФункция Start из Глобального модуля запускается каждые 10 секунд (так надо). Суть в том что через 2, 5, 7, 9 часов, когда как, она начинает возвращать то, что на скриншоте. Скорее всего прав Ivanov_OM, в какой то момент форма не закрывается и остается висеть, поэтому решил перед вызовом функции Start вызывать процедуру, которая закрывает все формы, если они есть:
Процедура Close() Экспорт
Сервис = СоздатьОбъект("Сервис");
ОткрытыеФормы = Сервис.СписокВсехОткрытыхОкон();
Для н = 1 По ОткрытыеФормы.РазмерСписка() Цикл
Конт = ОткрытыеФормы.ПолучитьЗначение(н);
Конт.Форма.Закрыть(0);
КонецЦикла;
КонецПроцедуры // closeAllWindows
ПоказатьЭта процедура вызывается не в потоке с функцией Start(), а перед ней, т.е. у 1с есть время, чтобы самой "интерактивно" эти окна закрыть.
Но и это не помогло. Т.е. com соединение не рвется с ним все в порядке, просто не вызывается обработка, как будто она уже открыта.
И еще вопрос почему рекурсия в Параметре, т.е. как будто где то есть вызов самой себя, но этого в коде нет и близко, и функцию Start я тоже рекрусивно не вызываю.
(11)
И так, грубо говоря, каждые десять секунд. Мне кажется проще один раз это запустить. Выполните запуск 1ски, а уже саму вашу форму вызываете из глобального модуля, через стандартную процедуру 1с ОбработкаОжидания, с любым нужным вам интервалом.
javascript setinterval() выполняется запрос к api на php => php через com соединяется с 1с => 1c выполняет процедуру
И так, грубо говоря, каждые десять секунд. Мне кажется проще один раз это запустить. Выполните запуск 1ски, а уже саму вашу форму вызываете из глобального модуля, через стандартную процедуру 1с ОбработкаОжидания, с любым нужным вам интервалом.
Смотри кривой код. Нет никаких рекурсий если ты их туда не вкорячил.
и, надо понимать, что если в Форма.Параметр сидит список значенией,
то Парам = Форма.Параметр = будет передача значения по ссылке, а не по значению
и если после этого вкоряить что-либо подобное
Форма.Параметр.ДобавитьЗначение(Парам) - то я не удивлюсь что рано или поздно что-то упадет.
и, надо понимать, что если в Форма.Параметр сидит список значенией,
то Парам = Форма.Параметр = будет передача значения по ссылке, а не по значению
и если после этого вкоряить что-либо подобное
Форма.Параметр.ДобавитьЗначение(Парам) - то я не удивлюсь что рано или поздно что-то упадет.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот