|   |   | 
| 
 | Закрытие обработки через неосновную форму обработки | ☑ | ||
|---|---|---|---|---|
| 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) Спасибо, посмотрю, поучусь     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |