Имя: Пароль:
1C
1С v8
Как из внешней компоненты на С++ вызвать функцию Сообщить 1с 8?
0 ProgAL
 
12.07.15
17:25
Добрый день. Есть внешняя компонента на с++ builder. Все что нужно работает нормально. Использование метода AddError интерфейса IErrorLog вызывает утечки памяти. Поэтому хочется вызывать стандартную функцию Сообщить. Как это сделать, если в наличии есть указатель, получаемый в функции Init. Тип указателя IDispatch* .
1 H A D G E H O G s
 
12.07.15
18:51
(0)
1) Сохранить указатель в переменную pconnect:IDispatch;
2) При первом callasfunc

получить свойство appdispatch этого указателя.

delphi, например, сделает invoke за вас вооот так
appdispatch:=OleVariant(pconnect).appdispatch;
и сохранить в какую - то переменную типа OleVariant;
3) Когда надо вызывать все что угодно через appdispatch, например

appdispatch.Сообщить()

appdispatch.NewObject('СписокЗначений')
и хранить в переменных класса OleVariant (Для Дельфи конечно). Если прозрачная обертка с OleVariant не поддерживается вашими псевдоязыками - писать обертки над GetIDsOfName(), Invoke() и.т.д. Пример обертки можно взять в Дельфи, хехехе.
2 H A D G E H O G s
 
12.07.15
18:54
(0) "вызывает утечки памяти."

Как узнал?
3 ProgAL
 
12.07.15
19:26
(2) Сделал 5000 вызовов вывода строки длиной 50 символов подряд. Увидел прирост памяти в диспетечере задач. После закрытия окна сообщений она особо не уменьшилась. Каждый последующий вывод приводит к увеличению памяти, занимаемой процессом 1с.

Спасибо что Вы появились и ответили. appdispatch я получаю успешно и многое работает, например,

Variant pVar;
IDispatch* pAppDispatch;

V_VT(&pVar) = VT_DISPATCH;
V_DISPATCH(&pVar) = pConnect;

pAppDispatch = pVar.OlePropertyGet("AppDispatch");


// работает создание элемента справочника
Variant AAA = Variant(pAppDispatch).OlePropertyGet("Справочники").OlePropertyGet("Номенклатура").OleFunction("СоздатьЭлемент");
AAA.OlePropertySet("Наименование", "Создано из вн. компоненты");
AAA.OleFunction("Записать");


Но вот когда я пытаюсь выполнить команду языка 1С "Выполнить"

Variant(pAppDispatch).OleFunction("Execute", TextCommamd);
вылезает "функция не найдена".  Пробовал и "Message" вместо "Execute".
4 ProgAL
 
12.07.15
19:27
Вместо OleFunction пробовал OleProcedure.
5 H A D G E H O G s
 
12.07.15
19:36
(4) Запилить глобальный модуль с функцией

Функция ВыполнитьВычисление(Выражение,Параметр) Экспорт
    Возврат Вычислить(Выражение);
КонецФункции
6 ProgAL
 
12.07.15
20:13
(5) Спасибо. Так уже что-то шевелится. Застрял на несоответствии типов. А все же другого способа нету, чтобы не менять текст конфигурации.
7 H A D G E H O G s
 
12.07.15
20:13
(6) Не использовать Выполнить()
8 ProgAL
 
12.07.15
20:39
(7) Это понятно, а как именно достучаться до Сообщить ?
9 H A D G E H O G s
 
12.07.15
20:41
(8)
Variant(pAppDispatch).OleFunction("Сообщить");

не?
10 ProgAL
 
12.07.15
20:54
(9) Нет, я уже про это писал и ОлеФункшн и ОлеПроцедуре, и анлийское название Сообщить Message не работают.
11 Serginio1
 
12.07.15
20:54
(9) Я помню в семерке сообщить можно было только через
ExecuteBatch
EvalExpr из-под разных пользователей
12 ProgAL
 
12.07.15
20:55
(11) Это я уже нагуглил давно. В 8-ке такого нет. И примера на ИТС ни одного нет. Даже на Делфи примера нет.
13 H A D G E H O G s
 
12.07.15
21:08
(10) А что пишет?
У меня Дельфи вполне себе находит этот метод с dispID=51
14 ProgAL
 
12.07.15
21:14
Variant(pAppDispatch).OleProcedure("Сообщить", TextCommamd.c_str());
   Variant(pAppDispatch).OleFunction("Сообщить", TextCommamd.c_str());

Теперь и у меня работает в 2 вариантах OleProcedure  и  OleFunction. Чудеса. Всем спасибо.
15 ProgAL
 
12.07.15
21:15
Variant(pAppDispatch).OleFunction("Execute", TextCommamd);
ошибка была во втором параметре, в ошибочном случае AnsiString, а в правильном char*. Извините, кто зря потратил время. Спасибо.
16 H A D G E H O G s
 
12.07.15
21:17
Вы всегда старадали, страдаете и будете страдать со строками, c++ ники. Это вам кара за экзогенный, негуманноидный язык.
17 Serginio1
 
12.07.15
21:17
(0) Впринципе можешь создать внешний отчет из которого и дергать методы
v8: Получение ссылки на элемент ПВХ через COM-коннектор
18 ProgAL
 
12.07.15
21:21
(17) Ага, спасибо.
19 ProgAL
 
12.07.15
21:23
Кстати, память жрется. Субъективно меньше - 2 Мбт на 5000 сообщить, а через AddError было 3,5 - 4 Мбт.
Но просто текст на штатном языке

Для Ы = 1 По 5000 Цикл
        
        Сообщить(" ввввввввввввввввввввввваааааааааааааааааааааааааааааааффффффффффффффффффффффффффффддддддддддддддпппппппп");
        
    КонецЦикла;    

тоже жрет примерно в таком же размере как получилось сейчас.
20 DmitrO
 
12.07.15
21:26
Через IDispatch приложения доступны только функции глобального контекста.
А,
Выполнить - это оператор;
Вычислить - встроенная функция;
поэтому их и нельзя вызвать.
21 H A D G E H O G s
 
12.07.15
21:30
(19) Поставь eurecalog и прекрати страдать.
100500 что у тебя утечка в другом месте
22 ДенисЧ
 
12.07.15
22:03
(16) А шо, длину строки хранить вне самой строки - это эндогенно?
23 H A D G E H O G s
 
12.07.15
22:14
(22) правильно хранить

число ссылок на строку
ее длину
завершать ее нулем (чтобы передавать в c++ winapi)
давать указатель на переменную как указатель на начало области данных строки (опять таки для winapi)
корректно преобразовывать ansistring <-> widestring

Все это Дельфи делает само, автоматом, прозрачно из коробки настолько прекрасно, что остальное кажется кажется какахой мамонта.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn