Интеграция C# и 1с

Как работать с 1с из dot net приложения на примере языка C#

1с – это самая распространённая система на пост советском пространстве. С её помощью ведётся бухгалтерия, управленческий учёт, осуществляются продажи и, наверное, сложно представить, где она не используется. Иногда требуется записать или получит данные из 1с, или решить типовые проблемы связанные с обслуживанием платформы. Способов интеграции несколько, но в рамках данного постав будет рассмотрен всего лишь один – это ComObject. Рассмотрим несколько примеров, как и что можно делать с помощью 1с из C#.

1. Подключение ComObject (V83.COMConnector) в проект C#

Подключение 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("========");
                    }

                }

            }
        }
+1
Share
Pin
Like
Send
Share
Send

Прочитайте другие наши записи в блоге