1с – это самая распространённая система на пост советском пространстве. С её помощью ведётся бухгалтерия, управленческий учёт, осуществляются продажи и, наверное, сложно представить, где она не используется. Иногда требуется записать или получит данные из 1с, или решить типовые проблемы связанные с обслуживанием платформы. Способов интеграции несколько, но в рамках данного постав будет рассмотрен всего лишь один – это ComObject. Рассмотрим несколько примеров, как и что можно делать с помощью 1с из C#.
1. Подключение ComObject (V83.COMConnector) в проект C#
2. Инициализация подключения к серверу 1с
public void Open() {
Type comconnector = Type.GetTypeFromProgID("V83.COMConnector");
if(comconnector == null) {
throw new Exception($"COM Class Object \"V83.COMConnector\" was not found or not registered in the system");
}
try {
COMConnector connectorInstance = (COMConnector)Activator.CreateInstance(comconnector);
ComObjRef = connectorInstance.Connect(_connectionString);
} catch(Exception ex) {
throw new Exception($"{ex.Message}\r\n");
}
}
3. Получение справочника номенклатуры
public void GetProducts() {
dynamic dataArray1C = ComObjRef.Справочники.Номенклатура.Выбрать();
while(dataArray1C.Следующий == true) {
bool useSerial = (dataArray1C.ВидНоменклатуры.ИспользоватьСерии is DBNull) ? false : dataArray1C.ВидНоменклатуры.ИспользоватьСерии;
Console.WriteLine($" {dataArray1C.Наименование} - {ComObjRef.String(dataArray1C.Ссылка.УникальныйИдентификатор())}");
}
}
4. Выполнение запроса и получение результата из 1с в C#
public dynamic Query(string q) {
try {
dynamic query = ComObjRef.newObject("Запрос");
query.Text = q;
dynamic queryResult = query.Выполнить();
dynamic result = queryResult.Выбрать();
return result;
} catch(Exception e) {
Console.WriteLine(e);
throw;
}
}
5. Блокировка конфигурации 1с на определённое время
public void Block(string ip, string clusterAdmin,string clusterPwd, string confAdmin,string confPwd, string dbName) {
Type comconnector = Type.GetTypeFromProgID("V83.COMConnector");
COMConnector connectorInstance = (COMConnector)Activator.CreateInstance(comconnector);
var serverAgent = connectorInstance.ConnectAgent(ip);
var clusters = serverAgent.GetClusters();
foreach(IClusterInfo cluster in clusters) {
serverAgent.Authenticate(cluster,clusterAdmin,clusterPwd);
var workingProcesses = serverAgent.GetWorkingProcesses(cluster);
foreach(dynamic workingProcess in workingProcesses) {
var workingProc = connectorInstance.ConnectWorkingProcess("tcp://" + workingProcess.HostName + ":" + workingProcess.MainPort);
workingProc.AuthenticateAdmin(clusterAdmin,clusterPwd);
workingProc.AddAuthentication(confAdmin,confPwd);
var bases = workingProc.GetInfoBases();
foreach(IInfoBaseInfo infoBase in bases) {
if(infoBase.Name.ToLower() == dbName) {
infoBase.ConnectDenied = true;
infoBase.DeniedFrom = DateTime.Now;
infoBase.DeniedTo = DateTime.Now.AddMinutes(1);
infoBase.DeniedMessage = "БАЗА ЗАКРЫТА НА СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ! ВРЕМЯ ОЖИДАНИЯ ОКОЛО 5-10 МИНУТ.";
infoBase.PermissionCode = "2192";
workingProc.UpdateInfoBase(infoBase);
var connections = workingProc.GetInfoBaseConnections(infoBase);
foreach(IInfoBaseConnectionInfo connection in connections) {
if(connection.AppID != "SrvrConsole") {
workingProc.Disconnect(connection);
}
}
}
Console.WriteLine(infoBase.Name);
Console.WriteLine(infoBase.Descr);
Console.WriteLine("========");
}
}
}
}