Имя: Пароль:
1C
1С v8
Почему не загружается внешняя компонента?
,
0 Prog1
 
naïve
01.10.24
10:52
Добрый вечер!
Решил написать элементарную внешнюю компоненту на C++ (VisualStudio 2019).
конфигурация на управляемых формах.

Версия 1С - 8.3.8, учебная (как я понял, в учебной можно использовать внешние компоненты - нельзя COM-соединения).

Подключаю внешнюю компоненту в 1С так:

	DLL = "d:\ExtComp1.dll";
	Имякомпоненты = "CAddInNative";
	КомпонентаПодключена = ПодключитьВнешнююКомпоненту(DLL, Имякомпоненты, ТипВнешнейКомпоненты.Native);
	если не КомпонентаПодключена тогда
		сообщить("Ошибка подключения компоненты.");
		возврат;
	конецесли;



Получаю сообщение об ошибке - ошибка подключения...
Как выяснить, в чем дело ?

Файл DLL существует.
Мой класс C++ - за основу взял template 1C:

 class CAddInNative : public IComponentBase
{
...



Возникли следующие проблемы и вопросы:

1) Можно ли получить какое-то расширенное сообщение об ошибке - что не нашла 1С, что ей не понравилось ?

2) Правильно ли я понимаю, что мой класс в C++ "CAddInNative" - это и есть
имя компоненты ?

3) Все, что я предлагаю 1С для загрузки - это DLL.
Макета с двоичными данными, манифеста, других файлов я не создавал.
Достаточно ли только файла DLL ?

Помогите, пожалуйста, двинуться далее в сторону решения проблем, что и где посмотреть - пока не знаю, как ее сдвинуть с места.
1 Kongo2019
 
28.09.24
19:42
(0) procmon глянь
2 lEvGl
 
гуру
29.09.24
16:19
правильно сделанную компоненту если не установлена, надо сначала установить, потом подключить, логика вроде такой

Если Не Подключить() Тогда
Установить();
Подключить();
КонецЕсли;

файл таскать за собой не надо, общий макет с типом ДвочиныеДанные, ее туда
ну а сама компонента на ++ в ИТС написана, больше чем там есть нигде найти пожет и получится, но незачем

Можно ли получить какое-то расширенное сообщение об ошибке - что не нашла 1С, что ей не понравилось ?

Можно студией подключить отладку к нужному процессу, даст отладочный указатель в проекте ++ов. Но вряд ли вам поможет описание ошибки про маршалинг, например

Правильно ли я понимаю, что мой класс в C++ "CAddInNative" - это и есть
имя компоненты ?

если не ошибаюсь, то имя интерефейса ПрогИД это ее имя. Обычно класс и ПрогИД называются одинаково, но могут быть и фантазии

Макета с двоичными данными, манифеста, других файлов я не создавал.

а что так
3 osa1C
 
29.09.24
21:03
Сообщить("Ошибка подключения компоненты.");
замени на
Сообщить("Ошибка подключения компоненты.", СообщениеОбОшибке());
и прочитай расширенное сообщение об ошибке
   Там будет много что понятно, но если останутся вопросы пиши
4 Garykom
 
гуру
29.09.24
21:03
5 Garykom
 
гуру
29.09.24
21:03
(0) вместо учебной используй обычную платформу и лицензии для разработчиков
6 osa1C
 
29.09.24
21:08
(5) за такое по ушам не бьют? Где он возьмет не учебную платформу?
Купит? Не за дорого... Раз учебная - значит студент
7 Garykom
 
гуру
29.09.24
21:14
(6) скачает там же где лицензия для разработчика
https://infostart.ru/1c/articles/1844839/
8 H A D G E H O G s
 
30.09.24
00:28
(0) attach to process, или как там у вас, ищем твой 1cv8c.exe или rphost.exe, подключаемся. Dll должна быть скомпилена в режиме debug. Точку останова в vs studio в dllmain, если его нет - реализовать. Смотрим - заходит или нет. Если не заходит - procmon и смотрим куда стучится 1С и какой отлуп получает от windows.
P.s.
Если под rphost будете подключатся - долго на точке останова не сидите, пройдет секунд 10 и rmmngr посчитает rphost зависшим и срубит его, надо все делать быстро. Ну или каких нибудь виндовых привилегий отладки добавить, не разбирался.
9 Prog1
 
naïve
30.09.24
22:15
Всем спасибо за участие!
Проблему удалось решить - компонента подключается успешно.
10 Kongo2019
 
30.09.24
22:52
(9) Но нам ты об это конечно уже не расскажешь, да?
11 H A D G E H O G s
 
30.09.24
22:52
(9) Вот это именно то, что встречаешь на форумах и хочется выхватить маузер и ехать искать автора такого поста, что спросить:

1. Как ты это решил и в чем была проблема.
2. Что вами движет, когда вы бодро рапортуете об успехе и не пишите пункт 1?
12 Волшебник
 
01.10.24
08:55
(9) Как решили?
13 Prog1
 
naïve
01.10.24
21:15
Проблема была в том, что не только внешнюю компоненту, но и DLL я создавал впервые.
Поэтому не озаботился экспортом ф-ций, которые должна экспортировать компонента.
Как только создал соответствующий файл DEF, экспорт стал реально осуществляться и _ПодключитьВнешнююКомпоненту_ отработала в моем варианте нормально.
Т.е. если совсем не фурычит, сначала надо проверить, что комп включен - в смысле, DLL реально экспортирует то, что нужно.

Еще далее чуть-чуть помучился с типом свойства компоненты (ее внутреннее поле). Заявил ее тип - VTYPE_INT, присваивал ей значение в C++, но 1C в упор не видела его. Видимо не совсем разобрался с 64 или 32-р. переменными.

Сделал для себя вывод, что лучше объявлять не "обобщенный" VTYPE_INT, а конкретный int-тип, например, VTYPE_I4, VTYPE_I2 и т.п.

Учебная версия внешние компоненты поддерживает - здесь проблем не оказалось.
14 Волшебник
 
01.10.24
22:10
(13) Спасибо, что доложили.

Мэтрам достаточно?
2 + 2 = 3.9999999999999999999999999999999...