Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Закрытие обработки через неосновную форму обработки

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

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

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

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

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

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

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

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

    //сначала будем анализировать сохраненные настройки и применять их.

    //добавить настройку вариантов отчетов и настроек отчетов по умолчанию.

    
    ШиринаПанели = 24;
    //Положение = "";


    
    //Если СтруктураСтандартныхНастроекАРМ.Свойство("ПоложениеПрикрепленногоОкна", Положение) Тогда

    //    ЭтаФорма.ПоложениеПрикрепленногоОкна = Положение;

    //КонецЕсли;

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

    КоманднаяПанель.Лево = 0;
    КоманднаяПанель.Верх = 0;
    
    КПВерхНизВидимость = Ложь;
    КППравоЛевоВидимость = Ложь;
    //МассивКнопокАвтозапуска = Новый Массив;

    //ЗаполнитьКнопкиПанели(КоманднаяПанель, МассивКнопокАвтозапуска);

    //Если ПараметрТолькоОткрытьНастройки Тогда

    //    ОткрытьФормуНастроек();

    //    Отказ = Истина;

    //КонецЕсли; 


    //Если Не Отказ Тогда

    //    // автозапуск

    //    Для Каждого Кнопка Из МассивКнопокАвтозапуска Цикл

    //        ПриНажатииКнопкиОбработки(Кнопка);

    //    КонецЦикла;

    //КонецЕсли;

    //ирОбщий.ПроверитьЗакрытьФормуПриОтказеЛкс(ЭтаФорма, Отказ);


        
    ПодготовитьИнструментыКОтображению();
    
    Если СтруктураСтандартныхНастроекАРМ.Свойство("ВидимостьКПВерхНиз", КПВерхНизВидимость) Тогда
        Если КПВерхНизВидимость Тогда
            ВывестиИнструментыНаКоманднуюПанель("КоманднаяПанельВерхНиз");
        КонецЕсли;     
    КонецЕсли;
    
    Если СтруктураСтандартныхНастроекАРМ.Свойство("ВидимостьКППравоЛево", КППравоЛевоВидимость) Тогда
        Если КППравоЛевоВидимость Тогда
            ВывестиИнструментыНаКоманднуюПанель("КоманднаяПанельПравоЛево"); 
        КонецЕсли; 
    КонецЕсли;
    
    
    ИДФормыАРМ = Строка(Новый УникальныйИдентификатор);
    //СтруктураИДФорм.Вставить(ИДФормыПланирования,Форма);

    НоваяСтрокаТЗИД = ТЗИДФорм.Добавить();
    НоваяСтрокаТЗИД.ВызовИз = ЭтаФорма;
    НоваяСтрокаТЗИД.ИД = ИДФормыАРМ;
    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("МассивЗаказовКПередаче", Новый Массив);
    НоваяСтрокаТЗИД.ДополнительныеПараметры  = ДопПараметры;
    
    //ОписаниеОповещенияПланирование = Новый ОписаниеОповещения("ОповещениеОЗакрытииПланирование",ЭтаФорма);

    
    ЭтаФорма.КлючУникальности = ИДФормыАРМ;
    //Форма.ВладелецФормы = ЭтаФорма;

    //Форма.ЗакрыватьПриЗакрытииВладельца = Истина;

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.