Integração rápida com 1C: Enterprise

Neste artigo, falarei sobre a maneira mais simples, na minha opinião, de integrar aplicativos de terceiros com configurações 1C. O artigo será de interesse principalmente para desenvolvedores que escrevem em .Net Core , PHP e Python .

Existem várias maneiras de integrar o 1C, um excelente artigo do próprio 1C é dedicado a isso. Você aprenderá, em particular, que o 1C suporta os mecanismos de serviços da Web, o que significa que podemos implementar nosso próprio serviço no lado 1C e, como resultado, nossa própria biblioteca ORM no lado do aplicativo cliente. Uma dessas bibliotecas será discutida posteriormente.

Descrição da técnica em termos gerais


No lado de 1C


Tudo começa com o fato de a extensão "Brom" ser adicionada à configuração 1C, adicionando um novo serviço da web. A extensão está disponível e licenciada gratuitamente (MIT). A extensão em si não está vinculada a um modelo de dados específico e, portanto, pode ser instalada em qualquer configuração com suporte ao modo de compatibilidade 8.3.10 ou superior.

Após a instalação da extensão, você deve configurar os direitos dos usuários que terão acesso aos métodos de serviço da Web, bem como publicar a configuração no servidor da Web, para que o serviço adicionado seja acessível por meio do protocolo http (s). No lado 1C, nada mais é necessário.

No lado do cliente


No lado do cliente, o pacote Brom está conectado, por exemplo, ao .Net Core, isso pode ser feito com o comando:

Install-Package Brom -Version 1.0.1-beta08 

Ou para Python:

 pip install brome 

Após a instalação do pacote, basta criar um objeto cliente através do qual a interação com a configuração 1C remota será realizada. A seguir, darei o código em C #, mas em PHP e Python é semelhante. E assim, você pode criar um cliente com um comando:

 dynamic  = new (@"  = http://mydomain.com/publication_name;  = 1c_user_name;  = 1c_user_pass "); 

No construtor, basta indicar o endereço da configuração 1C publicada e os dados do usuário a quem emitimos direitos de acesso à extensão. Assim que o cliente é criado, podemos prosseguir para o mais interessante.

Chamada de procedimentos e funções 1C


Através do cliente de bromo criado, podemos chamar os procedimentos e funções definidos em 1C. Nesse caso, os métodos chamados devem estar no lado do servidor e estar contidos no contexto global ou nos módulos do servidor (módulos gerais ou módulos gerenciadores). Por exemplo, é assim que a chamada de função do contexto global “Prescrição numérica” se parece:

 string  = .(2547, " = fr_FR"); 

O segundo parâmetro é uma string de formato indicando localização (francês). Os parâmetros são transferidos de forma natural e não exigem nenhuma conversão ou empacotamento adicional.

E é assim que a chamada para a função Find By Code do módulo gerenciador de diretório será:

 var  = ...(840); 

Aqui chamamos a função através do diretório do gerenciador de módulos "Moedas". O resultado da chamada será um objeto do tipo "DirectoryReference". Agora, o link resultante para o objeto pode ser passado como um parâmetro para outra função:

 var  = ..(, DateTime.Today); 

Dessa vez, voltamos ao módulo geral "Trabalhar com moedas" e resgatamos seu método "Obter moedas dos cursos".

A biblioteca suporta o trabalho com tipos de dados complexos, portanto, é possível chamar métodos que aceitam ou retornam: Links, Matrizes, Estruturas, Tabelas de Valor, Árvores de Valor, Enumerações do sistema, etc. ... Algumas classes são implementadas especialmente na biblioteca do cliente para simplificar o trabalho com 1C.

O escopo dos métodos remotos pode ser configurado com flexibilidade, especificando-os nas configurações. Portanto, por exemplo, se você especificar a área "Diretórios. *. Localizar por código", somente o método "Localizar por código" estará disponível em todos os diretórios de configuração. Assim, você pode indicar claramente quais métodos um aplicativo integrado pode usar.

Trabalhar com links


As referências a objetos permitem não apenas transferir o ponteiro para o objeto 1C, mas também receber dados do próprio objeto. Trabalhar com links no lado do cliente é tão simples quanto em 1C. Por exemplo:

 var  = ...("00-000018", new Date(2017, 1, 1)); var  = .; var  = .; var  = ..; foreach (var  in .) { Console.WriteLine((., .)); } 

Aqui encontramos um link para o documento através do módulo gerenciador e obtivemos os valores dos campos do documento e sua seção tabular “Produtos”. Após o primeiro acesso ao campo de objeto, todos os seus dados são baixados do servidor 1C e armazenados no cliente até que o link seja excluído pelo coletor de lixo.

Um link para o objeto também pode ser obtido no lado do cliente sem acessar o servidor. Para fazer isso, basta conhecer o identificador exclusivo do objeto:

 var  = ...(new Guid("5a32b6ab-4661-11e9-912a-38d547755ef7")); 

Você também pode obter links para itens de coleção predefinidos:

 var  = ...18_118; 


Editando Objetos


Tendo um link para o objeto, podemos editar os dados do objeto. Para fazer isso, basta criar um contexto de objeto:

 var  = .(); . = DateTime.Today; . = "00-000055"; ..(); var  = ..() . = ...("000000104"); . = 3; .(.); 

Neste exemplo, criamos o contexto do documento por meio de um link para o documento, preenchemos alguns campos, adicionamos uma linha à seção tabular “Produtos” e gravamos o documento no modo de postagem.

Se você precisar criar um novo objeto, também será possível:

 //     var  = ...(); . = " "; .(); //     var  = ...(); . = .; . = " "; . = "T-00012321"; //    .(); //      var  = .; 

Aqui, criamos um novo grupo no diretório "Nomenclature", depois criamos um elemento de diretório e o colocamos no grupo criado.

Amostragem


Como qualquer ORM decente, o cliente de bromo permite criar amostras de várias coleções de objetos 1C. Uma seleção é uma coleção de referências a objetos de coleção que atendem a um conjunto de condições de seleção. Para criar uma seleção, basta criar o objeto "Seletor":

 var  = ...(""); var  = ...(); . (", , , ."). ("", false). ("", , .). (""). ("", .); foreach (var  in ) { Console.WriteLine(": {0}; : {1}, : {2}; : {3}", ., ., ., .. ); } //         var  = .(); 

Neste exemplo, obtivemos uma amostra que contém elementos do diretório "Nomenclature", que estão hierarquicamente no grupo "Furniture". Observamos que, além dos próprios links, é necessário carregar os dados de alguns campos. Por esse motivo, os dados desses campos serão carregados com uma única solicitação e o acesso a eles não levará a chamadas adicionais do servidor.

Execução de consulta


Na maioria das vezes, os dados armazenados em uma coleção se tornam insuficientes e precisamos obter os dados gerados por uma consulta complexa. Para atender às solicitações, uma classe especial "Solicitação" é fornecida na biblioteca do cliente. O trabalho com solicitações no lado do cliente é muito semelhante ao trabalho no lado 1C:

 var  = .(@"  .  , .  , .    .    . = & "); .("", "-0001"); var  = .(); foreach (var  in ) { Console.WriteLine((., .)); } 

Aqui, criamos uma consulta simples com um parâmetro que seleciona dados do diretório "Nomenclature". Como parâmetro, passamos o artigo de string do elemento. No caso geral, o valor do parâmetro também pode ser links, enumerações do sistema e até matrizes. Como resultado da consulta, retornamos a "Tabela de Valores", essa classe é implementada no lado do cliente. Neste exemplo, inferimos os campos das linhas da tabela usando um loop.

No lado 1C, todas as solicitações são executadas por meio do construtor de consultas, para que você possa especificar não apenas uma solicitação pronta como um texto, mas também um modelo de solicitação que contenha marcação para o construtor:

 var = .(@"   5 .  , .  , .   { .*}  ..( {(&)}, { ().*, ().*} )   { .} {  .*, .*} "); //         .("..", ""); //      .("", 100, .); //       .("."); .("", .); var  = .(.); 

Neste exemplo, especificamos uma solicitação padronizada, cujas configurações podem ser alteradas dinamicamente no lado do cliente, conforme necessário. Por esse motivo, os campos, seleções e classificações podem ser indicados no corpo do código do programa principal e não dentro do corpo da solicitação.

O método Run aceita o parâmetro opcional "tipo de rastreamento dos resultados". Se você especificar o tipo de rastreamento "Por agrupamento" ou "Por agrupamento com uma hierarquia", em vez de uma tabela de valores, o método retornará uma árvore de valores.

Além disso, em vez do método Run, você pode chamar o método Run Package (para executar várias solicitações ao mesmo tempo). Nesse caso, uma matriz de tabelas ou uma matriz de árvores será retornada, dependendo do tipo de travessia.

Execução de fragmento de código


Em alguns casos exóticos, pode ser necessário executar um pedaço de código específico diretamente no lado 1C. Para fazer isso, o cliente Brom fornece o método "Executar". O método aceita o texto de entrada que contém o código executável e um parâmetro opcional, que estará disponível no código na variável "Parameter":

 var  = .(@"  = 0;        =  + ; ; ", new double[] { 45, 67, 12.56, 11.9 }); 

Neste exemplo, executamos um pedaço de código que soma os números em uma matriz. O próprio array foi passado como parâmetro e colocado na variável "Parameter". O resultado do cálculo foi colocado na variável "Resultado". Se uma variável com esse nome é preenchida no código executável, seu valor no momento em que a execução termina é retornado como resultado da função "Executar".

A capacidade de executar fragmentos de código é governada por uma função de acesso separada na extensão. Recomenda-se habilitar essa função apenas para fins de teste e desabilite-a no rascunho de trabalho, como Esta é uma vulnerabilidade óbvia.

Vantagens desvantagens da técnica


As vantagens da metodologia descrita certamente devem incluir:

  • Plataforma cruzada . Toda interação é baseada nos protocolos SOAP e HTTP, e sua implementação é em todas as plataformas de desenvolvimento populares;
  • A simplicidade do código . O código no lado do aplicativo cliente é quase idêntico ao código no lado 1C;
  • Mecanismos de serialização embutidos . Não precisamos compactar e descompactar dados para trocá-los com 1C;
  • Suporte para trabalhar com links . Temos fácil acesso aos objetos 1C através de links;
  • Suporte para tipos de dados específicos de 1C . Podemos trocar com tabelas 1C, árvores, estruturas e outras estruturas complexas;
  • Acesso ao contexto do aplicativo . Temos acesso não apenas aos dados do banco de dados, mas também podemos chamar métodos definidos no lado 1C e também ter acesso ao estado da sessão.

As desvantagens dessa técnica também estão disponíveis:

  • Baixa taxa de dados . Como o protocolo SOAP é baseado na serialização XML, a transferência de grandes quantidades de dados requer tempo para a troca de excesso de tráfego, bem como para empacotar e descompactar os dados. A comunicação através de uma conexão COM parece preferível neste contexto;
  • Um cliente conveniente não está disponível em todas as plataformas . Se você não é um programador .Net Core, PHP ou Python, precisará implementar o cliente de bromo por meio de mecanismos SOAP, que, em geral, consomem muito tempo;
  • Limitações da linguagem de consulta 1C . Como todo o trabalho com o banco de dados ocorre por meio do mecanismo de consulta 1C, existem algumas limitações. Por exemplo, você não pode implementar a paginação clássica de dados, porque na linguagem de consulta 1C, não há mecanismos para paginação.

Comparação com OData


No artigo acima mencionado da 1C, você pode descobrir que em 1C: o acesso corporativo aos dados é implementado usando o protocolo OData padronizado. Por esse motivo, seria tolice não mencioná-lo também.
Aqui está um breve gráfico de comparação:
BromoOData
Obtenção de dados de coleta com condições complexas de seleção e classificação++
Saída da página de dados de coleções+
Adicionando e editando dados++
Suporte para trabalhar com tipos 1C: Enterprise (links, tabelas, árvores, etc.)+
Executando consultas arbitrárias+
Chamando procedimentos e funções do servidor+
Execução arbitrária do código do servidor+
Ferramentas de visualização prontas / interfaces de usuário+
Transferência de dados JSON+

Pode-se observar que esses métodos têm suas vantagens e desvantagens e, no caso geral, não são intercambiáveis.

Conclusão


Espero que este artigo de revisão ajude você no futuro a criar rápida e facilmente portais, contas e serviços pessoais que estão intimamente integrados aos sistemas de contabilidade baseados em 1C: Enterprise. Você pode encontrar informações detalhadas sobre os componentes de bromo na documentação oficial. Aqui está apenas uma breve visão geral dos principais recursos.

Source: https://habr.com/ru/post/pt462453/


All Articles