Имя: Пароль:
1C
1С v8
Закрытие обработки через неосновную форму обработки
,
0 Droning1C
 
15.09.21
14:23
У обработки 2 формы:
1) "ФормаАРМ" - не является основной формой обработки
2) "ФормаИнициализации" - является основной

При открытии обработки сначала исполняется код обработчика "ПередОткрытием" формы "ФормаИнициализации"(больше никаких обработчиков на форме не описано). Далее программно получается неосновная форма обработки "ФормаАРМ" и открывается, после чего "ФормаИнициализации" программно закрывается.

Если закрыть неосновную форму "ФормаАРМ" интерактивно, то, после интерактивного закрытия, обработка как будто продолжает существовать в системе. Что я имею в виду -
Если не завершать сеанс отладки и изменить что-то в коде обработки, то в том же сеансе отладки всегда будет срабатывать код, который был в модулях обработки в момент первого запуска обработки в этом сеансе.

Почему так происходит и как все-таки кильнуть экземпляр обработки?

Обработка вызывается через Файл - Открыть. Конфигурация УПП.
1 Droning1C
 
15.09.21
14:28
Собственно весь код формы "ФормаИнициализации":

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    
    СтруктураСтандартныхНастроекАРМ = Новый Структура
    СтруктураСтандартныхНастроекАРМ.Вставить("ПоложениеПрикрепленногоОкна",ВариантПрикрепленияОкна.Лево);
    
    ФормаАРМ = ПолучитьФорму("ФормаАРМ");
    Положение = "";
    Если СтруктураСтандартныхНастроекАРМ.Свойство("ПоложениеПрикрепленногоОкна", Положение) Тогда
        ФормаАРМ.ПоложениеПрикрепленногоОкна = Положение;
        ФормаАРМ.КлючУникальности = Строка(Новый УникальныйИдентификатор);
        ФормаАРМ.ВладелецФормы = ЭтаФорма;
        ФормаАРМ.ЗакрыватьПриЗакрытииВладельца = Ложь;
    КонецЕсли;
    ФормаАРМ.Открыть();
    
    ЭтаФорма.Закрыть();
    
КонецПроцедуры
2 polosov
 
15.09.21
14:34
(1) Попробуй не указывать владельца формы.
3 Droning1C
 
15.09.21
14:34
"Если не завершать сеанс отладки и изменить что-то в коде обработки, то в том же сеансе отладки всегда будет срабатывать код, который был в модулях обработки в момент первого запуска обработки в этом сеансе."

Т.Е. Я меняю код обработки, например добавляю при открытии формы "ФормаАРМ" Сообщить("!"). Сохраняю обработку. Перезапускаю ее в клиентском приложении в том же сеансе. И сообщение "!" не выводится, но если я перезапущу сеанс отладки, то сообдение "!" выведется
4 Droning1C
 
15.09.21
14:48
(2) не, не помогло. Я думаю тут в другом дело. Такое впечатление, что экземпляр обработки продолжает существовать и при повторном открытии обработки в том же сеансе он не пересоздается.
5 Droning1C
 
15.09.21
14:50
И я не понимаю, почему это происходит, ведь по идее экземпляр должен умереть в момент закрытия основной формы, но ведь неосновная форма остается открытой и я имею доступ к, допустим, к экспортным переменным модуля объекта обработки. Значит где-то она живёт. В тмп? или где? Как придушить?
6 Малыш Джон
 
15.09.21
15:07
(0) а зачем ты закрываешь форму в её событии ПередОткрытием? Она на этот момент ещё не открыта.

Вместо Этаформа.Закрыть(); напиши Отказ = Истина;
7 Kassern
 
15.09.21
15:09
(6) только хотел написать, что он пытается закрыть форму, которая еще не открыта)
(0) по поводу открытия форм можно еще тут почитать https://its.1c.ru/db/v8std/content/404/hdoc
8 polosov
 
15.09.21
15:09
(5) Может ты вообще не туда воюешь?
https://its.1c.ru/db/metod8dev/content/2332/hdoc
9 Kassern
 
15.09.21
15:11
(0) Если исключить открытие неосновной формы и интерактивно закрыть форму инициализации, то все норм работает в плане отладки?
10 Kassern
 
15.09.21
15:11
(9) может вообще проблема в кеше у тебя)
11 АнализДанных
 
15.09.21
15:15
(0) Похоже на проблемы с кэшем. Удали из списка окна запуска 1С свою базу и добавь ее снова.
12 Малыш Джон
 
15.09.21
15:37
(11) может лучше кэш почистить?
13 Droning1C
 
15.09.21
15:40
(10) (12) недавно чистил, но сейчас попробую
14 Droning1C
 
15.09.21
15:47
(6) Не помогает
15 polosov
 
15.09.21
15:50
(14) Да циклическая ссылка у тебя где-то. Говнокод разбирай свой.
16 Droning1C
 
15.09.21
15:51
(8) Вот! Очень похоже на эту ситуацию. Получается так - я открываю обработку через файл - открыть, открывается основная форма. в ее реквизитах присутствует ссыль на объект. Далее программно эта форма закрывается, но открывается новая с тем же самым экземпляром объекта в реквизитах.
17 Kassern
 
15.09.21
15:52
(14) (9) пробовал, так ошибки нет?
18 Droning1C
 
15.09.21
15:53
(15) (1) Так вот же. Во первых владелец присваевается на форму, у которой в реквизитах есть удаляемый из памяти объект, во вторых - в открываемой форме, даже без учета владельца будет ссыль на обработку.
19 Droning1C
 
15.09.21
15:56
"Если "обратная связь" между обработкой и формой все же необходима, следует явным образом позаботиться о ее разрыве. Это можно сделать, например, в обработчике закрытия формы."  Собственно, как?
20 Kassern
 
15.09.21
15:57
(19) Юзай оповещения
21 Малыш Джон
 
15.09.21
16:00
(19) владельца формы убери
Зачем ставить форму владельцем, если ты её закрывать собираешься?
22 Droning1C
 
15.09.21
16:01
(21) это я уже сделал
23 polosov
 
15.09.21
16:09
(18) Ты заставил меня сделать тестовую обработку.
Твой вариант работает нормально. Дело в коде второй формы - скорее всего в ней создается циклическая ссылка.
24 polosov
 
15.09.21
16:10
+(23)  Что там у тебя в ПриОткрытии или в ПередОткрытием?
25 Droning1C
 
15.09.21
16:13
(24) Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    //Сообщить("!");
    //сначала будем анализировать сохраненные настройки и применять их.
    //добавить настройку вариантов отчетов и настроек отчетов по умолчанию.
    
    ШиринаПанели = 24;
    //Положение = "";

    
    //Если СтруктураСтандартныхНастроекАРМ.Свойство("ПоложениеПрикрепленногоОкна", Положение) Тогда
    //    ЭтаФорма.ПоложениеПрикрепленногоОкна = Положение;
    //КонецЕсли;
    
    
    
    
    Если ЭтаФорма.ПоложениеПрикрепленногоОкна = ВариантПрикрепленияОкна.Верх ИЛИ ЭтаФорма.ПоложениеПрикрепленногоОкна = ВариантПрикрепленияОкна.Низ Тогда
        ЭлементыФормы.Удалить(ЭлементыФормы.КоманднаяПанельПравоЛево);
        КоманднаяПанель = ЭлементыФормы.КоманднаяПанельВерхНиз;
        ЭтаФорма.Высота = ШиринаПанели;
        КоманднаяПанель.Ширина = ЭтаФорма.Ширина - 10;
    Иначе
        ЭлементыФормы.Удалить(ЭлементыФормы.КоманднаяПанельВерхНиз);
        КоманднаяПанель = ЭлементыФормы.КоманднаяПанельПравоЛево;
        ЭтаФорма.Ширина = ШиринаПанели;
        КоманднаяПанель.Высота = ЭтаФорма.Высота - 10;
    КонецЕсли;    
    
    // заполним панель кнопками
    КоманднаяПанель.Лево = 0;
    КоманднаяПанель.Верх = 0;
    
    КПВерхНизВидимость = Ложь;
    КППравоЛевоВидимость = Ложь;
    //МассивКнопокАвтозапуска = Новый Массив;
    //ЗаполнитьКнопкиПанели(КоманднаяПанель, МассивКнопокАвтозапуска);
    //Если ПараметрТолькоОткрытьНастройки Тогда
    //    ОткрытьФормуНастроек();
    //    Отказ = Истина;
    //КонецЕсли;

    //Если Не Отказ Тогда
    //    // автозапуск
    //    Для Каждого Кнопка Из МассивКнопокАвтозапуска Цикл
    //        ПриНажатииКнопкиОбработки(Кнопка);
    //    КонецЦикла;
    //КонецЕсли;
    //ирОбщий.ПроверитьЗакрытьФормуПриОтказеЛкс(ЭтаФорма, Отказ);

        
    ПодготовитьИнструментыКОтображению();
    
    Если СтруктураСтандартныхНастроекАРМ.Свойство("ВидимостьКПВерхНиз", КПВерхНизВидимость) Тогда
        Если КПВерхНизВидимость Тогда
            ВывестиИнструментыНаКоманднуюПанель("КоманднаяПанельВерхНиз");
        КонецЕсли;     
    КонецЕсли;
    
    Если СтруктураСтандартныхНастроекАРМ.Свойство("ВидимостьКППравоЛево", КППравоЛевоВидимость) Тогда
        Если КППравоЛевоВидимость Тогда
            ВывестиИнструментыНаКоманднуюПанель("КоманднаяПанельПравоЛево");
        КонецЕсли;
    КонецЕсли;
    
    
    ИДФормыАРМ = Строка(Новый УникальныйИдентификатор);
    //СтруктураИДФорм.Вставить(ИДФормыПланирования,Форма);
    НоваяСтрокаТЗИД = ТЗИДФорм.Добавить();
    НоваяСтрокаТЗИД.ВызовИз = ЭтаФорма;
    НоваяСтрокаТЗИД.ИД = ИДФормыАРМ;
    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("МассивЗаказовКПередаче", Новый Массив);
    НоваяСтрокаТЗИД.ДополнительныеПараметры  = ДопПараметры;
    
    //ОписаниеОповещенияПланирование = Новый ОписаниеОповещения("ОповещениеОЗакрытииПланирование",ЭтаФорма);
    
    ЭтаФорма.КлючУникальности = ИДФормыАРМ;
    //Форма.ВладелецФормы = ЭтаФорма;
    //Форма.ЗакрыватьПриЗакрытииВладельца = Истина;
    ЭтаФорма.ДопПараметры = ДопПараметры;
    
КонецПроцедуры
26 polosov
 
15.09.21
16:16
НоваяСтрокаТЗИД.ВызовИз = ЭтаФорма - вот твое зло.
27 Droning1C
 
15.09.21
16:18
(26) Это сохранение ссылки на текущую форму в строку ТЗ. ТЗ является реквизитом формы. что тут такого? Реквизит формы умирает при ее закрытии
28 polosov
 
15.09.21
16:19
29 Droning1C
 
15.09.21
16:22
(26) !!!!! тЫ прав!
30 Droning1C
 
15.09.21
16:24
(26) Спасибо большое! А если в теории? Почему так?
31 polosov
 
15.09.21
16:25
32 Droning1C
 
15.09.21
16:29
(28) у меня там куча разных форм открываются. Причем перекрестно. И я логирую какая откуда и ключи. Буду пихать представления вместо ссылок, спасибо огромное еще раз всем! Особенно polosov!
33 polosov
 
15.09.21
16:31
(32) Лучше делать одну форму со страницами. Если конечно логика позволяет.
34 Droning1C
 
15.09.21
16:34
(33) у меня что-то типа ИР. Сборничек инструментария для планирования и запуска заказов в производство.
35 Droning1C
 
15.09.21
16:35
(33) Там очень много всего разнопланового и на форму со страницами не лезет, а если и залезет, то будет неудобно и некрасиво.
36 Kassern
 
15.09.21
16:59
(35) у диадока в этом плане более менее грамотно сделано в обработке)
37 Kassern
 
15.09.21
17:00
(36) там же при закрытии идет очистка кэша модулей, временного хранилища
38 Droning1C
 
15.09.21
18:02
(36) Спасибо, посмотрю, поучусь