Подключение к 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 это обычный пользователь, не администратор сервера