Имя: Пароль:
1C
1C 7.7
v7: Глюки внешней компоненты 1с++ (1cpp.dll)
,
0 victuan1
 
05.02.18
12:38
1c++ версии 3.2.4.3

Имеется класс, реализованный в теле внешней обработке. Внешняя обработка также содержит Таблицу, на которой находится какой-то АктивИкс (неважно какой).

Известно, что можно использовать Таблицу в классе 1С++, используя метод:

ИсхТабл.ИсходнаяТаблица("Таблица", Путь);

Но при этом происходит падение 1С. Если из таблицы убрать АктивИкс падения не будет.
Также его не будет если Таблица находится в файле mxl.

Есть способы решения этой проблемы?
1 victuan1
 
05.02.18
12:41
Сварганил примерчик, демонстрирующий эту ошибку
запускаем обработку ТестТаб.ert, она создает класс из обработки ТестТабКласс.ert и пытается обратиться к таблице.
2 victuan1
 
05.02.18
12:41
3 victuan1
 
05.02.18
13:56
Подыму.
4 big
 
05.02.18
14:11
Инициализация АктивИкс была разная в разных версиях. Сейчас постараюсь найти у себя.
5 big
 
05.02.18
14:16
(4) + не, похоже, что я не в теме ((
6 victuan1
 
05.02.18
18:17
Я знаю, что иногда на форум заходят те, кто могут разъяснить этот момент, поэтому буду изредка приподымать тему.
7 sttt
 
06.02.18
02:19
Попробуй этим http://www.1cpp.ru/docum/icpp/html/ActiveX.html
разместить ActiveX
8 sttt
 
06.02.18
02:20
Текст модуля бы тестовой обработки
9 victuan1
 
06.02.18
08:19
(8) Во втором посте я выложил комплект для повторения глюка.
10 victuan1
 
06.02.18
08:19
И тестовую обработку и тестовый класс 1с++
11 victuan1
 
06.02.18
14:48
ап
12 victuan1
 
07.02.18
12:03
ап
13 Злопчинский
 
07.02.18
14:23
все, пипец.
спецов не осталось.
пора переходить на снеговика.
там тряхомудии не меньше, но хоть в куче погрустить можно...
14 mehfk
 
07.02.18
15:01
(0) Идешь в журналы винды, наблюдаешь там что-то такое:

Имя сбойного приложения: 1cv7s.exe, версия: 7.70.0.27, метка времени: 0x4573fcd8
Имя сбойного модуля: MFC42.DLL, версия: 6.6.8063.0, метка времени: 0x57898e13
Код исключения: 0xc0000005
Смещение ошибки: 0x000a7ff4
Идентификатор сбойного процесса: 0x3b24
Время запуска сбойного приложения: 0x01d3a008ee061a6e
Путь сбойного приложения: C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe
Путь сбойного модуля: C:\Windows\SYSTEM32\MFC42.DLL
Идентификатор отчета: 2017276b-9d46-4eab-818d-ad35708da99e
Полное имя сбойного пакета:
Код приложения, связанного со сбойным пакетом:

Запускаешь 1с-ину под отладчиком, ставишь бряк на относительный адрес 0x000a7ff4. Выполняешь действия, приводящие к падению, срабатывает бряк, смотришь откуда пришло, разбираешься как это обойти.
16 mehfk
 
07.02.18
15:10
17 victuan1
 
07.02.18
15:14
(16) Ну и что дальше делать?
Я так понимаю, что падает у всех в одном и том же месте.
Вопрос, как исправить
18 mehfk
 
07.02.18
15:15
До конца читал?

Запускаешь 1с-ину под отладчиком, ставишь бряк на относительный адрес 0x000a7ff4. Выполняешь действия, приводящие к падению, срабатывает бряк, смотришь откуда пришло, разбираешься как это обойти.
19 victuan1
 
07.02.18
15:32
(18) Эх. Как ставить бряк на относительный адрес? Я ведь одинэсник (в плохом смысле этого слова).
Я для того и выложил тест, чтобы кто-то умный как ты (в хорошем смысле), посмотрел бы откуда пришло и как обойти.
20 victuan1
 
07.02.18
15:34
Ссылка на тест https://yadi.sk/d/fJnOoVYN3S6mwJ
Наблюдается у всех при любых условиях.
1с++ юзал 3.2.4.3 (на 3.2.2.0 то же самое)
21 mehfk
 
07.02.18
15:49
Мне жалоко тратить на это время при том, что поолжительного результата может и не быть. Я попробовал наудачу в вышеприведенной функции первый условный переход на безусловный заменить, но ошибка случилась в другой функции.

Ну и ты же сам нашел решение, пользуйся им:
>> Также его не будет если Таблица находится в файле mxl.
22 victuan1
 
07.02.18
15:54
(21) Сделай исключение, потрать 10 минут времени - тест у меня минимальный - четыре строчки кода. Если сабжа у тебя не будет - возмещу потраченное время.

Решение с хмл не нравится - хочется единый файл, а не кучу хмл-ок в придачу.
23 victuan1
 
07.02.18
17:06
Я так понял, что копать нужно 1С++.
Может есть обходные пути.
А может авторы этого проекта могут мне помочь, исправив баг.
24 Chieftain
 
07.02.18
18:00
ЕМНИП, аналогичная проблема была с какими-то из свойств ячеек макета.
Попробуй обойти проблему, так как крайне маловероятно, что этим будет кто-то заниматься.
Открой форму из класса, пусть она тебе ПриОткрытии вернет нужную таблицу. Или работай с таблицей в самой форме ПриОткрытии.
25 victuan1
 
07.02.18
18:56
(24) А как в ПриОткрытии?
Класс запускается в начале сеанса работы и существует до его конца.
Пользователь периодически нажимает кнопку, которая обращается к классу, передает параметры и выводит на экран отчет с этими параметрами.
26 victuan1
 
07.02.18
19:22
Сейчас глупость спрошу..
Как открыть форму из класса?
27 victuan1
 
07.02.18
22:32
Ап, что ли.
28 Chieftain
 
08.02.18
00:10
(26) ПолучитьПуть()+ОткрытьФорму(), сам скомпонуешь.
Реализуй стандартную процедуру ПриОткрытии в модуле реализации класса и он отработает. Единственное здесь - методы и переменные, заполненные в классе не равны им же в методах формы. Обращайся к ним через переданный в параметре объект класса.
29 victuan1
 
08.02.18
06:23
30 victuan1
 
08.02.18
07:00
(28) Нет, всё равно валится.
Перенес метод ИсходнаяТаблица в проц. ПриОткрытии класса.
Но теперь валится на методе Вывести, который оставил в "теле" класса.

Новый тест для воспроизведения ошибки: https://yadi.sk/d/Cm15VVsq3SC8YN

Какие будут следующие предложения?
31 victuan1
 
08.02.18
07:42
Немного подумал и проблему решил - пусть таблица целиком инициализируется и выводится на печать в проц. ПриОткрытии.
Я же ведь могу ее вызывать сколь угодно и когда угодно.

По сути, получается что один и тот же файл ert используется одновременно и как класс и как обычная внешняя обработка с печ.формами.

Главное, конечная цель достигнута - решить задачу, используя один файл.
Спасибо Chieftain за мозговой штурм.
32 victuan1
 
08.02.18
07:46
Хотелось бы еще решить проблему, описанную 1C 7.7: Ключи запуска (посты 16-18).
[quote] проект 1с++ для 1С 7.7 еще жив?
Есть некоторые баги в "движке", хочется поправить.

Например, падает отладчик и 1С: предприятие, если при трассировке модуля класса (реализованного в теле внешней ert) в табло отладчика укажешь имя переменной, которой не существует в текущем контексте.

При отладке обычных модулей 1С в этих случаях падения не происходит, а просто пишется:
"Ошибка в выражении!"
[/quote]

Но пока не могу создать тестовый класс с минимальным кодом.
Ошибка воспроизводится на моем большом классе, на мелких тестовых этого сабжа нет... :(
33 Chieftain
 
08.02.18
14:14
(31) Ну именно об этом я и говорил :)
34 Волшебник
 
модератор
08.02.18
14:21
(13) В восьмёрке реализовано ООП.