С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 29

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

18.07.2013, 14:24. Показов 5142. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2013, 14:24
Ответы с готовыми решениями:

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

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

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

10
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
18.07.2013, 14:26
потому что приложение завершается...
делайте return a.exec() в конце main-а
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 29
18.07.2013, 14:49  [ТС]
Это вывод
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
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
18.07.2013, 14:58
добавьте:
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
Сообщений: 29
19.07.2013, 08:04  [ТС]
На оф. 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
Сообщений: 256
19.07.2013, 17:45
А у пользователя которым ты конектишся к 1С "1C-Bot" есть право на "Внешнее соединение"?
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 29
20.07.2013, 05:20  [ТС]
У него полные права стоят. Да и если бы коннект не разрешен был, то не было бы авторизации в логах. Было бы просто "начало сеанса" и сразу обрыв.
0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 29
21.07.2013, 16:04  [ТС]
Интересные размышления были продемонстрированы на стороннем форуме.
Например, выяснилось, что проблема в том, что нужно как-то в 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
Сообщений: 29
23.07.2013, 09:52  [ТС]
Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя не было в справочнике пользователей в базе 1С, поэтому и не пускал
1
23.07.2013, 09:58

Не по теме:

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

0
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 29
24.07.2013, 03:57  [ТС]
l_a_m ,проблема была скорее не с банальностью, а с тем, что вывод ошибки был в вопросиках, поэтому не понятно было в какую сторону копать. Методом научного тыка и советом со "стороннего форума 2" была решена проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2013, 03:57
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru