Имя: Пароль:
1C
1С v8
Время жизни обработки
,
0 DrLekter
 
27.03.13
16:25
Возник такой вопрос: если в некой форме выполнить код "Обработки.<ИмяОбработки>.Создать()" и как-то воспользоваться полученным объектом, то когда он будет уничтожен (явно это сделать вроде бы нельзя)? При закрытии клиента, при закрытии вызвавшей обработку формы или при завершении вызвавшей процедуры? (Вариант - НИКОГДА :)))) )
1 ДенисЧ
 
27.03.13
16:27
Когда выйдет из Scope
2 Kreont
 
27.03.13
16:29
Разве ="" не убьет?
3 Reset
 
27.03.13
16:30
(0) Смотря как воспользоваться
Если корректно, то будет уничтожен при уничтожении переменной
4 Reset
 
27.03.13
16:30
(3) или явно при (2)
5 DrLekter
 
27.03.13
23:36
Переменная, объявленная в процедуре, умирает с её завершением? Тогда я спокоен :)
Ну и за (2) спасибо - как бы очевидно, но не додумался )
6 Rovan
 
гуру
28.03.13
08:27
(5) а если бы это было не так, то что бы стал делать ? -
программировать с плохим чувством о зависшей памяти под обработкой ??
7 vde69
 
28.03.13
08:38
старый баян

запускаем обработку, в нем стартуем обработчик ожидания, обработку убиваем, а обработчик работает :)
8 mzelensky
 
28.03.13
08:47
(5) ну ток наверное не ="", а =NULL
9 ДенисЧ
 
28.03.13
08:48
(8) Во первых, не NULL, а неопределено, а во-вторых, хоть 10, хоть Справочники.Контрагенты.СоздатьГруппу()...
10 mzelensky
 
28.03.13
08:48
(7) Ну так обработчик ожидания это совсем другое.

Кстати, а сама процедура обработчика находится где?!
11 mzelensky
 
28.03.13
08:49
(9) почему не NULL ?! Вроде NULL более "пустое" ,чем Неопределено
12 mikecool
 
28.03.13
08:51
(11) щас Ненавижу 1С тебе из бани ответит...
13 ДенисЧ
 
28.03.13
08:52
(11) NULL только из запроса можно получить :-)
14 mikecool
 
28.03.13
08:53
(13) да ладно..
15 mzelensky
 
28.03.13
08:56
(13) кто мне запрещает сделать так:

Чс=1;
Сч=NULL;

Переменная "СЧ" должна быть "убита".


Значение типа Неопределено используется прежде всего как значение по умолчанию (незаданное значение) для полей с составным типом. Например, если есть реквизит, который имеет составной тип, включающий СправочникСсылка.Товары и СправочникСсылка.Материалы, то значением реквизита по умолчанию будет Неопределено. Так же это значение используется и в других случаях для обозначения неуказанного значения.

Значение типа Null используется при работе с таблицами прикладных объектов. Оно обозначает отсутствие значения поля в выборке. Прежде всего оно используется в результатах запросов выполняющих левое или правое соединение. Поля невыбранных записей таблиц участвующих в таких соединениях будут иметь значение Null. Кроме того, значение типа Null будет иметь, например, реквизит иерархического справочника для элементов-групп, если в метаданных указано, что этот реквизит используется только для элементов не являющихся группами.

Честно, не вижу протеворечий в убивании переменной через NULL!
16 ДенисЧ
 
28.03.13
08:58
(15) Я ж тебе говорю - убивай через что угодно, главное - этой переменной новое значение присвоить. Тогда gc пробежится в своё время и зачистит.
17 mzelensky
 
28.03.13
08:58
(15) а если уж идти от "СИ" (на котором собственно 1С-ка и написана), то там НЕТ такого как "НЕОПРЕДЕЛЕНО" и переменные убиваются именно через "NULL" (ну это я так, для справки...думаю все местные это и так знают).

А поэтому можно сделать гипотетический вывод, что правильнее убивать через "NULL"
18 mzelensky
 
28.03.13
09:01
Я всегда, для себя, понимал так:
Неопределено - стирает значение переменной, но при этом в памяти все же что-то висит (т.е. по сути сама переменная все еще существует), а NULL вроде как должен полность убирать переменную из памяти.

Как бы ток это проверить :(
19 ДенисЧ
 
28.03.13
09:02
(17) в СИ вообще неправильно убивать объекты присваиванием другого значения. Там нужно явно вызывать очистку :-)

Если ты напишешь
char* mystr = malloc(10);
mystr = nul; //или как там оно пишется

то ты получишь утечкку памяти.ю

А вот в шарпе или других языках с gc - убивать можно, как я говорю и повторяю в третий раз, присваиванием любого другого значения.
20 ДенисЧ
 
28.03.13
09:02
(18) Хватит нести антинаучные бредни.
21 mzelensky
 
28.03.13
09:03
(20) просто интересно.
22 НафНаф
 
28.03.13
09:04
какая разница когда? у вас все равно деструкторов нет
23 mzelensky
 
28.03.13
09:06
(20) (22) вот что в памяти висит, когда переменной присваиваешь значение "неопределено" ?! Ведь какое-то пространство в памяти переменная все-равно занимает?!
24 mzelensky
 
28.03.13
09:07
(19) и кстати, на сколько я помню СИ, то в (19) ты сделал ссылку на некую переменную. А потом убил ее. Т.е. убил не саму переменную, а именно ссылку на нее.

Хотя может я просто забыл СИ
25 НафНаф
 
28.03.13
09:15
А = Обработки.Моё.Создать();
Б = А;
А = Неопределено; //разве память под обработку освободилась? нет конечно!
26 ДенисЧ
 
28.03.13
09:16
(24) Я сделал не только ссылку (точнее указатель), но и выделил под неё место.
27 mzelensky
 
28.03.13
09:18
(25) не совсем понял примера.

СОздал обработку. Засуну лв одну переменную, а потом приравнял другой и после убил первую.

В чем фишка?!
28 НафНаф
 
28.03.13
09:20
(27) в том, что обработка все еще жива и память освободиться не может
а вообще какая разница когда? этот процесс практически неуправляем
не думаю, что как только ссылок нет на область, то сразу освобождается память, это не рационально
29 ДенисЧ
 
28.03.13
09:25
(28) не сразу, а с периодичностью цикла gc
30 mzelensky
 
28.03.13
09:27
это можно отнести в раздел

"НЕИЗВЕЕЕДАНННННОЕ !!!"

И в конце с припиской "Бу-ГА-ГА"
31 DrLekter
 
28.03.13
20:11
(6) ну не просто беспокоился бы, а подумал, как обойтись без вызова обработки )
(7) годный изврат :)
32 YHVVH
 
28.03.13
20:28
Не надо извращаться над 1с