Имя: Пароль:
1C
1С v8
1c создание запроса в объекте и передача его в 1с
0 club-dance
 
24.01.12
16:21
Требуется создать запрос в com объекте и передать его 1с.
Вот код в c#:
<pre>
Type t = Type.GetTypeFromProgID("V82.COMConnector");
obj = System.Activator.CreateInstance(t);
               
dynamic conObj = obj.Connect(@"File=c:\Users\Владимр\Documents\1C\Урок\Запросы;");

dynamic myQuery = conObj.newObject("Запрос");

myQuery.Текст = "ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, СУММА(ВложенныйЗапрос.Закупки) КАК Закупки, СУММА(ВложенныйЗапрос.Продажи) КАК Продажи ИЗ (ВЫБРАТЬ ПриходнаяТовары.Номенклатура КАК Номенклатура, ПриходнаяТовары.Количество КАК Закупки, 0 КАК Продажи ИЗ Документ.Приходная.Товары КАК ПриходнаяТовары ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ РасходнаяТовары.Номенклатура, 0, РасходнаяТовары.Количество ИЗ Документ.Расходная.Товары КАК РасходнаяТовары) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура";
myQuery.УстановитьПараметр("ДатаОтчета", MyMessage);
returnQuery = myQuery.Выполнить();
</pre>

вот код вызова в 1с:
<pre>
ПрогИД = "AddIn.MyQuery";
ПодключитьВнешнююКомпоненту(ПрогИД);
МояБиблиотека = Новый COMОбъект(ПрогИД);
Запрос1 = МояБиблиотека.ShowMessage(1);
</pre>

в переменную запрос1 передается comобъект а мне нужно чтоб передавалось РезультатЗапроса
1 Fram
 
24.01.12
16:23
а зачем из 1с вызвать сторонний ком объект, который вызывает 1с?
2 Buster007
 
24.01.12
16:27
тип результатЗапроса существует в приемнике?
3 club-dance
 
24.01.12
16:40
Fram это делается для скрытия запроса!
Buster007 существует.. но там много побочной информации..
4 Skylark
 
24.01.12
16:59
Не получится... Пока они не лягут, ничего у них не получится! (с)
5 H A D G E H O G s
 
24.01.12
17:03
(3) Хочешь я тебе этот запрос вытащу, ну минут за 10?
6 Skylark
 
24.01.12
17:04
А если попробовать использовать к переменной запрос1 методы обхода как у обычного результата запроса? Прокатит?
7 1с-кин
 
24.01.12
17:04
(0) не получится НИКОГДА!
По COM 1с всегда получает COM-же объекты - именно по этому ставка НДС18 в одной базе и ставка НДС18 - разные объекты, которые надо получать каждую из своей базы.
8 1с-кин
 
24.01.12
17:04
(6) нужно сразу получать готовый РезультатЗапроса.
9 H A D G E H O G s
 
24.01.12
17:09
(7) Именно поэтому при написании обычных ВК и надо использовать Appdispatch, любезно предоставленный 1С входящим параметром в процедуре Init()
10 Skylark
 
24.01.12
17:18
(9) Ну не тяни, поделись знанием. В базу знаний добавим.
11 club-dance
 
24.01.12
17:35
H A D G E H O G s а как мне тогда скрыть текст запроса?
12 1с-кин
 
24.01.12
17:41
99) ну это опять на милости 1с - ладно хоть к диспатчу дали обратится ))
13 H A D G E H O G s
 
24.01.12
17:46
(10) Я на C++ языках ВК не писал.
В Дельфи это делается так:
function AddInObject.Init(pConnection:IDispatch):HResult;stdcall;
// 1С вызывает эту функцию при инициализации (старте) компоненты
begin
 i1cv8 := pConnection; // Сохраняем ссылку, AppDispatch пока нельзя получать.
 ........
 Init:=S_OK;
end;

В момент вызова метода компоненты получим AddDispatch

function AddInObject.CallAsFunc(lMethodNum:Integer;var pvarRetValue:OleVariant;var paParams:PSafeArray):HResult;stdcall;
{ Здесь 1С выполняет код внешних функций }
begin
 try
vk_object.AppDispatch:=OleVariant(vk_object.iConnect).AppDispatch;
//вызов метода, бла бла бла
.....

vk_object.AppDispatch:=Unassigned;
14 H A D G E H O G s
 
24.01.12
17:46
vk_object.AppDispatch:=OleVariant(vk_object.iConnect).AppDispatch;
заменить на
AppDispatch:=OleVariant(i1cv8).AppDispatch;
15 H A D G E H O G s
 
24.01.12
17:49
(11) Зашифруй каким-нибудь простейшим xor с автоключом.
16 club-dance
 
24.01.12
17:49
H A D G E H O G s дай какие-нибудь ссылки на конкретные примеры!
17 Serginio1
 
24.01.12
17:52
(0) Можешь создать и передать как результат функции. Если не нужны обратные вызовы ВК ненужна в 8 ке
18 club-dance
 
24.01.12
17:55
Serginio1 я и передаю как результат функции, но он мне возвращает comобъект, а мне надо тип результатзапроса
19 Serginio1
 
24.01.12
18:05
(18) Да тупанул. Маршалинга небудет. Тогда AppDispatch
Можешь взять http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019

public void InitFrom1C(object Object1C)

       {
dynamic Диспетчер=Object1C;
AppDispatch=Диспетчер.Диспетчер;

            }
Или переопределяй в Init
20 Serginio1
 
24.01.12
18:06
AppDispatch=Диспетчер.AppDispatch;
21 Serginio1
 
24.01.12
18:09
Да в свое время делал ВК которая возвращает это AppDispatch, который передавал в методы обыкновенных COM объектов. Но технология ВК для Объектов Автоматизации поддерживающих ITypeInfo и выполняет все его свойства и методы через IlanguageExtender интересней