Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 215

Ошибка при подключение к Com объекту

28.06.2022, 14:33. Показов 2347. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня! Хотел сделать свой скрипт для бекапов 1С, bat-файл
Windows Batch file
1
2
3
4
5
6
7
    @echo off
    chcp 1251
    echo Привет
    set day=%DATE:~0,2%
    set month=%DATE:~3,2%
    set year=%DATE:~6,4%
    start /wait "" "C:\Program Files\1cv8\common\1cestart.exe" config /s "MyServer\test" /n "Администратор" /p "1" /Out "D:\1c.log" /DumpIB "\\Azimut\backup3\BackUp_%year%-%month%-%day%.dt"
Скрипт работает, но не завершает открытые сеансы 1С, перенес штатное завершение сеансов в обработку 1С:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    ПортКластера = 1541;
    ИмяАдминистратораКластера = "";
    ПарольАдминистратораКластера = "";
    ИмяВКластере = "test";
    
    COMСоединитель = Новый COMОбъект("v83.COMConnector");
    СоединениеСАгентомСервера = COMСоединитель.ConnectAgent("tcp://127.0.0.1:1540");
    
    Кластер = Неопределено;
    Для Каждого Кластер Из СоединениеСАгентомСервера.GetClusters() Цикл
        Если Кластер.MainPort = ПортКластера Тогда
            СоединениеСАгентомСервера.Authenticate(Кластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    ТекОписаниеИнформационнойБазы = Неопределено;
    Для Каждого ОписаниеИнформационнойБазы Из СоединениеСАгентомСервера.GetInfoBases(Кластер) Цикл
        Если НРег(ОписаниеИнформационнойБазы.Name) = НРег(ИмяВКластере) Тогда
            ТекОписаниеИнформационнойБазы = ОписаниеИнформационнойБазы;
        КонецЕсли;
    КонецЦикла;
    
    ВсеСеансыУдалены = Ложь;
    
    
    Сеансы = Новый Массив;
    Для Каждого Сеанс Из СоединениеСАгентомСервера.GetInfoBaseSessions(Кластер, ТекОписаниеИнформационнойБазы) Цикл
        Сеансы.Добавить(Сеанс);
    КонецЦикла;
    
    Для каждого Сеанс Из Сеансы Цикл
        Попытка
            СоединениеСАгентомСервера.TerminateSession(Кластер, Сеанс);
        Исключение
            // Сеанс мог завершиться к моменту вызова TerminateSession.
            Продолжить;
        КонецПопытки;
    КонецЦикла;
При запуске кода с 1С, завершает открытые сеансы, все хорошо.
Далее хотел этот код перенести в батник, но не нашел как / через какие компоненты в командной строке (batch) открыть Com-объект.
Поэтому загрузил Visual Studio 2022, создал проект: приложение Windows Forms .Net (VB), как смог перевел код с 1С в VB:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Private Sub Disconnect_Click(sender As Object, e As EventArgs) Handles Disconnect.Click
 
        Dim Com1C, ComAgent, DescriptionThisBD, ThisCluster As Object
        Dim Sessions As New List(Of Object)
        Dim AllSessionDel As Boolean
 
        Com1C = CreateObject("v83.COMConnector")
        ComAgent = Com1C.ConnectAgent("tcp://" + AgentServerAdress.Text + ":" + AgentServerPort.Text)
 
        For Each Cluster As Object In ComAgent.GetClusters()
            If Cluster.MainPort = ClasterPort.Text Then
                ComAgent.Authenticate(Cluster, ClasterUserName.Text, ClasterUserPass.Text)
                ThisCluster = Cluster
            End If
        Next
 
        For Each DescriptionBD As Object In ComAgent.GetInfoBases(ThisCluster)
            If DescriptionBD.Name = BaseName.Text Then
                DescriptionThisBD = DescriptionBD
            End If
        Next
 
        AllSessionDel = False
        For Each Session As Object In ComAgent.GetInfoBaseSessions(ThisCluster, DescriptionThisBD)
            Sessions.Add(Session)
        Next
 
        For Each Session As Object In Sessions
            ComAgent.TerminateSession(ThisCluster, Session)
        Next
 
        MsgBox("OK")
 
    End Sub
При отладке пишет ошибка в строке
ComAgent = Com1C.ConnectAgent("tcp://" + AgentServerAdress.Text + ":" + AgentServerPort.Text)



Проверяю выражение, рассчитывает правильно



Может объявил переменные неправильно
Dim Com1C, ComAgent, DescriptionThisBD, ThisCluster As Object

В 1С плюс минус тот же код, метод ConnectAgent есть, в VB этого метода нет. Может кто подскажет. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2022, 14:33
Ответы с готовыми решениями:

Ошибка при обращении к объекту другого класса
Когда пытаюсь с класса Drone вызвать через его объект функцию из класса Widget то появляется такая ошибка: ошибка: 'Widget' does not name...

Появляется ошибка при обращении к объекту другой формы
Обращаюсь к свойству объекта btn4 на Form3 из Form5 Вот процедура после которой возникает ошибка(Project Project1.exe raised exception...

Ошибка при работе с БД: Подключение не было закрыто. Подключение открыто
Здравствуйте! Столкнулся с проблемой. Вскакивает ошибка при работе с БД, когда проект запускаю из-под среды Подключение не было закрыто....

5
Лень — мое второе и
 Аватар для Orlangur
3228 / 2416 / 687
Регистрация: 28.11.2014
Сообщений: 3,601
Записей в блоге: 3
28.06.2022, 16:18
GoodLife,
1) в системе должна быть зарегистрирована библиотека comcntr.dll из bin папки с установленной 1с
То есть идёте по пути, например C:\Program Files\1cv8\8.3.15.1830\bin
там открываете cmd и пишете regsvr32 comcntr.dll
2)После этого в студии при добавлении ссылки из COM появится библиотека 1С

3)далее уже работаете с библиотекой, например
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Sub Open()
        Dim comconnector As Type = Type.GetTypeFromProgID("V83.COMConnector")
        If comconnector Is Nothing Then
            Throw New Exception("COM Class Object ""V83.COMConnector"" was not found or not registered in the system")
        End If
 
        Try
            Dim connectorInstance As COMConnector = DirectCast(Activator.CreateInstance(comconnector), COMConnector)
            ComAgent = connectorInstance.Connect("connectionString")
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
    End Sub
4
2288 / 1604 / 400
Регистрация: 26.06.2017
Сообщений: 4,757
Записей в блоге: 1
28.06.2022, 16:33
На просторах нашёл это, там про регистрацию СОМ коннекторов целая история, плюс с версиями траблы, но главное там есть пример создания экземпляра COM коннектора. Может чем-то поможет.
При использовании позднего связывания лучше всего типы переменных извлекать после присоединения к приложению, пример этого есть в материале по ссылке.
2
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 215
31.01.2024, 13:15  [ТС]
Добрый день!

В прошлый раз задача не была решена, прошло 1.5 года, новый круг

Установил VS, добавил компонент в проект,

VB.NET
1
2
3
4
5
6
7
8
9
10
11
Private Sub DeleteSessionsAllUserIn1C()
 
        Dim comconnector As Type = Type.GetTypeFromProgID("V83.COMConnector")
        If comconnector Is Nothing Then
            MsgBox("COM Class Object ""V83.COMConnector"" was not found or not registered in the system")
        End If
 
        Dim connectorInstance As comconnect = DirectCast(Activator.CreateInstance(comconnector), comconnect)
 
 
    End Sub
Ошибка BC30002 Тип "comconnect" не определен.




Вроде GetTypeFromProgID должен искать по ID, но если указываю ID "InterOP.V83" (которое видно на скрине) то проваливается в условие 1
Если указываю ID "V83.COMConnector" условие 1 проходит но выходит ошибка.
Как я понял сначала строкой
VB.NET
1
 Dim comconnector As Type = Type.GetTypeFromProgID("V83.COMConnector")
определяем новый Тип
Но дальше в строке
VB.NET
1
Dim connectorInstance As comconnect = DirectCast(Activator.CreateInstance(comconnector), comconnect)
не понятно что происходит, даже с гуглом. Вроде как определяем новый тип "comconnect" из предыдущего типа "comconnector", и определяем что переменная "connectorInstance" будет типа "comconnect"

Попробовал написать
VB.NET
1
2
 Dim comconnector As Type = Type.GetTypeFromProgID("V83.COMConnector")
Dim connectorInstance As comconnector
Такая же ошибка
Ошибка BC30002 Тип "comconnector" не определен.
0
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 215
31.01.2024, 16:14  [ТС]
Приведенный в ответе 2 код работает, надо было прописать в начале модуля формы
VB.NET
1
Imports V83
Как я понял подключение к ком объекту с VB
1. Подключаем по ссылке необходимый COM-объект
VB.NET
1
Dim comconnector As Type = Type.GetTypeFromProgID("V83.COMConnector")
2. Определяем новый тип данных
VB.NET
1
Imports V83
3. В моем случае надо было указать чтобы не было ошибки на строку "COMConnector"
VB.NET
1
3. Dim connectorInstance As COMConnector = DirectCast(Activator.CreateInstance(comconnector), COMConnector)
Activator.CreateInstance(comconnector) создаем объект данного типа
DirectCast(DirectCast(Activator.CreateIn stance(comconnector), COMConnector)) копируем в новый объект методы подкласса COMConnector Класса V83

Невероятно, 2 часа чтобы разобраться в 4 строках кода
0
Лень — мое второе и
 Аватар для Orlangur
3228 / 2416 / 687
Регистрация: 28.11.2014
Сообщений: 3,601
Записей в блоге: 3
01.02.2024, 00:18
GoodLife, Достаточно было навести на подчеркнутую красным строку и студия сама предложила бы импортировать нужное пространство имён, при условии наличии ссылки на библиотеку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2024, 00:18
Помогаю со студенческими работами здесь

Ошибка при закрытии сокета "Доступ к ликвидированному объекту невозможен"
Здравтсвуйте, когда закрываю сокет - появляется ошибка: RecieveData Error. Досутп к ликвидированному обьекту невозможен. Имя объекта...

Определяемый пользователем тип не определён (подключение к объекту Word.Application)
здравствуйте, есть код Option Explicit Public ObjectWord As Word.Application Sub Main() Set ObjectWord =...

Visual Studio Express 2012 C++ подключение к 1С V82.COMConnector (COM) объекту
Хочу подключиться через com зарегистрированную библиотеку к 1С серверу. С VS совсем не работал ... В Qt есть такой пакет ActiveQT: ...

Ошибка при подключение файла БД SQLite при сборке в Maven в Intellij IDEA
Доброго времени суток, у меня возникла проблема с доступом к файлу БД SQLite после сборки Мавеном в Intellij IDEA. Перерыл кучу всего на...

Ошибка при подключение
Как исправить ?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru