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("========"); } } } }