Как полностью уничтожить управляемую форму.

1. LosevI 14.05.21 12:33 Сейчас в теме
Здравствуйте. Меня поставил в тупик следующий нюанс. Буду удивлен, если кто либо вообще разбирался в этой теме, но попробовать стоит.

Я открываю основную форму своей обработки, и в ней происходит программное получение (без фактического открытия) другой, служебной формы, и сохранение ссылки на нее в переменную модуля основной формы на клиенте.

Затем, скажем, основную форму обработки я закрыл. Сижу с пустым предприятияем. Через какое то время опять открываю основную форму, и, логично, опять получаю служебную в переменную.

На служебной форме есть ОбработкаОповещения(). И вот тут соль - замером производительности я случайно замечаю, что данная обработка отрабатывает уже дважды. Что может значить только одно - та, первая служебная форма, все еще существует, хотя она не открыта, и ссылка на нее нигде не хранится.

В данной ситуации во временное хранилище со служебной формы также ничего не помещалось.
В связи с чем у меня вопрос, почему этот "мусор" продолжает храниться в клиентском сеансе, что его там может удерживать, будет ли она когда нибудь удалена платформой, и есть ли способ вычистить ее программно, напрмер, перед закрытием основной формы обработки?

Вопрос не критичный, чистое любопытство... Благодаря этому нюансу я заметил ошибку в своем коде, после исправления которой вторая служебная форма уже не будет создаваться (будет через всю ту же обработку оповещения получена существующая).
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
12. LosevI 22.05.21 05:31 Сейчас в теме
(11) Спасибо вам большое. По началу я со скепсисом отнесся к вашему ответу, но он натолкнул меня на одну мысль. И вы оказались правы. Циклическая ссылка образуется между основной служебной формой и дополнительной служебной формой, на которой располагается исключительно код, несовместимый со всеми версиями платформ. Такую причину отвечающие в теме предполагать не могли, так как я не стал усложнять стартовое сообщение темы объяснением того, зачем мне два контура служебных форм. Да и тогда я не подумал, что проблема может возникать именно из-за этого. После тестового устранения этой связки, оповещение в служебной форме перестало отрабатывать после закрытия основной формы обработки.
Не смотря на то, что я уже решил эту проблему другим способом более жестких проверок на необходимость реальной обработки оповещения в служебной форме, я рад что теперь все-таки этот программный "мусор" не будет хранится в сеансе.

Приношу свои извинения
(8)

Сейчас попробую раздать небольшое вознаграждение.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 14.05.21 12:52 Сейчас в теме
(1)Я правильно понял, что оповещение выполняется периодически?
3. LosevI 14.05.21 13:08 Сейчас в теме
(2) Ну, нет. Я просто не стал вдаваться в подробности. На основной форме есть определенные места где после действия пользователя вызывается Оповестить() скажем так.
4. nomad_irk 72 14.05.21 13:14 Сейчас в теме
(3)И когда эти же события происходят в новых формах, то отрабатывает дважды, так?
Нуу.....прикольно, через 20 минут, по всей видимости, должно "отпустить" :)
6. LosevI 14.05.21 13:42 Сейчас в теме
(4) Уже код исправил только что, чтобы формы не множились. Но от этого факт неизменен - в полностью пустом предприятии после закрытия основной формы, я ее открываю снова, там есть оповещение что она открывается, и существующая "мусорная" форма ее все также подхватывает своей обработкой оповещения. Просто теперь она в этот момент корректно возвращает ссылку на себя, и подвязывается к новой основной форме (дубль не создается).
5. dandykry 10 14.05.21 13:40 Сейчас в теме
(1) Пустая конфигурация

Есть глобальная переменная в модуле приложения: КоличествоОповещенийФантомнойФормы

Есть ФормаФантомная, в которой есть ОбработкаОповещения. Эта обработка выполняет КоличествоОповещенийФантомнойФормы = КоличествоОповещенийФантомнойФормы + 1;

Есть ПростоФорма. В ней есть:
- Форма = Получить("ОбщаяФорма.ФормаФантомная");

- Есть команда, которая вызывает цикл из Оповестить("ЦиклОповещений", 1, 1);

- Есть Сообщить(КоличествоОповещенийФантомнойФормы);

Так должно воспроизвестись?
7. LosevI 14.05.21 13:45 Сейчас в теме
(5)
которая вызывает цикл из Оповестить("ЦиклОповещений", 1, 1);

Не понял зачем вам цикл. Вы по команде на простой форме выполните оповещение 1 раз. Потом простую форму закройте и откройте снова. Можете еще 10 раз так сделать чтобы нагляднее было. Потом по идее у вас будет +10 к переменной за раз прибавляться.
8. dandykry 10 14.05.21 13:59 Сейчас в теме +0.2 $m
(7) Как называется переменная, в которую вы запомнили получение формы?

У меня получилось воспроизвести только когда я глобально ее запомнил в модуле приложения. Между открытием и закрытием формы переменные не сохраняются и не могут.

Покажи код, ты где-то сам себя надурил
9. LosevI 14.05.21 14:49 Сейчас в теме
(8) Переменная модуля формы (клиентская).
(8)
Между открытием и закрытием формы переменные не сохраняются и не могут.

Да дело то не в переменной. Я не из переменной получаю служебную форму на старте основной.
1) Запускается основная форма вручную.
2) В своем ПриОткрытии она выполняет Оповестить() для поиска уже имеющейся служебной формы.
3) Форма не находится, создается через ПолучитьФорму новая, кладется в переменную.
4) Закрывается основная форма вручную. Предприятие пустое.
5) Жду 10 секунд.
6) Запускается основная форма вручную.
7) В своем ПриОткрытии она выполняет Оповестить() для поиска уже имеющейся служебной формы.
8) Успешно попадаю точкой останова в ОбработкаОповещения() служебной формы. ЭтотОбъект.УникальныйИдентификатор абсолютно такой же как и был до этого при создании служебной формы в пункте 3.

Какие еще нужны объяснения? В стартовом посте было почти то же, там просто форма из-за ошибки никогда не находилась по оповещению (пункт 8 попадал в обработку, но ссылку на себя в параметр не возвращала).
Код показывать не буду, там все гораздо сложнее чем я тут на пальцах объясняю, и все равно понятно ничего не будет. Могу скриншот табло приложить :) Суть, повторюсь, в том, что в пустом предприятии ловится обработка оповещения в форме, которой существовать не должно.
10. LosevI 14.05.21 14:53 Сейчас в теме
(8) И там еще в момент закрытия основной формы тоже есть Оповестить(). Оповещение в служебной отрабатывает, хотя фактически основная форма уже закрыта. Может это по какой то причине оставляет служебную в живых, я не знаю...
Прикрепленные файлы:
11. SlavaKron 20.05.21 12:42 Сейчас в теме +0.3 $m
(10) Где-то в данных или в перемнной служебной формы сохраняется основная форма, то есть получается что-то вроде циклической ссылки. Возможно такой минимальный пример: Код модуля формы 1 (основной):
&НаКлиенте
Перем Форма2;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Оповестить("ПоискСлужебнойФормы", , ЭтотОбъект);	
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Форма2 = ПолучитьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма2");
	Оповестить("ПоискСлужебнойФормы", , ЭтотОбъект);
	
КонецПроцедуры
Показать
Код модуля формы 2 (служебной):
&НаКлиенте
Перем Форма1;

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "ПоискСлужебнойФормы" Тогда
		
		Форма1 = Источник;
		
	КонецЕсли;
	
КонецПроцедуры
Показать
Прикрепленные файлы:
ВнешняяОбработка1.epf
12. LosevI 22.05.21 05:31 Сейчас в теме
(11) Спасибо вам большое. По началу я со скепсисом отнесся к вашему ответу, но он натолкнул меня на одну мысль. И вы оказались правы. Циклическая ссылка образуется между основной служебной формой и дополнительной служебной формой, на которой располагается исключительно код, несовместимый со всеми версиями платформ. Такую причину отвечающие в теме предполагать не могли, так как я не стал усложнять стартовое сообщение темы объяснением того, зачем мне два контура служебных форм. Да и тогда я не подумал, что проблема может возникать именно из-за этого. После тестового устранения этой связки, оповещение в служебной форме перестало отрабатывать после закрытия основной формы обработки.
Не смотря на то, что я уже решил эту проблему другим способом более жестких проверок на необходимость реальной обработки оповещения в служебной форме, я рад что теперь все-таки этот программный "мусор" не будет хранится в сеансе.

Приношу свои извинения
(8)

Сейчас попробую раздать небольшое вознаграждение.
Прикрепленные файлы:
Оставьте свое сообщение

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