Содержание
- Qt + COM (ActiveX) = Властелин упрвления сервером 1С предприятия
- Qaxbase error calling idispatch member item exception thrown by server
- Qaxbase error calling idispatch member item exception thrown by server
- Qaxbase error calling idispatch member item exception thrown by server
Доброго времени суток господа!
Хочется общаться с 1С сервером через COM, т.е. подключиться, посмотреть какие пользователи в базе, выбрать чего-нибудь, добавить пользователя, посмотреть текущие сеансы подключения к 1С серверу. В общем, хочется от определенных данных, например групп в AD, делать определенные действия в 1С.
Подскажите как это в Qt можно реализовать?
Например есть чудесный, скриптовый язык PowerShell, в нём можно релизовать следующее:
//подключаю ком объект
$connector = New-Object -ComObject “V82.ComConnector”
//подключаюсь к базе 1С
$connection = $connector.Connect(“Srvr=”“сервер1С”“;Ref=”“база”“;Usr=”“пользователь”“;Pwd=”“пароль”“;”)
//смотрим пользователей в базе
$users = Get-Property -comObj $connection -prName “ПользователиИнформационнойБазы”
Вроде разобрался как использовать COM соединение
Извиняюсь, господа, а от куда столько негатива и бреда? Какой вирус, какая зарплата, какой велосипед? Есть 1с, есть AD, связать группы пользователей AD + добавлять/удалять в 1с, может быть ещё какую-нибудь плюшку.
И причем вирус с гуи, если ни одного класса виджен и/или диалог не задейстовано?
зы Если по делу писать нечего, лучше не писать (или направить туда, где могут подсказать), а не бестолковофлудием заниматься.
Ошибка в том, что метод Connect именно ВОЗВРАЩАЕТ IDispatch* , через который и надо выполнять все дальнейшие действия с 1С.
V82.COMConnector это соединитель, а не соединение. Объект соединения возвращает его метод Connect.
В скрипте повершел правильно написано.
А вот с++ коде не так.
DmitrO
Спасибо за разъяснение! Но, что это за тип возвращаемый такой IDispatch* не могу понять.
Допустим можно сделать вызов и получить через методы querySubObject и dynamicCall данные QAxObject * и QVariant соответственно. Но блин про IDispatcher нет ни слова в типе возвращаемых данных http://qt-project.org/doc/qt-5.0/activeqt/qaxbase.html#querySubObject-2
Ладно, ОК. Создадим указатель на активикс объект с адресом на результат, который мы получим при вызове внутреннего метода 1С connect.
Через 30 сек после запуска вывалится всё та же ошибка!
QAxBase: Error calling IDispatch member Connect: Exception thrown by server
<. (172)>: . . . . .
. (. ): . . . . — ‘. ‘: <.
. _. (186)>: . . . . . .
. (. ): . . .
. . . .
Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception
Почему? Я же результат объекту передал!
DmitrO
Я в 12 сообщении тоже самое попробовал, и всё равно та-же ошибка :(, что Error calling IDispatch member Connect: Exception thrown by server
etc
Большую часть съедает платформа .NET (больше стони мегабайт (в то и две)) на которой собственно этот PowerShell и работает. Ну и + задержки самого скриптового языка.
А на C++ com при старте в поток, пока грузится тем временем к базе LDAP коннект и выборка юзверей из AD.
Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя небыло в справочнике пользователей, поэтому и не пускал 🙂
Теперь вот голову ломаю, как правильно список пользователей выбрать .
Тут вопрос не в том как можно, можно хоть на питоне, хоть на вбс, хоть на повершеле (и еще десятки других скриптовых обработчиков / и систем с компиляцией в «типо» байткод).
Вопрос в том, как это на Qt сделать правильно. (фанат GNU, C++ и т.д.).
Сейчас уже вопрос наверно не кутистам, а к 1сникам.
Подскажите пожалуйста, как правильно выбрать всех пользователей из справочника?
Например, захожу в конфигуратор — открыть конфигурацию
Слева есть список объектов и всего всего, есть пункт Справочники — Пользователи
Как правильно сделать NewObject чтобы получить ссылку на этих пользователей?
но в ответ ругается
[CPP]QAxBase: Error calling IDispatch member NewObject: Exception thrown by server
Help :
Connect to the exception(int,QString,QString,QString) signal to catch t
his exception[/CPP]
По коду 1001 я понял, что это отсутствие данного метода, собственно поэтому и ошибка Error calling IDispatch member NewObject что никакой указатель не вернулся.
Но если сделать
[CPP]QAxObject * ab = ac->querySubObject(«NewObject»,QAxObject::tr(«Справочники;»));[/CPP]
То какая то другая ошибка будет (кодировку не могу победить, извините), не 1001, т.е. как бы существует Справочники, но что-то не то вызываю.
Вопрос — как правильно сделать соединитель на Справочники.Пользователи и потом через метод String выбрать всех пользователей?
зы И ещё, если кто знает, подскажите пожалуйста, где можно посмотреть подробные логи действий на 1С сервере, ведь ошибка которая мне вопросиками отдается, должна же она где то на сервере храниться?!
Но блин получаю ошибку
QAxBase: Error calling IDispatch member NewObject: Bad parameter count
Т.е. как бы возвращается не указатель на менеджер пользователей, а что-то другое?
Делаю для того, чтобы потом GetUsers с объектом ab сделать.
2000$? Сам в свое время тыкал, но отказался от этой идеи.
А вот если нативную компоненту сделали бы. Это бы был бы шаг вперед..
Да нет, что то вы черезчур утрируете закрытость къюта
http://www.digia.com/ru/What-we-do/Qt/Qt-licensing/
Главное статично не линковать, да и всё. (было бы много проблем с лицензированием, кеды, влк и т.д. уже бы от къюта отказались бы)
Вопрос лицензирования конечно очень интересен, но хотелось бы по участвовать в дискуссиях по коннекту к 1С через COM средствами къюта
Источник
Qaxbase error calling idispatch member item exception thrown by server
Студент
Группа: Участник
Сообщений: 68
Регистрация: 12.1.2009
Пользователь №: 485
Репутация: 2
Привет.
Здесь столкнулся с такой заботой.
QAxObject *range = StatSheet->querySubObject( «Range(const QVariant&)»,QVariant(QString(«A1:B6»))); (выделяем диапозон для работы)
QAxObject *range = StatSheet->querySubObject( «Range(const QVariant&)»,QVariant(QString(«A1»))) (выделяем 1 ячейку)
QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&)»,QVariant(QString(«1»))) ( выделяем 1 ячейку(аналог Cells(1,1))
QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&)»,QVariant(QString(«2»))) (выделяем вторую ячейку (аналог Cells(1,2))
Но у меня есть таблица БД.В ней поля.СЛедовательно,должна соблюдаться структура при выводе данных в Эксель
1 поле 2 поле 3 поле 4 поле 5 поле
Но!Как мне обратиться скажем к Cells(2,2). или Cells(3,4). Причем это обязательно нужно сделать через цифры (Cells(X,Y) (X,Y- целочисленные указатели на ячейки))
Потому что через A1 нельзя вызывать(в таком случае будет слишком мудрено вызываться ячейка B1)
Хм. Ребят,подождите. Сейчас одна идейка возникла. Может написать
QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&,const QVariant&)»,QVariant(QString(«2»)),QVariant(QString(«1»)))
QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&;const QVariant&)»,QVariant(QString(«4»)),QVariant(QString(«8»)));
Пишет значение в ячейку D1(принял первый параметр равный 4) (((
Он почему то принимает только первый параметр,и всё.
Какие будут предложения?
Сообщение отредактировал abra — 24.3.2009, 19:46
Источник
Qaxbase error calling idispatch member item exception thrown by server
I am trying to access the elements of an Excel file (*xlsx extension) by using the class QAxObject, but my code crashes giving the above error when I call:
I am using Qt 5.7 on Windows 64 bit with MinGw. Any suggestion of what could be the problem? It seems like Worksheets is not a subobject of workbooks, but everyone is using that keyword to access the sheets of excel.
Thanks in advance
I would test with some VBA to see if it does like it.
Hi
This fails ( for me, even i added file at path)
QAxObject* workbook = workbooks->querySubObject(«Open (const QString&)», QString(«C:Qtex2.xlsx»));
so workbooks is NULL (hence you crash)
The workbook opening does not fail, indeed if I give him an inexistent file I receive an error telling me that file does not exists. SO the file is surely found, and if I remove the last line (quering for the workbooks) I have no errors.
I used both the working examples given in your links, trying also:
But the error is the same (Sheets instead of Worksheets)
@CBenussi
Did you try
QAxObject * workbooks = excel.querySubObject(«WorkBooks»);
workbooks->dynamicCall(«Add»);
QAxObject * workbook = excel.querySubObject(«ActiveWorkBook»);
QAxObject * worksheets = workbook->querySubObject(«WorkSheets»);
I just tried, same error.
@CBenussi
Hi ok.
I cant find any info on why it should not work.
I dont have office at home so can’t check if I can reproduce it.
Have you tried the same in VBA?
Update:
This works at work with office 2010.
it lists the sheets
1 «Sheet1»
2 «Sheet2»
3 «Sheet3»
Not working, but I think I understood what is the problem (it works with VBA though). When I open Excel from Qt programmatically, a window shows asking for Microsoft Office activation, then it is probably that which is blocking the access to the sheets:
I need to deactivate it in some way
Update: CAnnot find a way to load the screenshot, sorry. The window is titled: «this copy of microsoft office is not activated 2013», to go on I just need to click on «close» and everything is fine.
@CBenussi
Hi
Yes that could block automation as you can ask it to be hidden and in that way could
use non valid Excel if always hidden.
I tried it with 2 other pcs and both gave me list so it can work.
Just register it and it will shut up. 🙂
Alternativ u can get 2016 for 30 days
https://products.office.com/en-us/try
Update: CAnnot find a way to load the screenshot, sorry.
Источник
Qaxbase error calling idispatch member item exception thrown by server
Возникла пара вопросов:
1. Как вставить картинку в ячейку?
2. Как создать новый workbook и в нем sheet с заданным именем?
3. Как изменить формат представления данных в ячейке? (например, я ввожу число «5.2» — а отображается «5 февраля»)
4. Как изменить параметры страницы? (например, сделать лист альбомной ориентации, чтобы после вывода данных в excel пользователю в случае печати не нужно было ничего настраивать).
Если кто что знает, отпишитесь плиз )) Спасибо!
На VBA это будет так:
следовательно, делаем примерно так:
код не проверял, но думаю должен работать.
Если работает, то можно будет данный код добавить в вики, как и твой.
p.s. будет время приведу пример, как сделать остальные пункты.
Вспомнил что когда-то давно что-то писал на VBA. Вобщем, общая идея работы с ActiveQT — эта библиотека позволяет работать с любыми библиотеками/приложениями, поддерживающими COM. Список методов и свойств объектов можно посмотреть в tlb-хе соответствующего приложения (например, через OLEView). Если етсь *.tlh или idl-ник — можно и там напрямую через текстовые редакторы. В случае с Excel идеально помогает VBA. Запускаем Excel, жмем Alt+F11, пишем процедуру открытия книги например и там эксперементируем. По «F2» можно посмотреть список классов их методов и свойств. Выбираем метод — давим «F1», читаем как им пользоваться. Далее читаем документацию по функциям ActiveQt — querySubObject/dynamicCall/setProperty/property.
1. Как вставить картинку в ячейку?
На VBA будет так:
Пробовал переписать так:
не фурычит. pShape2 == NULL и картинка не грузица. В querySubObject если нужно вызывать функцию, нужно описать сигнатуру этой функции.. А сигнатура такая:
Я много как пробовал: не хотит пока. Че писать пока не понял (особенно насчет MsoTriState).
2. Как создать новый workbook и в нем sheet с заданным именем?
Создаем новую книгу (при этом совершенно необязательно что-то там открывать с диска)
Удалить листы можно так:
Новый лист создать можно так:
3. Как изменить формат представления данных в ячейке? (например, я ввожу число «5.2» — а отображается «5 февраля»)
На VBA так:
На ActiveQT чет не особо работает. Поэтому решил проблему так:
4. Как изменить параметры страницы? (например, сделать лист альбомной ориентации, чтобы после вывода данных в excel пользователю в случае печати не нужно было ничего настраивать).
Вот так можно задать границы области печати (и задать ориентацию (собсно ка ViGOur писал выше)):
Источник
Forum Updated on Feb 6th
This topic has been deleted. Only users with topic management privileges can see it.
-
I am trying to access the elements of an Excel file (*xlsx extension) by using the class QAxObject, but my code crashes giving the above error when I call:
QAxObject* excel = new QAxObject("Excel.Application"); excel->setProperty("Visible", false); QAxObject* workbooks = excel->querySubObject("WorkBooks"); QAxObject* workbook = workbooks->querySubObject("Open (const QString&)", QString("C:\Qt\ex2.xlsx")); QAxObject* sheet = workbook->querySubObject("Worksheets");
I am using Qt 5.7 on Windows 64 bit with MinGw. Any suggestion of what could be the problem? It seems like Worksheets is not a subobject of workbooks, but everyone is using that keyword to access the sheets of excel.
Thanks in advance
-
Hi
What version of Excel?
Seems to be from Office 2013 and later
https://msdn.microsoft.com/en-us/library/office/ff194464.aspxI would test with some VBA to see if it does like it.
-
@CBenussi
Hi
This fails ( for me, even i added file at path)
QAxObject* workbook = workbooks->querySubObject(«Open (const QString&)», QString(«C:Qtex2.xlsx»));so workbooks is NULL (hence you crash)
Did you use this sample ?
https://wiki.qt.io/Using_ActiveX_Object_in_QtThere is also
https://forum.qt.io/topic/1840/working-with-excel-sheet -
Hi,
The workbook opening does not fail, indeed if I give him an inexistent file I receive an error telling me that file does not exists. SO the file is surely found, and if I remove the last line (quering for the workbooks) I have no errors.
I used both the working examples given in your links, trying also:
QAxObject *excel; QAxObject *wbooks; QAxObject *book; QAxObject *sheets; QAxObject *cell; excel = new QAxObject("Excel.Application"); excel->setProperty("Visible", false); wbooks = excel->querySubObject("Workbooks"); book = wbooks->querySubObject("Open (const QString&)", "C:\Qt\ex2.xlsx" ); sheets = book->querySubObject("Sheets");
But the error is the same (Sheets instead of Worksheets)
-
@CBenussi
Did you try
QAxObject * workbooks = excel.querySubObject(«WorkBooks»);
workbooks->dynamicCall(«Add»);
QAxObject * workbook = excel.querySubObject(«ActiveWorkBook»);
QAxObject * worksheets = workbook->querySubObject(«WorkSheets»); -
Hi,
I just tried, same error…
-
@CBenussi
Hi ok.
I cant find any info on why it should not work.
I dont have office at home so can’t check if I can reproduce it.Have you tried the same in VBA?
Update:
This works at work with office 2010.
it lists the sheets
1 «Sheet1»
2 «Sheet2»
3 «Sheet3»QAxObject* excel = new QAxObject("Excel.Application"); excel->setProperty("Visible", true); QAxObject* workbooks = excel->querySubObject("WorkBooks"); QAxObject* workbook = workbooks->querySubObject("Open (const QString&)", QString("e:\ex2.xlsx")); if (!workbook) { qDebug() << "workbook NULL"; return; } QAxObject* worksheets = workbook->querySubObject("WorkSheets"); if (!worksheets) { qDebug() << "sheet NULL"; return; } int intCount = worksheets->property("Count").toInt(); for (int i = 1; i <= intCount; i++) { int intVal; QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", i); qDebug() << i << worksheet->property("Name").toString(); } }
-
Not working, but I think I understood what is the problem (it works with VBA though). When I open Excel from Qt programmatically, a window shows asking for Microsoft Office activation, then it is probably that which is blocking the access to the sheets:
I need to deactivate it in some way
Update: CAnnot find a way to load the screenshot, sorry. The window is titled: «this copy of microsoft office is not activated 2013», to go on I just need to click on «close» and everything is fine.
-
@CBenussi
Hi
Yes that could block automation as you can ask it to be hidden and in that way could
use non valid Excel if always hidden.
I tried it with 2 other pcs and both gave me list so it can work.Just register it and it will shut up.
Alternativ u can get 2016 for 30 days
https://products.office.com/en-us/tryUpdate: CAnnot find a way to load the screenshot, sorry.
Use external site. like postimg.org or any other.
-
@CBenussi
Yep you should fix that with a valid key OR
if it was a trial, you can rearm it for 30 days
https://technet.microsoft.com/en-us/library/dn385362.aspx
-
20th November 2013, 17:50
#1
QAxBase exception signal
Hi all,
I’m using QAxBase objects (ms excel automation) and would like to connect the QAxBase::exception(int,QString,QString,QString) signal to manage errors but i can’t …
So, i’ve opened «qaxbase.h» source code and found :
#ifdef qdoc
Q_SIGNALS:
void signal(const QString&,int,void*);
void propertyChanged(const QString&);
void exception(int,const QString&,const QString&,const QString&);
#endif
To copy to clipboard, switch view to plain text mode
of course «qdoc» is not defined … so, what am i missing ?
I have hardly googled, read the docs, searched on this forum but i found nothing …
(I think there’s no link between the «#define qdoc» in the code and the «QDoc» html doc generator tool, so googling on qdoc is’nt an easy task but maybe i’m wrong)I’m using qt4 (same results with 4.7.4 and 4.8.5)
I’ve put «CONFIG += qaxcontainer» in my pro file and nothing more.
My code compile and runs well …Please give me an answer even if its stupid (i’m really good at stupid mistakes ) or a link to the answer i havn’t been able to find.
thanks in advance
-
25th November 2013, 18:04
#2
Re: QAxBase exception signal
a little up please …
I don’t find how to edit my post, so, i continue it
There’s no answers, tell me if i’m doing anything wrong (am i violating forum rules ? maybe the bold text is provocating, i thought it would permit a faster read of my problem … please just tell me)Anyway, another formulation of my problem would be :
Why the signals of QAxBase object are declared within a «#ifdef qdoc» directive ?
thanks again
-
11th December 2013, 12:38
#3
Re: QAxBase exception signal
another up … (two weeks later, i can, can’t i?)
ok, let’s assume the exception signal is just a joke and just exists in documentation but not in the code !
it’s just defined in qaxbase.h to generate documentation and make custommer trust active Qt is worth the bsd licence !please tell me i’m wrong and criticize my disrespectful behavior !
-
12th December 2013, 00:17
#4
Re: QAxBase exception signal
Your lack of response could be because few people use ActiveQt, and fewer have tried to use your particular corner of it.
Exactly how are you trying to connect?
Are the unspecified errors at compile, link, program run time, or during ActiveX operations?
What are the exact errors?
Can you post a complete, small example that demonstrates the problem?
-
12th December 2013, 12:06
#5
Re: QAxBase exception signal
thank you so much for your answer !!!!
Your lack of response could be because few people use ActiveQt, and fewer have tried to use your particular corner of it.
I know that the good guys uses dumpcpptool. But, I’m not doing anything particular, just using a Qt class and connecting one of it signals to the slot of another Qt class … nothing more than connecting the «clicked()» signal of a QPushButton …
Exactly how are you trying to connect?
well, normally : connect(QAxObject *,SIGNAL(exception(int, QString, QString, QString), this, SLOT(myErrorHandleSlot(int, QString, QString, QString))
but when typing, the autocompletion didn’t work, so, I checked my includes and includepath, …. everything were OK. So , at last, I’ve gone to the qaxbase.h source code and found the exception signal defined within an #ifdef qdoc preprocessor statement … so, of course, i cannot connect. I could let this connect line code, it will compile but during runtime i’ll get an error like «no such signal …» (using Qt4)Are the unspecified errors at compile, link, program run time, or during ActiveX operations?
What are the exact errors?The errors are during ActiveX operations but are normal errors which can occur using excel, for instance, trying to write two cells within one, …
my code compile and runs well, but, when an operation fails, an explicit message outputs on console and says «connect to the exception signal to retrieve these message»As I can’t connect to this signal, I just can know that the operation fails but not why and i can’t show an explicit message to the user.
Can you post a complete, small example that demonstrates the problem?
Of course : http://www.itest.fr/Download/AxExcel.zip
The connection with exception signal is in xlapp.cpp file, line 38 :
XLApp::XLApp(QObject *parent) :
_xl(NULL),_workBooks(NULL)
{
_xl = new QAxWidget("Excel.Application");
// QObject::connect(_xl,SIGNAL(exception(int,QString,QString,QString)),
// this,SLOT(saveLastError(int,QString,QString,QString)));
setVisible(false);
_workBooks = _xl->querySubObject("Workbooks");
}
To copy to clipboard, switch view to plain text mode
Running the program should output an error message containing the informations of the exception signal i’d like to retrieve when executing the line 16 of main.cpp :
book->saveAs("Not*saveable");
To copy to clipboard, switch view to plain text mode
it should ouput these wonderfull lines :
error code = 1004
Source = Microsoft Excel
Description = A really really good description but in french in my case … (something like «file access error. Check the folder exists, …»)
-
12th December 2013, 15:01
#6
Re: QAxBase exception signal
Sorry, i should have made a really simpler example (still complete and compilable):
project file, let’s say «AxExcel.pro»
QT += core gui
TARGET = TestAxExcel
TEMPLATE = app
CONFIG += qaxcontainer
SOURCES += main.cpp
HEADERS += exceptreceiver.h
To copy to clipboard, switch view to plain text mode
file exceptreceiver.h :
#ifndef EXCEPTRECEIVER_H
#define EXCEPTRECEIVER_H
#include <QObject>
#include <QDebug>
class ExceptReceiver : public QObject
{
Q_OBJECT
public:
public slots:
{
qDebug()<<errorCode<<source<<description<<help;
}
};
#endif // EXCEPTRECEIVER_H
To copy to clipboard, switch view to plain text mode
file main.cpp :
#include <QApplication>
#include <QAxObject>
#include "exceptreceiver.h"
int main(int argc, char *argv[])
{
QAxObject xlObj("Excel.Application");
ExceptReceiver er;
if(QAxObject *wbs = xlObj.querySubObject("Workbooks"))
{
if(QAxObject *workbook = wbs->querySubObject("Add()"))
{
workbook->dynamicCall("SaveAs(const QString &)","not*saveable");
delete workbook;
}
delete wbs;
}
return 0;
}
To copy to clipboard, switch view to plain text mode
Console output when running this program (in french but it shouldn’t be important) :
QAxBase: Error calling IDispatch member SaveAs: Exception thrown by server
Code : 1004
Source : Microsoft Excel
Description: Fichier inaccessible. Essayez l'une des op?rations suivantes?:
? V?rifiez que le dossier sp?cifi? existe.
? V?rifiez que le dossier dans lequel se trouve le fichier n'est pas en lecture seule.
? V?rifiez que le nom du fichier ne comporte les caract?res suivants: | < > ? [ ] : ni *
? V?rifiez que le nom du fichier ou du chemin ne d?passe pas 218 caract?res.
Help : xlmain11.chm
To copy to clipboard, switch view to plain text mode
Last edited by thomas@itest; 12th December 2013 at 15:17.
Reason: added console output
-
24th September 2015, 15:09
#7
Re: QAxBase exception signal
damn…I hit the same problem to you.
Have you fixed it buddy?Could you mind telling me how to slove it?
thanks all…
-
24th September 2015, 15:33
#8
Re: QAxBase exception signal
No, I gave up with Qt ActiveX !
Wrapping COM objects is not a huge work even if msdn documentation is a pain in the …
-
18th December 2017, 12:05
#9
Re: QAxBase exception signal
There is my code, It maybe help.
if (!xlObj->isNull())
{
xlObj->blockSignals(false);//<------- important
connect(xlObj, SIGNAL(signal(QString, int, void*)), SLOT(signal(QString, int, void*)));
}
To copy to clipboard, switch view to plain text mode
In .h file
public Q_SLOTS:
void signal(const QString& name, int argc, void* argv);
To copy to clipboard, switch view to plain text mode
in .cpp file
void XXXXX::signal(const QString& name, int argc, void* argv)
{
VARIANTARG *params = (VARIANTARG*)argv;
if (name.startsWith("BeforeNavigate2("))
{
IDispatch *pDisp = params[argc - 1].pdispVal;
VARIANTARG URL = *params[argc - 2].pvarVal;
VARIANTARG Flags = *params[argc - 3].pvarVal;
VARIANTARG TargetFrameName = *params[argc - 4].pvarVal;
VARIANTARG PostData = *params[argc - 5].pvarVal;
VARIANTARG Headers = *params[argc - 6].pvarVal;
bool *Cancel = params[argc - 7].pboolVal;
}
}
To copy to clipboard, switch view to plain text mode
20.07.13 — 05:29
Доброго времени суток господа!
Хочется общаться с 1С сервером через COM, т.е. подключиться, посмотреть какие пользователи в базе, выбрать чего-нибудь, добавить пользователя, посмотреть текущие сеансы подключения к 1С серверу. В общем, хочется от определенных данных, например групп в AD, делать определенные действия в 1С.
Подскажите как это в Qt можно реализовать?
Например есть <s>чудесный, скриптовый язык</s> PowerShell, в нём можно релизовать следующее:
//подключаю ком объект
$connector = New-Object -ComObject “V82.ComConnector”
//подключаюсь к базе 1С
$connection = $connector.Connect(“Srvr=”“сервер1С”“;Ref=”“база”“;Usr=”“пользователь”“;Pwd=”“пароль”“;”)
//смотрим пользователей в базе
$users = Get-Property -comObj $connection -prName “ПользователиИнформационнойБазы”
Вроде разобрался как использовать COM соединение
#include <QApplication>
#include <QtCore/QObject>
#include <ActiveQt/QAxObject>
#include <iostream>
#include <oleauto.h>
#include <QDebug>
int main(int argc, char *argv[])
{
HRESULT r = OleInitialize(0);
if (r != S_OK && r != S_FALSE)
{qWarning(«Qt:(error %x)»,(unsigned int)r);}
QCoreApplication a(argc, argv);
QAxObject ax(«V82.COMConnector»,0);
qDebug()<<ax.dynamicCall(«Connect(«Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»)»);
//Здесь не выполняется выборка, потому что верхнее соединение уже разорвано
QAxObject *query = ax.querySubObject(«NewObject(QString)», («ПользователиИнформационнойБазы»));
}
Если посмотреть логи 1С сервера, то происходит успешная авторизация, но через 2 секунды происходит разрыв. Почему??? Ведь я объект не удаляю!!!
Так-же можно отписываться о идеях здесь http://www.cyberforum.ru/qt/thread925124.html или здесь http://qt-project.org/forums/viewthread/29235/
1 — 20.07.13 — 08:14
А чем, мон шер, Вас штатные возможности не прельщают? Нафуя городить велосипед с шестиугольными колесами? Или надо оправдать зарплату?
2 — 20.07.13 — 08:14
экономия на лицензиях
3 — 20.07.13 — 08:16
вирус пишешь?
4 — 20.07.13 — 09:16
(3) ага с ГУИком
5 — 20.07.13 — 11:18
Извиняюсь, господа, а от куда столько негатива и бреда? Какой вирус, какая зарплата, какой велосипед? Есть 1с, есть AD, связать группы пользователей AD + добавлять/удалять в 1с, может быть ещё какую-нибудь плюшку.
И причем вирус с гуи, если ни одного класса виджен и/или диалог не задейстовано?
зы Если по делу писать нечего, лучше не писать (или направить туда, где могут подсказать), а не бестолковофлудием заниматься.
6 — 20.07.13 — 11:20
mselling_ru
И кстати, соединение COM полноценно ест 1 ключ лицензии как положено.
7 — 20.07.13 — 11:36
Ошибка в том, что метод Connect именно ВОЗВРАЩАЕТ IDispatch* , через который и надо выполнять все дальнейшие действия с 1С.
V82.COMConnector это соединитель, а не соединение. Объект соединения возвращает его метод Connect.
В скрипте повершел правильно написано.
А вот с++ коде не так.
8 — 20.07.13 — 11:38
А закрывается оно потому, что возрвщенное Методом Connect значение уходит из области видимости, и вероятно смарт указатель релизится.
Модератор
9 — 20.07.13 — 12:57
а я ющу пример нативной ВК на QT, потому что самому разбираться лень
Модератор
10 — 20.07.13 — 12:57
ищу
12 — 20.07.13 — 14:06
DmitrO
Спасибо за разъяснение! Но, что это за тип возвращаемый такой IDispatch* не могу понять.
Допустим можно сделать вызов и получить через методы querySubObject и dynamicCall данные QAxObject * и QVariant соответственно. Но блин про IDispatcher нет ни слова в типе возвращаемых данных http://qt-project.org/doc/qt-5.0/activeqt/qaxbase.html#querySubObject-2
Ладно, ОК. Создадим указатель на активикс объект с адресом на результат, который мы получим при вызове внутреннего метода 1С connect.
QAxObject * ax = new QAxObject(«V82.COMConnector»);
QAxObject * ac = ax->querySubObject(«Connect(«Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»)»);
Через 30 сек после запуска вывалится всё та же ошибка!
QAxBase: Error calling IDispatch member Connect: Exception thrown by server
Code : 16389
Source : V82.COMConnector.1
Description: {????????????????????????(36)}: ???????????? : 1C-Qt-B
ot-vostok ?? ??? ?????? ? ??????????? ?????????????. ???????? ?????? ??? ???????
??? ???????????? ? ??????????.
{???????????.????????????????????????.??????(172)}: ?????? ??? ?????? ?????? ???
?????? (????????): ?????? ??? ?????????? ??????????? — ‘????????????’: {????????
???.????_???????????.??????(186)}: ?????? ??? ????????? ???????? ???????? ??????
??? (?????????????????????????????????????): ??????? ????????? ?????????????????
???? ???????? ????????? ??????
Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception
Почему? Я же результат объекту передал!
13 — 20.07.13 — 14:09
Главное на 1С сервере происходит коннект -> авторизация(успешная) и через 3 сек -> завершение. Т.е. всё логично, как будто разрушается область выполнения запроса connect в функции ax->querySubObject. Но блин, адрес то отдан, почему разрушается то?
14 — 20.07.13 — 14:28
(13)
IDispatch базовый com интерфейс.
15 — 20.07.13 — 14:32
Блин, уважаемые, если знаете киньте примерчиком из десяточки строк. Я понимаю почти логику, почти понимаю что нужно. Но блин всё почти …
16 — 20.07.13 — 14:36
А зочем Qt?
Товарищ все плюшки по общению с сервером приложения на AutoIt написал. Минимум знаний, минимум времени, максимум КПД
17 — 20.07.13 — 15:16
arsik
есть уже что-то подобное на PowerShell. Но время выполнения длинное и памяти ОЗУ ест много. Хочется бинарно, быстро и стандартно.
18 — 20.07.13 — 15:29
мне кажется либо так:
QAxObject * ac = ax->querySubObject(«Connect(«Srvr=172.0.0.100;Ref=base1;Usr=1C-Bot;Pwd=56q;»)»);
либо так:
QAxObject * ac = ax->querySubObject(«Connect(«Srvr=»»172.0.0.100″»;Ref=»»base1″»;Usr=»»1C-Bot»»;Pwd=»»56q»»;»)»);
либо так:
QAxObject * ac = ax->querySubObject(«Connect(const QString&)», «Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»);
19 — 20.07.13 — 15:51
(17) большую часть памяти съедает COM объект, а больше всего времени уходит на его создание. Разве нет?
20 — 20.07.13 — 15:55
(19)+ точнее даже не на создание а на соединение с базой.
21 — 20.07.13 — 16:29
DmitrO
Я в 12 сообщении тоже самое попробовал, и всё равно та-же ошибка :(, что Error calling IDispatch member Connect: Exception thrown by server
etc
Большую часть съедает платформа .NET (больше стони мегабайт (в то и две)) на которой собственно этот PowerShell и работает. Ну и + задержки самого скриптового языка.
А на C++ com при старте в поток, пока грузится тем временем к базе LDAP коннект и выборка юзверей из AD.
22 — 20.07.13 — 16:36
(21) тогда понятно. Хотя задержки скриптового языка не особо я думаю велики. А так если бы интерейс не нужен то можно было бы на простом vbscript реализовать. Тогда по памяти было бы не особо затратно. Но параллельности конечно там нет.
23 — 21.07.13 — 16:00
Уважаемые господа, больше идей как правильно прикрутить соединение Connect 1С к QAxObject нет?
24 — 23.07.13 — 10:55
Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя небыло в справочнике пользователей, поэтому и не пускал
Теперь вот голову ломаю, как правильно список пользователей выбрать …
QAxObject * ax = new QAxObject(«V82.COMConnector»);
QAxObject * ac = ax->querySubObject(«Connect(«Srvr=172.0.0.100;Ref=jkh02;Usr=1C-Bot;Pwd=qaz;»)»);
QAxObject * ab = ac->querySubObject(«CreateObject(ПользователиИнформационнойБазы)»);
Так не получается, говорит что нет такого метода :/. Может кто-нибудь подскажет, где можно описание этих волшебных методов посмотреть?
25 — 23.07.13 — 23:59
(17) сравнил, то же мне. автоайти и повершелл.
Автоайти — это по сути конструктор скриптов, никаких потерь на загрузку нетфраемворка нет. Можно гуи слепить там же.
26 — 24.07.13 — 02:14
Тут вопрос не в том как можно, можно хоть на питоне, хоть на вбс, хоть на повершеле (и еще десятки других скриптовых обработчиков / и систем с компиляцией в «типо» байткод).
Вопрос в том, как это на Qt сделать правильно. (фанат GNU, C++ и т.д.).
Например, насколько я понял для коннектов внутри базы есть метод NewObject() ?! (с 1с программированием совсем не работал). Тогда не понятно, почему не выходит сделать
QAxObject * ab = ac->querySubObject(«NewObject»,QString::fromLocal8Bit(«ПользователиИнформационнойБазы»));
27 — 25.07.13 — 06:14
Сейчас уже вопрос наверно не кутистам, а к 1сникам.
Подскажите пожалуйста, как правильно выбрать всех пользователей из справочника?
Например, захожу в конфигуратор — открыть конфигурацию
Слева есть список объектов и всего всего, есть пункт Справочники — Пользователи
Как правильно сделать NewObject чтобы получить ссылку на этих пользователей?
[CPP] QAxObject * ax = new QAxObject(«V82.COMConnector»);
QAxObject * ac = ax->querySubObject(«Connect(«Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»)»);
QAxObject * ab = ac->querySubObject(«NewObject»,QAxObject::tr(«Справочники.Пользователи;»));[/CPP]
но в ответ ругается
[CPP]QAxBase: Error calling IDispatch member NewObject: Exception thrown by server
Code : 1001
Source : 1C:Enterprise 8.2.15.319
Description: ??? ?? ????????? ‘???????????.????????????;’
Help :
Connect to the exception(int,QString,QString,QString) signal to catch t
his exception[/CPP]
По коду 1001 я понял, что это отсутствие данного метода, собственно поэтому и ошибка Error calling IDispatch member NewObject что никакой указатель не вернулся.
Но если сделать
[CPP]QAxObject * ab = ac->querySubObject(«NewObject»,QAxObject::tr(«Справочники;»));[/CPP]
То какая то другая ошибка будет (кодировку не могу победить, извините), не 1001, т.е. как бы существует Справочники, но что-то не то вызываю.
Вопрос — как правильно сделать соединитель на Справочники.Пользователи и потом через метод String выбрать всех пользователей?
зы И ещё, если кто знает, подскажите пожалуйста, где можно посмотреть подробные логи действий на 1С сервере, ведь ошибка которая мне вопросиками отдается, должна же она где то на сервере храниться?!
28 — 25.07.13 — 06:22
(5) Хм… А я наоборот — из 1С рулю составом группы домена… И ничё, всё работает.
См. тут: v8: Как из 1С добавить пользователя в группу домена
29 — 26.07.13 — 08:39
Пытаюсь сделать
QAxObject * ab = ac->querySubObject(«NewObject(«InfoBaseUsersManager»);»);
Это как ab = ac.InfoBaseUsersManager по 1совски
Но блин получаю ошибку
QAxBase: Error calling IDispatch member NewObject: Bad parameter count
Т.е. как бы возвращается не указатель на менеджер пользователей, а что-то другое?
Делаю для того, чтобы потом GetUsers с объектом ab сделать.
30 — 26.07.13 — 08:53
(0,9) Блок ActiveQt — входит только в платную версию Qt, вы честны и ее уже купили ~2000$? Сам в свое время тыкал, но отказался от этой идеи.
А вот если нативную компоненту сделали бы. Это бы был бы шаг вперед..
31 — 26.07.13 — 08:56
Почему это он платный? Скачал обычную сборку, установил, указал CONFIG += qaxcontainer и динамически линкую. Вроде ничего не нарушил.
32 — 26.07.13 — 09:21
Молодой человек(Стаж: 6 дней) Раньше так было.
Сейчас с Digia запутаней http://qt-project.org/legal.html
33 — 27.07.13 — 17:17
Да нет, что то вы черезчур утрируете закрытость къюта
http://www.digia.com/ru/What-we-do/Qt/Qt-licensing/
Главное статично не линковать, да и всё. (было бы много проблем с лицензированием, кеды, влк и т.д. уже бы от къюта отказались бы)
Вопрос лицензирования конечно очень интересен, но хотелось бы по участвовать в дискуссиях по коннекту к 1С через COM средствами къюта
Для заблудших душ и для поиска гугла, ссылки где ребята мало-мальски разжевали чайнику 1С как правильно делать:
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=615219#615219
http://www.cyberforum.ru/1c/thread928446.html