Имя: Пароль:
1C
1C 7.7
v7: 1С++. Не уничтожается объект класса при закрытии формы
0 zelenyj_ogurec
 
12.06.22
09:37
Добрый день!

Продолжаю "воевать" с 1С7.7, 1С++, FormEx.
Обнаружилась очень странная ошибка.

Есть тестовый класс "Т_Тест", он очень простой. В нем есть только конструктор и деструктор.
Для отладки в конструкторе и в деструкторе этого класса просто выдается сообщение.

Дальше я опишу два сценария создания объекта этого класса.
Один из них работает корректно, второй - нет. Хотя во втором способе вроде бы все сделано правильно.

1) Первый сценарий использования объекта этого класса. Этот вариант работает.
В модуле формы какого-либо документа (например "Неподтвержденная заявка") делаем переменную "мТест".
Затем в тексте модуля создаем объект класса (в самом низу модуля после всех процедур):
[code]
мТест = СоздатьОбъект("Т_Тест");
[/code]

Входим в пользовательский режим 1С, открываем и закрываем документ.
По отладочным сообщениям из конструктора и деструктора класса видно, что при открытии документа объект создается, а при закрытии документа - объект уничтожается.
Все отлично.

2) Второй сценарий использования объекта - глючит.

Дупустим, я не хочу напрямую создавать объект класса.
Я хочу вызывать создание объекта из специального класса, который назову "Т_Фабрика".
Делаем класс "Т_Фабрика", который будет создавать все нужные объекты.
Объект этого класса создается в глобальном модуле и храниится в переменной глобального модуля "глФабрика".
В этом классе есть вот такая простая функция:

[code]
Функция СоздатьОбъектТест () Экспорт
    лОбъект = СоздатьОбъект("Т_Тест");
    Возврат лОбъект;
КонецФункции
[/code]

Теперь в модуле формы документа создаем объект класса "Т_Тест" с помощью нашей "фабрики":

[code]
мТест = глФабрика.СоздатьОбъектТест();
[/code]

Проверяем.
После запуска 1С при открытии документа объект создается.
Но после закрытия документа этот объект не уничтожается, его деструктор не срабатывает!
Деструктор срабатывает только когда закрывается 1С.

Это какая-то ошибка? Если это ошибка, то чья это ошибка? 1С или 1С++?
1 Злопчинский
 
12.06.22
09:43
а если создание перенести в ПриОткрытии() - чисто интересно
2 zelenyj_ogurec
 
12.06.22
09:47
(1) не помогает
3 zelenyj_ogurec
 
12.06.22
09:48
В ходе экспериментов выяснилось следующее.

Ошибка скорее всего связана с тем, что глФабрика - это гобальная переменная.
И при создании в ней объекта "Т_Тест" ссылка на этот объект как-то "залипает" в модуле Фабрики.
Хотя явных ссылок на "Т_Тест" в модуле фабрики нигде нету!
И пока объект глФабрика "живет", он держит какую-то неявную ссылку на "мТест".
4 zelenyj_ogurec
 
12.06.22
10:03
Как бы связатся с разработчиками 1С++, чтобы они помогли разобраться.
Где их найти?
Или это уже все заброшено?
5 Злопчинский
 
12.06.22
10:10
на форуме 1С++
или лучше здесь отдельную ветку с проблеой и тестовым примером
6 Злопчинский
 
12.06.22
10:11
(4) заброшено практически.
Стюардесса, хоть и красивая - но мертвая. Откапывают только по необходимости.
ну или пользуют если некрофилы...
7 zelenyj_ogurec
 
12.06.22
10:43
(5) >> на форуме 1С++

Сделал там тоже такую же тему.

>> или лучше здесь отдельную ветку с проблеой и тестовым примером

Так вот эта тема и есть.
Вот пример:
https://yadi.sk/d/Z3yHcqu4hL3CAA
8 zelenyj_ogurec
 
12.06.22
10:43
В примере две обработки.
Первая обработка создает объект сама напрямую.
Вторая обработка создает объект через глобальную "Фабрику".
9 Djelf
 
13.06.22
09:31
(8) Это старая проблема: https://www.1cpp.ru/forum/YaBB.pl?num=1247569443
Возвращай созданный объект через параметр функции, т.е. глФабрика.СоздатьОбъектТест(мТест);
10 zelenyj_ogurec
 
14.06.22
11:36
(9) Спасибо!

А может быть еще что-нибудь подскажете вот по этому вопросу?
1С-7.7. Создать специальное окошко (всегда наверху)
11 Djelf
 
14.06.22
13:12
(10) Форму 1С так не выведешь, АЛьФ же пытался с плавающей шаманить.
Как ты сам убедился, ничего из этого не вышло, а чтобы работало нужно очень долго ковырять в бинарнике что и как там в клюшках внутри работает.
Но я подозреваю что тебе подойдет вот это: https://www.1cpp.ru/forum/YaBB.pl?num=1193602020
12 zelenyj_ogurec
 
14.06.22
17:43
(11) Ответил в теме про специальное окошко.
Чтобы не путать обсуждаемый вопрос.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn