1с 77 ОткрытьФормуМодально не всегда работает

1. SSSSlim 13.03.21 16:42 Сейчас в теме
Добрый день.
Имеется 1с 77, и внешняя обработка, которая вызывается через определенный промежуток времени через ОткрытьФормуМодально.
Пример кода:
Путь = "D:\ВнешниеОбработки\Обработка.ert";
Параметры = "Какой-нибудь параметр";
ОткрытьФормуМодально("Обработка", Параметры, Путь);
Сообщить(Параметры);

Эта обработка вызывается целый день, через каждый час. Возникла такая проблема, что первое время все работает нормально, допустим часа 2, а потом вызов обработки перестает проходить. Код обработки не меняется, доступ к файлу есть. Через отладчик посмотрел что происходит, после строки с ОткрытьФормуМодально в переменную параметры попадает вот такая вещь:

У поля "Параметр" у Формы, который не раскрыт тот же самый набор параметров, т.е. это рекурсия.
Кто-нибудь с таким встречался? В какую сторону смотреть?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. CheBurator 3119 15.03.21 22:11 Сейчас в теме
(1)
У поля "Параметр" у Формы, который не раскрыт тот же самый набор параметров, т.е. это рекурсия.

- ну и смотри что делается внутри твоей модальной обработки, может она внутрях каждую секунду еще что-то вызывает на протяжении 5 минут и передача параметров криво сделана, тогда тупо может стек переполнится. Потому что для обработки, которая вызывается каждый час и падает после 2-3 вызова - даже еслди рекурсия - то это мизер.
.внутри модальной обработки что-то (возможно криво) делается с полученным Параметры.
7. ivsher 17.03.21 10:18 Сейчас в теме
(1) Интересно девки пляшут. Я так понимаю вызов осуществляется через ОбработкуОжидания? Если да, то такое впечатление, что ОбраоткаОжидания из основного контекста перелетает в контекст открываемой формы, и вы получаете вот такую матрешку.
2. Ivanov_OM 38 14.03.21 22:25 Сейчас в теме
Смотри у тех, кто не закрыл форму.
И пробуй процедуру ПриПовторномОткрытии
3. AndKovalchuk 192 15.03.21 08:53 Сейчас в теме
Разница между ОткрытьФорму и ОткрытьФормуМодально - очень большая.
Второй параметр - это то, что передаётся форме в Форма.Параметр.
В случае модального открытия никакого контекста обратно не возвращается, так как операторы после ОткрытьФормуМодально выполняются уже после закрытия формы (контекст в этом случае уже не существует).

Сообщить (Параметры) будет работать уже при закрытой форме обработки и что там будет вообще не понятно.
5. CheBurator 3119 15.03.21 22:07 Сейчас в теме
(3)
Сообщить (Параметры) будет работать уже при закрытой форме обработки и что там будет вообще не понятно.


Будет там ровно то, что положили до вызова формы, если внутри открываемой модальной формы через полученный параметр Форма.Параметр (в котором и сидит само значение Параметры) не сделали что нибудь иное с полученным параметром.
4. CheBurator 3119 15.03.21 21:57 Сейчас в теме
С модальными формами работаю много. все там нормально отрабатывает. Вплоть до того, что я из формы в офрму вообще извращенно сквозняком передаю в качестве параметра сам же параметр

ОткрытьФормуМодально("Отчет",Форма.Параметр,Дочерняяформа)
8. SSSSlim 17.03.21 18:08 Сейчас в теме
Апдейт.
На самом деле 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 я тоже рекрусивно не вызываю.
10. ivsher 18.03.21 09:17 Сейчас в теме
(8)
Функция Start из Глобального модуля запускается каждые 10 секунд (так надо)

Так каким образом вы это реализовали? Через ОбработкуОжидания?
11. SSSSlim 19.03.21 00:56 Сейчас в теме
(10)
javascript setinterval() выполняется запрос к api на php => php через com соединяется с 1с => 1c выполняет процедуру
12. ivsher 26.03.21 09:33 Сейчас в теме
(11)
javascript setinterval() выполняется запрос к api на php => php через com соединяется с 1с => 1c выполняет процедуру

И так, грубо говоря, каждые десять секунд. Мне кажется проще один раз это запустить. Выполните запуск 1ски, а уже саму вашу форму вызываете из глобального модуля, через стандартную процедуру 1с ОбработкаОжидания, с любым нужным вам интервалом.
9. CheBurator 3119 17.03.21 19:34 Сейчас в теме
Смотри кривой код. Нет никаких рекурсий если ты их туда не вкорячил.
и, надо понимать, что если в Форма.Параметр сидит список значенией,
то Парам = Форма.Параметр = будет передача значения по ссылке, а не по значению
и если после этого вкоряить что-либо подобное

Форма.Параметр.ДобавитьЗначение(Парам) - то я не удивлюсь что рано или поздно что-то упадет.
Оставьте свое сообщение

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