Здравствуйте. Меня поставил в тупик следующий нюанс. Буду удивлен, если кто либо вообще разбирался в этой теме, но попробовать стоит.

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

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

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

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

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

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

Сейчас попробую раздать небольшое вознаграждение.
---
Я правильно понял, что оповещение выполняется периодически?
---
Ну, нет. Я просто не стал вдаваться в подробности. На основной форме есть определенные места где после действия пользователя вызывается Оповестить() скажем так.
---
И когда эти же события происходят в новых формах, то отрабатывает дважды, так?
Нуу.....прикольно, через 20 минут, по всей видимости, должно "отпустить" :)
---
Уже код исправил только что, чтобы формы не множились. Но от этого факт неизменен - в полностью пустом предприятии после закрытия основной формы, я ее открываю снова, там есть оповещение что она открывается, и существующая "мусорная" форма ее все также подхватывает своей обработкой оповещения. Просто теперь она в этот момент корректно возвращает ссылку на себя, и подвязывается к новой основной форме (дубль не создается).
---
Пустая конфигурация

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

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

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

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

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

Так должно воспроизвестись?
---
которая вызывает цикл из Оповестить("ЦиклОповещений", 1, 1);
Не понял зачем вам цикл. Вы по команде на простой форме выполните оповещение 1 раз. Потом простую форму закройте и откройте снова. Можете еще 10 раз так сделать чтобы нагляднее было. Потом по идее у вас будет +10 к переменной за раз прибавляться.
---
Как называется переменная, в которую вы запомнили получение формы?

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

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

Какие еще нужны объяснения? В стартовом посте было почти то же, там просто форма из-за ошибки никогда не находилась по оповещению (пункт 8 попадал в обработку, но ссылку на себя в параметр не возвращала).
Код показывать не буду, там все гораздо сложнее чем я тут на пальцах объясняю, и все равно понятно ничего не будет. Могу скриншот табло приложить :) Суть, повторюсь, в том, что в пустом предприятии ловится обработка оповещения в форме, которой существовать не должно.
---
И там еще в момент закрытия основной формы тоже есть Оповестить(). Оповещение в служебной отрабатывает, хотя фактически основная форма уже закрыта. Может это по какой то причине оставляет служебную в живых, я не знаю...
---
Где-то в данных или в перемнной служебной формы сохраняется основная форма, то есть получается что-то вроде циклической ссылки. Возможно такой минимальный пример: Код модуля формы 1 (основной):
```1c
    &НаКлиенте
    Перем Форма2;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

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

    КонецПроцедуры

    &НаКлиенте
    Процедура ПриЗакрытии(ЗавершениеРаботы)

    Форма2 = ПолучитьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма2");
    Оповестить("ПоискСлужебнойФормы", , ЭтотОбъект);

    КонецПроцедуры
```
Код модуля формы 2 (служебной):
```1c
    &НаКлиенте
    Перем Форма1;

    &НаКлиенте
    Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

    Если ИмяСобытия = "ПоискСлужебнойФормы" Тогда

    Форма1 = Источник;

    КонецЕсли;

    КонецПроцедуры
```
---
Спасибо вам большое. По началу я со скепсисом отнесся к вашему ответу, но он натолкнул меня на одну мысль. И вы оказались правы. Циклическая ссылка образуется между основной служебной формой и дополнительной служебной формой, на которой располагается исключительно код, несовместимый со всеми версиями платформ. Такую причину отвечающие в теме предполагать не могли, так как я не стал усложнять стартовое сообщение темы объяснением того, зачем мне два контура служебных форм. Да и тогда я не подумал, что проблема может возникать именно из-за этого. После тестового устранения этой связки, оповещение в служебной форме перестало отрабатывать после закрытия основной формы обработки.
Не смотря на то, что я уже решил эту проблему другим способом более жестких проверок на необходимость реальной обработки оповещения в служебной форме, я рад что теперь все-таки этот программный "мусор" не будет хранится в сеансе.

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

Сейчас попробую раздать небольшое вознаграждение.