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