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



  • Доброго времени суток господа!
    Хочется общаться с 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 "ПользователиИнформационнойБазы"


    Google translate

    Good day, ladies and gentlemen!
    I would like to communicate with the server through 1C COM, ie connect to, see what users in the database, choose anything to add, view the current session to the server 1C. In general, it would be desirable to certain data, such as groups in AD, to do certain acts in 1C.
    Tell me how this can be implemented in Qt?

    For example there is a wonderful <s> scripting language </ s> PowerShell, it can be
    //com to connect
    $connector = New-Object -ComObject "V82.ComConnector"
    //Connecting to 1C
    $connection = $connector.Connect("Srvr=""сервер1С"";Ref=""база"";Usr=""пользователь"";Pwd=""пароль"";")
    //look people in the database
    $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 секунды происходит разрыв. Почему??? Ведь я объект не удаляю!!!



  • Почему то при использовании
    @QAxObject * ax = new QAxObject("V82.COMConnector");
    QAxObject * ac = ax->querySubObject("Connect("Srvr="172.0.0.100";Ref="base1";Usr="1C-Bot";Pwd="56q";")");@

    Поулчаю ошибку :(
    @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
    @



  • Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя не было в справочнике пользователей в базе 1С, поэтому и не пускал :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.