Подключение к 1С COM объекту в приложении на C#

Добрый день нужна помощь касаемо 1С COM объекта

static void Main()
{
    string clusterAddress = "ххх.ххх.хх.х"; // Адрес кластера - указан верный
    string clusterPort = "1541"; // Порт кластера (обычно 1541)
    string baseName = "ххххх"; // Имя базы имя -  указано верное
    string clusterUser = null; // Пользователь кластера
    string clusterPwd = null; // Пароль кластера
    string baseUser = ""; // Пользователь базы логин и пароль указываю верный
    string basePwd = ""; // Пароль базы

    try
    {
        
        Console.WriteLine($"Проверка доступности кластера {clusterAddress}:{clusterPort}...");
        if (!IsServerAvailable(clusterAddress, int.Parse(clusterPort)))
        {
            Console.WriteLine("Кластер недоступен!");
            return;
        }

        
        Type comType = Type.GetTypeFromProgID("V83.COMConnector");
        dynamic connector = Activator.CreateInstance(comType);


        
        /*string clusterConnStr = $"Srvr={clusterAddress}:{clusterPort};Ref={baseName};Usr={baseUser};Pwd={basePwd};";
        Console.WriteLine($"Подключаемся к кластеру: {clusterConnStr}");

        dynamic clusterAgent = connector.Connect(clusterConnStr);

        
        Console.WriteLine("\nБазы в кластере:");
        dynamic infoBases = clusterAgent.GetInfoBases();
        foreach (dynamic ib in infoBases)
        {
            Console.WriteLine($"- {ib.Name} ({(ib.Enabled ? "доступна" : "недоступна")})");
        }*/

       
        string baseConnStr = $"Srvr={clusterAddress};Ref={baseName};Usr={baseUser};Pwd={basePwd};";
        Console.WriteLine($"\nПодключаемся к базе: {baseConnStr}");

        dynamic baseAgent = connector.Connect(baseConnStr);
        string version = baseAgent.Eval("ВерсияПриложения()");
        Console.WriteLine($"Успешное подключение! Версия: {version}");

       
        Console.WriteLine("\nПользователи базы:");
        dynamic users = baseAgent.Eval("Справочники.Пользователи.Выбрать()");
        while (users.Следующий())
        {
            Console.WriteLine($"- {users.Наименование}");
        }

        
        Marshal.FinalReleaseComObject(users);
        Marshal.FinalReleaseComObject(baseAgent);
       // Marshal.FinalReleaseComObject(infoBases);
       // Marshal.FinalReleaseComObject(clusterAgent);
        Marshal.FinalReleaseComObject(connector);
    }
    catch (COMException ex)
    {
        Console.WriteLine($"COM Ошибка (0x{ex.ErrorCode:X8}): {ex.Message}");
        Console.WriteLine("Проверьте:\n1. Пароль кластера\n2. Порт кластера\n3. Права пользователя");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Ошибка: {ex.Message}");
    }
}

static bool IsServerAvailable(string ip, int port, int timeout = 30000)
{
    try
    {
        using (var client = new TcpClient())
        {
            var result = client.BeginConnect(ip, port, null, null);
            bool success = result.AsyncWaitHandle.WaitOne(timeout);
            if (success) client.EndConnect(result);
            return success;
        }
    }
    catch
    {
        return false;
    }
}

При попытке подключения к базе 1С выбрасывает исключение COM Ошибка (0x80004005) Логины и пароли указаны верно IP адрес и имя базы, тоже есть догадки, что необходимо заиметь логин и пароль от кластера так как в закоменченом куске видно, что я пытался подключиться к серверу и получить доступный список баз данных, но у меня возникает диссонанс тогда, почему при подключение в клиентской 1С достаточно знать имя кластера и имя БД, а для подключения через COM нужны дополнительные сведения Так же важный нюанс, baseUser и basePwd это обычный пользователь, не администратор сервера


Ответы (0 шт):