Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
1

Qt + COM (ActiveX) = Властелин упрвления сервером 1С предприятия

18.07.2013, 14:24. Просмотров 3237. Ответов 10
Метки нет (Все метки)

Доброго времени суток господа!
Хочется общаться с 1С сервером через COM, т.е. подключиться, посмотреть какие пользователи в базе, выбрать чего-нибудь, добавить пользователя, посмотреть текущие сеансы подключения к 1С серверу. В общем, хочется от определенных данных, например групп в AD, делать определенные действия в 1С.
Подскажите как это в Qt можно реализовать?

Например есть чудесный скриптовый язык PowerShell, в нём можно релизовать следующее:
C++
1
2
3
4
5
6
//подключаю ком объект
$connector = New-Object -ComObject “V82.ComConnector//подключаюсь к базе 1С
$connection = $connector.Connect(“Srvr=”“сервер1С”“;Ref=”“база”“;Usr=”“пользователь”“;Pwd=”“пароль”“;)
//смотрим пользователей в базе
$users = Get-Property -comObj $connection -prName “ПользователиИнформационнойБазы”


Вроде разобрался как использовать COM соединение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    #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);
        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 секунды происходит разрыв. Почему??? Ведь я объект не удаляю!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2013, 14:24
Ответы с готовыми решениями:

Взаимодействие с сервером ActiveX компонента
Hello All !!! Возник следующий вопрос. Есть Web сайт, в который встроен ActiveX элемент. При...

Ошибка при запуске ActiveX: 'Невозможно создание объекта сервером программирования объектов'
ситуация: есть мой ActiveX (написан на Visual Basic 6.0) работающий на клиенте, создается так: ...

Произошла ошибка связи в приложении с сервером "Microsoft Access" OLE или элементом управления ActiveX
Произошла ошибка связи в приложении &quot;Microsoft Access&quot; с сервером OLE или элементом управления...

Властелин Колец: Битва за Средиземье 2 не запускается
Скачал игру,установил,смонтировал,но игра на долю секунды запускается(чёрный экран) и сразу как...

10
Эксперт С++
1933 / 1045 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
18.07.2013, 14:26 2
потому что приложение завершается...
делайте return a.exec() в конце main-а
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
18.07.2013, 14:49  [ТС] 3
Это вывод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 t
his exception
QVariant(Invalid)
QAxBase::dynamicCallHelper: NewObject(QString): No such property in {2b0c1632-a1
99-4350-aa2d-2aee3d2d573a} [unknown]
        Candidates are:
QObject(0x0)
Это код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QtCore/QObject>
#include <ActiveQt/QAxObject>
#include <QAxBase>
#include <iostream>
#include <oleauto.h>
#include <QDebug>
#include <QString>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    HRESULT r = OleInitialize(0);
    QAxObject ax("V82.COMConnector",0);
    qDebug()<< ax.dynamicCall("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
    qDebug()<< ax.querySubObject("NewObject(QString)", ("ПользователиИнформационнойБазы"));
 
    return a.exec();
}
А в логах 1с сервера, всё так-же Начало -> через 1сек Аутентификация -> через 3 сек Завершение. Не пойму с чего 1с решает, что я сессию хочу завершать ...

зы "потому что приложение завершается...
делайте return a.exec() в конце main-а "
Тут не в ретурне дело, ведь до конца программы есть qDebug()<< ax.querySubObject("NewObject(QString)", ("ПользователиИнформационнойБазы")); который в любом случае должен выполнится, перед завершением ...

зызы Очень хотелось бы консультации/рекомендации от человека, который через COM соединение работал в Qt, а лучше через библиотечку 1ски
0
Эксперт С++
1933 / 1045 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
18.07.2013, 14:58 4
добавьте:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#ifdef Q_WS_WIN
#include <clocale>
#endif
//--------------------------------------------------------------------------------------------------
int main(int argc, char * argv[]) {
    QCoreApplication a(argc, argv);
    
    setlocale(LC_ALL, "rus");
    QTextCodec *winCodec = QTextCodec::codecForName("Windows-1251");
    QTextCodec::setCodecForTr(winCodec);
    QTextCodec::setCodecForCStrings(winCodec);
делу не поможет, но хоть будет понятно на что ругается...
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
19.07.2013, 08:04  [ТС] 5
На оф. Qt форуме мужичек решил проблему используя QAxWidget

Решил сделать так-же:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <oleidl.h>
#include <QAxWidget>
#include <QAxObject>
#include <clocale>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
     setlocale(LC_ALL, "rus");
    ::CoInitialize(NULL);
    QAxWidget ax;
    QVariant ac;
    Widget w;
    w.show();
    ax.setControl("V82.COMConnector");
    ac = ax.dynamicCall("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
    w.ui->textEdit->insertPlainText(ac.toString());
    
    return a.exec();
}
Вывод
QAxBase: Error calling IDispatch member Connect: Exception thrown by server
Code : 16389
Source : V82.COMConnector.1
Description: {????????????????????????(36)}: ???????????? : 1C-Qt-Bot-vostok ?? ??? ?????? ? ??????????? ?????????????. ???????? ?????? ??? ?????????? ???????????? ? ??????????.
{???????????.????????????????????????.??????(172)}: ?????? ??? ?????? ?????? ????????? (????????): ?????? ??? ?????????? ??????????? - '????????????': {???????????.????_???????????.??????(186)}: ?????? ??? ????????? ???????? ???????? ????????? (?????????????????????????????????????): ??????? ????????? ????????????????????? ???????? ????????? ??????
Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception
Ну и в текстедите ничего не появилось собственно ...

в Qt 5.1 нет больше этих
C++ (Qt)
1
2
QTextCodec::setCodecForTr(winCodec);
QTextCodec::setCodecForCStrings(winCodec);
функций.
Хотя вы правы, нужно как то расшифровать эти вопросики. Может какой-то параметр не передается при авторизации (хотя сервер 1с не ругается) ... Но ума не приложу, как расшифровать дэбаг вывода через соединение модели COM при подключенной библиотеки, которая собственно дэбаг и выдаёт
0
182 / 37 / 5
Регистрация: 29.01.2013
Сообщений: 242
19.07.2013, 17:45 6
А у пользователя которым ты конектишся к 1С "1C-Bot" есть право на "Внешнее соединение"?
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
20.07.2013, 05:20  [ТС] 7
У него полные права стоят. Да и если бы коннект не разрешен был, то не было бы авторизации в логах. Было бы просто "начало сеанса" и сразу обрыв.
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
21.07.2013, 16:04  [ТС] 8
Интересные размышления были продемонстрированы на стороннем форуме.
Например, выяснилось, что проблема в том, что нужно как-то в COM методе Connect получить IDispatcher* , но непонятно как это сделать ...
К примеру
C++
1
2
QAxObject * ax = new QAxObject("V82.COMConnector");
QAxObject * ac = ax->querySubObject("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
Всё равно ругается в консоль что
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
23.07.2013, 09:52  [ТС] 9
Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя не было в справочнике пользователей в базе 1С, поэтому и не пускал
1
Maxim Prishchepa
23.07.2013, 09:58
  #10

Не по теме:

как банально :)

0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
24.07.2013, 03:57  [ТС] 11
l_a_m ,проблема была скорее не с банальностью, а с тем, что вывод ошибки был в вопросиках, поэтому не понятно было в какую сторону копать. Методом научного тыка и советом со "стороннего форума 2" была решена проблема.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2013, 03:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нужно изменять размер шрифта в ActiveX в зависимости от размера самого ActiveX
Уважаемые, обратите пожалуйста внимание на вчерашний постинг под сабжем 'ActiveX - динамич....

ActiveX Bridje или как превращать ActiveX Control в JavaBean.
Насколько я понял из документации, эта штука позволяет превращать JavaBean в ActiveX Control с...

Где найти мод на Mount Blade Warband на спартанцев и Властелин Колец?
кто нибудь подскажите где найти мод на mount blade warband на спартанцев и властелин колец я не...

Cеть с доменом, файл обменником, сервером 1С, атс, фаерволом, локальным сервером сайта
Народ помогите схематично хотябы разобраться как организовать ПАРАВЕЛЬНО сеть с доменом, файл...

ActiveX и VB, получение значения из ActiveX
Написал на VB ActiveX компонент. Использую его на Web странице Function OnSupLoad() Dim...

Ошибки 1с предприятия 7.7
Итак данная тема будет полезна всем, и я думаю что может стоит ее даже закрепить. Предлагаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.