Pavel Chistov. Serviços web 1c 8 serviço web

Eu sei que em Habré eles realmente não gostam do sofrido 1C. Porém, com o lançamento da plataforma 8.3 (com clientes para Linux), eles começaram a amá-la um pouco mais. A propósito, recentemente a interface de um dos principais desenvolvimentos 1C - a configuração Manufacturing Enterprise Management - foi totalmente traduzida para o inglês. Muitas vezes me deparei com perguntas sobre por que eles não escrevem sobre 1C aqui. A resposta para elas é bastante óbvia - existem muitos recursos especializados onde você pode discutir rapidamente todas as questões e ler algo.

Há todos os motivos para acreditar que este artigo não sobreviverá aqui, mas ainda assim correrei o risco, porque há algumas coisas interessantes em 1C sobre as quais vale a pena falar.

Já há algum tempo, 1C 8.x tornou possível o uso de serviços web: 1C pode atuar tanto como fornecedor quanto como consumidor. Neste artigo mostrarei como usar 1C como consumidor usando o exemplo de recebimento de taxas de câmbio do servidor do Banco Central.

serviço de internet

O Banco Central possui um serviço web para recebimento de dados diários: taxas de câmbio, notícias, dinâmica cambial, etc. Uma descrição do serviço pode ser encontrada aqui http://www.cbr.ru/scripts/Root.asp?Prtid=DWS. Estamos interessados ​​​​em um dos métodos deste serviço: GetCursOnDate(Data_de_data)– obtenção de taxas de câmbio para uma determinada data. Um argumento é passado para o método Na data– esta é a data em que você precisa receber os cursos. O resultado é XML contendo a tabela ValorCursOnDate(os próprios cursos e informações relacionadas).

Configuração

Para desenvolvimento, peguei 1C 8.2 (8.2.15.317 no meu caso) e criei uma configuração vazia. Para utilizar serviços web externos, é fornecido um objeto link WS, mas não é necessário utilizá-lo; o serviço pode ser acessado dinamicamente a partir do código. Usarei a primeira opção e depois mostrarei como você pode usar a segunda. Na configuração, criei um processamento e o chamei de “Carregando Taxas de CBR”. Adicionei um formulário (gerenciado) e tornei-o principal. Criei os detalhes no formulário e coloquei os controles conforme mostra a figura.

Agora o mais importante é criar um link para a descrição do serviço web. Na configuração adicionamos um novo objeto do tipo WS-link. Na janela que aparece, indique o link para o WSDL (a descrição deste formato foge ao escopo do artigo, você pode ler sobre isso na Wikipedia): http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx ?WSDL.

Com base na descrição recebida, 1C criará automaticamente um mapa visual do serviço web. Você pode ver o nome do serviço web, quais operações estão disponíveis para ele, bem como os tipos de dados utilizados.

A configuração está quase completa, só precisamos fazer alguns toques para deixar nosso aplicativo esteticamente mais agradável. Clique com o botão direito na raiz da configuração e acesse o menu “Abrir interface de comando da área de trabalho”. Na janela que aparece, você precisa desmarcar a bandeira “Visibilidade” ao lado do processamento “Carregando taxas de câmbio do Banco Central”. Clique no botão OK. A seguir, clique com o botão direito na raiz da configuração e chame o menu “Abrir espaço de trabalho da área de trabalho”, lá faremos as configurações como na figura:

Essas configurações nos permitirão exibir o formulário de processamento diretamente na área de trabalho (ou seja, a área de trabalho do programa 1C) no modo 1C Enterprise.

Programação

Agora só falta dar sentido ao nosso processamento: fazer com que ele receba as taxas de câmbio e exibi-lo em uma tabela no formulário. No modo de edição de formulário, você precisa adicionar um novo comando de formulário, vamos chamá-lo de LoadCurrencies. Este comando deve estar associado a um botão localizado no formulário. Vamos preencher a ação do comando com o seguinte código (nota do autor: nossa, o hub tem destaque de código 1C, embora não funcione corretamente):

&No procedimento do cliente LoadCurrencies(Command) If NOT ValueFilled(DownloadDate) Then Report("Data de download não selecionada!", MessageStatus.Important); Retornar; fim se; CurrencyRatesTable.Clear(); LoadCurrencyRates(LoadDate); Fim do procedimento
Aqui, primeiro verificamos se a data está preenchida (se não estiver preenchida, informamos o usuário e nada mais). Em seguida, a tabela localizada no formulário é limpa e é chamado o procedimento LoadCurrencyRates(), para o qual é passada a data.

Código do procedimento LoadCurrencyRates(), explicações são dadas nos comentários do código:

Procedure LoadCurrencyRates(fDataDownload) //Cria um proxy para acessar um serviço web externo, //passa o URI do namespace, nome do serviço, nome da porta para a função. Proxy = WSLinks.CBR_DailyInfoWebServ.CreateWSProxy("http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap"); //Obtém o tipo do parâmetro que é passado para o método GetCursOnDate. TypeWSParameter = Proxy.FactoryXDTO.Packets.Get("http://web.cbr.ru/").Get("GetCursOnDate"); //Crie um parâmetro baseado no tipo e preencha o valor do parâmetro On_Date. WSParameter = Proxy.XDTO Factory.Create(WSParameterType); WSParameter.On_Date = fLoadDate; //Chama o método de serviço web, escreve o resultado na variável Taxas de Moeda. Taxas de câmbio = Proxy.GetCursOnDate(WSParameter); //Percorre a tabela ValueCursOnDate, adicione cada valor da tabela //à tabela no formulário (preencha as colunas com os valores correspondentes). Para cada elemento da moeda Rates.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate Cycle NewLineTK = CurrencyRatesTable.Add(); NewLineTK.CurrencyName = Element.Vnome; NewStringTZ.Nominal = Element.Vnom; NewLineTK.DigitalCurrencyCode = Element.Vcode; NewTZLine.CurrencyCode = Element.VChCode; Taxa NewLineTZ.Currency = Element.Vcurs; Fim do Ciclo; Fim do procedimento
Agora você pode atualizar a configuração do banco de dados (F7) e iniciar o 1C Enterprise (F5). Se você fez tudo corretamente, deverá ver uma janela como a abaixo:

Para verificar o resultado, precisamos inserir a data para a qual queremos receber as taxas de câmbio e clicar no botão “Carregar moedas”. Caso a solicitação seja bem-sucedida, a tabela do formulário será preenchida com os valores das taxas:

Por fim, quero mostrar como você pode acessar dinamicamente um web service externo, ou seja, sem adicionar um objeto link WS. Assim, podemos consumir tais serviços web a partir de processamento externo sem estar vinculados à configuração.

No procedimento LoadCurrencyRates(), uma linha

Definições = Novo WSDefinitions("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); Proxy = Novo WSProxy(Definições, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
Primeiro criamos as chamadas definições para o serviço web a partir de seu WSDL. Depois também criamos um proxy para acessá-lo.

Como você pode ver, usar serviços web externos de 1C geralmente é bastante simples (embora haja alguma dificuldade em entender a definição dos tipos, inclusive eu).

Se esta postagem ressoar aqui, há alguns outros tópicos para falar.

Serviços da Web em 1C

Este artigo discutirá a integração do 1C com os serviços web existentes e o uso do próprio 1C como um serviço web.

Neste caso, serviços web serão entendidos como sistemas que operam na Internet e proporcionam interação com eles não apenas via SOAP (que é justamente um serviço web), mas também de outras formas, incluindo solicitações HTTP(S) regulares.


Riscos de usar serviços web 1C

A plataforma 1C81 introduziu a implementação de serviços web.

Mas seu uso está repleto de riscos:

  1. 1C8 não funciona bem em HTTPS, não existem ferramentas de diagnóstico, por isso às vezes é impossível entender por que, mesmo que haja um certificado, o serviço não quer funcionar em HTTPS. A solução é implementar serviços web via CURL ou criar um túnel HTTPS.
  2. 1C8 segue suas regras para validação de esquemas WSDL. Às vezes, por razões inexplicáveis, o esquema WSDL não deseja ser carregado no link WS. Você pode descobrir o motivo apenas no fórum de parceiros de um especialista. Não existem ferramentas de diagnóstico de esquema WSDL, nem mesmo é indicado o motivo ou linha em que o carregamento do esquema é interrompido.

Regras para construção de serviços de vendas

O cliente recebe um documento de venda (recibo) somente se a transação de serviço for bem-sucedida. Caso contrário, é possível uma situação em que o cliente recebe um cheque e tem a certeza de que recebeu um serviço, mas na verdade não o recebeu.

Usando serviços SOAP externos

Os serviços da web SOAP usam esquemas WSDL e objetos XDTO para representar dados.

Carregando WSDL

Para usar um serviço externo, você precisa baixar seu esquema WSDL.

Verificando a validade do esquema WSDL

Às vezes, o esquema WSDL não carrega em 1C. Você pode verificar a validade (correção) do esquema usando qualquer validador de esquema WSDL, por exemplo http://www.validwsdl.com/.

Você precisa fazer upload do esquema para algum site http (você pode usar ftp) e indicar o endereço do arquivo no qual o esquema é carregado:

Recursos de carregamento de WSDL em 1C

A peculiaridade de carregar WSDL em 1C é que esquemas válidos podem não ser carregados. Não há validador embutido, então é necessário procurar um erro por meio de análise destrutiva, reduzindo sucessivamente o número de elementos do circuito. Você pode, por exemplo, excluir a descrição do serviço web.

Processamento para testar um serviço web externo em execução

Para testar um serviço web externo funcional, use o processamento “Test ArbitraryWebService.epf” do pacote deste artigo.

O teste pode ser usado usando o exemplo do serviço Morpher, que recusa nomes (endereço do serviço http://www.morpher.ru/WebServices/Morpher.asmx?WSDL):

Dessa forma, você pode testar qualquer serviço que possua pontos de entrada simples contendo parâmetros de tipos simples: número, data, string.

Durante o processamento, você também pode especificar o login e a senha necessários para autorizar o acesso ao serviço web.

Ferramentas padrão para serviços de depuração

Para depuração, você pode usar o programa SoapUI, que pode enviar uma solicitação arbitrária a um serviço da web e receber uma resposta dele.

SOAP e HTTPS

Infelizmente, o SOAP em 1C se comporta de maneira bastante caprichosa ao trabalhar via protocolo HTTPS, a prática mostra que é impossível conseguir uma conexão HTTPS, embora a possibilidade esteja declarada na plataforma. A falta de ferramentas de diagnóstico e depuração para descobrir os motivos pelos quais a conexão não é estabelecida está cobrando seu preço. Portanto, é conveniente usar SOAP via CURL.

O mecanismo integrado para usar HTTPS implica que todos os certificados devem ser publicados em um arquivo pem comum no diretório do programa 1C.

Usando 1C como serviço

Regras para desenvolver um serviço baseado em 1C

Operação Olá

A regra da boa forma é criar uma operação no serviço que informe que o serviço está disponível. Isso facilita a vida dos integradores, pois será mais fácil para eles verificar se a comunicação com o serviço está estabelecida.

Por exemplo, você pode usar a operação Hello sem parâmetros, que simplesmente retorna o valor booleano True.

Publicando um serviço da web

O procedimento está bem descrito na documentação: file:///C:/Program%20Files/1cv81/AddDoc/RU/V8AddDoc81.htm#_Toc176167634:

A tarefa de publicar serviços da Web se resume a colocar os arquivos de configuração *.1cws dos serviços da Web no diretório apropriado do servidor da Web com as configurações apropriadas para o servidor da Web. Para publicar serviços Web, você deve executar o comando do menu “Administração | Publicação de serviços da Web."

Como resultado da execução deste comando, a janela de publicação de serviços da Web será aberta.

A janela de publicação de serviços da Web contém o caminho para o servidor da Web e duas listas:

  • “Web services” – lista de serviços web de configuração;
  • “Publicação” - uma lista de serviços Web publicados no servidor Web especificado.

Usando o botão "Conexão...", você deve especificar o servidor web no qual deseja publicar os serviços web.

A janela de seleção do caminho do servidor web permite especificar o caminho de duas maneiras:

  • na aba “Arquivos” - este método é utilizado quando a publicação é realizada no mesmo computador em que o servidor web está instalado. O caminho é um diretório local correspondente à página da Internet a partir da qual o servidor Web publicado será chamado;
  • na guia “Site FTP” - este método é usado quando você precisa publicar um serviço Web em um computador remoto. Para publicar, você deve especificar os parâmetros da conexão FTP com o computador remoto e o diretório no qual o serviço Web será publicado.

O serviço Web selecionado é publicado usando o botão “Publicar”

Para cancelar a publicação de um serviço Web, use o botão “Excluir”.

Você pode publicar em um diretório local ou via FTP. Você também poderá publicar em um servidor remoto por meio de um caminho UNC se o servidor remoto fizer parte da rede local.

Após a publicação, o serviço web fica disponível no endereço “http://localhost/test.1cws” ou “http://xxx.ru/test.1cws”, onde xxx.ru é o endereço do servidor remoto e localhost é o endereço típico do servidor local.

Autorização para o serviço web 1C

Para acessar o serviço você precisa passar pela autenticação.

As questões de autorização são bem abordadas aqui: http://www.forum.mista.ru/topic.php?id=341168 e no arquivo de documentação:///c:/Program%20Files/1cv81/AddDoc/RU/V8AddDoc81. htm

Normalmente, um serviço da web é executado sob um usuário específico (geralmente um usuário especialmente criado). Você pode “anexar” um usuário 1C usando autenticação do Windows ao usuário do Windows IUSR_ (desativar a autorização 1C para o usuário). Alternativamente, você pode limpar a lista de usuários 1C, então a autorização não é necessária.

Se forem necessários vários usuários, você pode criar vários logins para o servidor web, atribuir um usuário do Windows a cada um deles e, consequentemente, registrar o acesso aos usuários do Windows em 1C.

Nas propriedades Usuário e Senha do objeto WSProxy, não é o login 1C que é usado, mas o login do usuário do servidor web.

Testando o serviço web 1C

Para testar 1C como um serviço web, use o processamento “Test ArbitraryWebService.epf”, conforme descrito na seção “Testando um serviço web externo em execução”.

O arquivo 1cws é uma descrição WSDL do serviço web 1C.

Usando serviços no varejo

Normalmente, os serviços de varejo são usados ​​para fornecer vários serviços à população - aceitação de pagamentos, reembolso de empréstimos, transferências de dinheiro, compra de software, etc.

Neste caso, é gerado um recibo em 1C pelo serviço prestado, no qual são salvos os parâmetros da transação. Após o qual este recibo é impresso para o cliente com informações detalhadas sobre o serviço prestado. É possível imprimir um cheque preliminar para que o cliente confirme os dados inseridos a partir de suas palavras com sua assinatura.

O serviço pode ser integrado de diferentes maneiras em um programa de varejo escrito na linguagem 1C (UT, Varejo e outros):

  1. O processamento ou código pode ser escrito na linguagem 1C, que realiza todo o trabalho com o serviço.
  2. Pode ser utilizado um programa que funcione com o serviço, e em 1C só transmite informações para perfuração de cheques.

Organização de dados de serviço em 1C

Para armazenar informações sobre uma transação em um recibo, você precisa criar uma parte tabular adicional “Vendas complexas” com os detalhes:

  • Nomenclatura – link para a nomenclatura do cheque.
  • Parâmetro - link para o livro de referência “Vendas complexas: Parâmetros”.
  • Valor - o valor do parâmetro, um tipo complexo. A representação da string deve ser bastante longa (1024 caracteres) para acomodar o texto do cheque.

O diretório “Vendas Complexas: Parâmetros” contém uma lista de parâmetros de transação.

É mais lucrativo usar a parte tabular do que um conjunto de detalhes, porque uma transação pode ter muitos deles, e em outras verificações não relacionadas ao serviço, esses dados não serão utilizados e ocuparão espaço extra. Além disso, tal solução é universal para qualquer serviço e não requer reestruturação de dados após a implementação de um novo serviço.

O vendedor recebe um marcador separado (ou impresso, para não alterar a configuração), no qual pode visualizar a placa de dados da transação do cheque.

Usando processamento em linguagem 1C

Vejamos o exemplo do serviço condicional Paym para a configuração “Varejo”.

  1. Vamos criar um elemento predefinido do diretório de nomenclatura “Paym” em 1C. No modo 1C:Enterprise, após atualizar a configuração, é necessário atribuir o tipo de produto “Serviço”.
  2. No procedimento “Adicionar item à tabela. parte" do módulo do formulário "Registro de Vendas", chamamos de processamento do trabalho com o serviço, escrito na linguagem 1C. Se o pagamento for bem-sucedido, registramos e lançamos o cheque:
Se (Nomenclatura = Diretórios.Nomenclatura.Paym) E (Tipo de transação de transferência. Tipos de operações Verifique KKM. Retorno) Então Processamento de pagamento = Funções. Dê Processamento externo ("Paym"); PaymentForm = PaymentProcessing.GetForm(); Resultado = PaymentForm.OpenModal(); Se Resultado = Indefinido Então Retorne; fim se; ThisObject.Write(DocumentWriteMode.Post); fim se;
  1. O processamento deverá imprimir o recibo preliminar (se necessário), preencher a parte tabular das vendas complexas e preparar o texto para impressão do cheque no atributo pré-definido “PaymCheckText”.
  2. No procedimento “Lançar e imprimir recibo” do módulo recibo, substituímos o nome do produto pelo salvo nos dados do recibo. O texto é substituído apenas para vendas; para devoluções, basta imprimir o nome do serviço, como de costume.
Caso contrárioSe Tipo de transação de transferência.Tipos de operaçõesVerifique KKM.Return And Selection.NomenclatureLink = Directories.Nomenclature.Paym Then //Osipov PaymMaster ComplexSales Line = ComplexSales.Find(Directories.ComplexSalesParameters.PaymReceiptText, "Propriedades"); Se Linha de Vendas Complexas estiver indefinida Então Product.Name = LP Abreviado(Linha de Vendas Complexas. Valor); fim se;

Outra questão é como garantir a conclusão da transação. Aqueles. se a transação ocorreu no serviço, como garantir que ela não se perca em 1C. A maneira mais ideal é reconciliar os registros. Mas este é um assunto para consideração separada.

Usando programas que se integram ao 1C

XDTO

XDTO é frequentemente usado em serviços da web. Aqui estão as dicas e receitas mais importantes para usar o XDTO em 1C.

XDTO na plataforma 1C

Pacotes XDTO, descritos no ramo “Objetos XDTO” da configuração, estão disponíveis para criação de tipos e objetos na fábrica global XDTO Factory. Isto não é imediatamente óbvio.

Alguns tipos no esquema não possuem nome; para obtê-los, você precisa passar pela hierarquia de tipos.

O exemplo descreveu uma lista de sistema contendo estruturas XDTO. Para criar a estrutura em si, você tinha que obter o tipo assim:

Type = Factory.Type("urna:my.ru:MasterData:Business", "Business").Properties.Get("System").Type;

Problemas comuns com XDTO

Diferentes formatos de esquema XSD

Em alguns formatos, as tags são chamadas xs:, em alguns xsd:, mas 1C entende ambos os formatos com segurança. Certa vez, houve uma situação em que o XSD foi importado para 1C normalmente sem erros, mas não criou um único pacote. O motivo foi a ausência de um atributo targetNamespace na tag, portanto, 1C não sabia em qual pacote colocar o diagrama, mas não gerou erros.

Serviço de suporte

Considerando que o serviço é uma combinação de dois sistemas - 1C e externo, podem ocorrer erros em ambos os sistemas, o que reduz a confiabilidade geral da operação.

Para facilitar a compreensão dos motivos das falhas no serviço, recomenda-se a utilização de um conjunto de medidas.

Registrando solicitações

Ligações

  • XDTO
    • Boa descrição do XDTO http://pro1c.org.ua/index.php?showtopic=214
  • Serviços da web interessantes gratuitos:
    • Aeroflot - informações sobre horários de voos
    • Morpher - declinação de nomes http://www.morpher.ru/WebServices/Morpher.aspx
  • Desmontado:
    • Instalando e usando serviços da Web
      • v8: como alterar o arquivo de configuração do apache?
      • v8: continuação do tópico com serviços web - não consigo conectar o serviço web
      • v8: continuo rastreando os serviços da Web - não consigo criar um proxy...
      • Livro de Conhecimento: v8: Usando serviços web externos em 1C:Enterprise 8;

Imprimir (Ctrl+P)

O mecanismo de serviços Web no sistema 1C:Enterprise é um meio de oferecer suporte à arquitetura orientada a serviços (SOA).
A arquitetura orientada a serviços é uma arquitetura de aplicação na qual todas as funções são definidas como serviços independentes com interfaces que podem ser chamadas. O acesso a esses serviços em uma determinada sequência permite implementar um ou outro processo de negócio.
A arquitetura orientada a serviços oferece uma nova abordagem para a criação de sistemas de informação distribuídos, nos quais os recursos de software são considerados como serviços fornecidos através de uma rede. Essa abordagem permite a rápida consolidação de componentes distribuídos (serviços) em uma única solução para dar suporte a processos de negócios específicos.
O mecanismo de serviços Web permite usar o sistema 1C:Enterprise como um conjunto de serviços em sistemas complexos distribuídos e heterogêneos, e também permite integrá-lo com outros sistemas industriais usando uma arquitetura orientada a serviços.
A configuração do sistema 1C:Enterprise pode exportar sua funcionalidade por meio de serviços da Web. As definições de serviços da Web são especificadas na árvore de configuração e ficam disponíveis para sistemas de informação arbitrários, publicando-as em um servidor da Web.
Além disso, o sistema 1C:Enterprise pode acessar serviços Web de terceiros tanto por meio de links estáticos definidos na árvore de configuração quanto por meio de links dinâmicos criados usando a linguagem integrada. Arroz. 1. Serviços web

No centro da arquitetura de serviços do sistema 1C:Enterprise 8 está o gerenciador de serviços. O gerenciador de serviços executa as seguintes funções:
● gerenciar um pool de conexões com infobases;
● suporte para descrição de serviços WSDL;
● implementação do protocolo SOAP, serialização de mensagens, chamada do serviço correspondente.
O gerenciador de serviços é executado no processo host de serviço, que desempenha a função de receber/transmitir mensagens de/para o gerenciador de serviços. O servidor web IIS ou Apache pode ser usado como host de serviço.
O gerenciador de serviços contém um conjunto de conexões por meio das quais ocorre a interação com os bancos de dados do sistema 1C:Enterprise.
O mecanismo de serviços Web implementado no sistema 1C:Enterprise suporta os seguintes padrões:
● SOAP 1.1,
● SOAP 1.2,
● WSDL 1.1,
● Perfil Básico WS-I 1.1,
● HTTP 1.1,
● TLS 1.x (TLS 1.1 e 1.2 são suportados se o certificado do cliente não precisar ser enviado ao servidor), incluindo algoritmos criptográficos,
correspondente GOST R 34.10-2001, R 34.10-94, R 34.11-94 e 28147-89;
● MTOM;
● Autenticação: Básica, NTLM/Negociar.

Para obter acesso ao serviço Web, você deve usar um endereço formado da seguinte forma:

http://host/base/ws/WebServiceName

http://host/base/ws/WebServiceAddress.

Vamos dar uma olhada mais de perto nos componentes de um endereço:

http://host/base é uma URL comum usada para acessar, por exemplo, uma infobase usando um cliente web. Se delimitadores estiverem presentes, não há suporte para especificar valores de delimitadores usando a opção de linha de comando Z para iniciar o aplicativo cliente.

ws é um sinal de que um serviço Web está sendo acessado (ao contrário de hs, que define o acesso a um serviço HTTP, veja aqui).

WebServiceName – o nome do serviço da Web. Definido na propriedade do objeto de serviço da Web.

WebServiceAddress – descreve um nome alternativo para acessar o serviço Web. Ele é definido na propriedade Nome do arquivo de publicação do objeto Serviço da Web. Ele pode ser alterado durante a publicação do serviço da Web.

As chamadas pelo nome WebServiceName e pelo endereço WebServiceAddress do serviço Web são equivalentes.

Fornecendo funcionalidade por meio de serviços da Web

Para que a funcionalidade do sistema 1C:Enterprise fique disponível para consumidores externos de serviços da Web, você precisa realizar as seguintes etapas:
● crie o número necessário de serviços Web na configuração,
● publicar serviços Web usando uma ferramenta de configuração especial.
Uma descrição do procedimento para publicação de serviços da Web e uma descrição do uso do Proxy Reverso para acessar 1C:Enterprise está escrita no Capítulo 7 “Guia do Administrador” no disco ITS.
A criação de um serviço Web consiste em:
● adicionar um objeto de configuração de serviço da Web à árvore de metadados,
● descrição das operações que o serviço Web criado pode realizar,
● descrição de parâmetros de operações de serviços Web.
O objeto de configuração de serviço da Web contém um módulo no qual são criados procedimentos na linguagem interna que são executados quando determinadas operações de serviço da Web são chamadas. Os tipos de parâmetros de operação de serviço da Web são descritos usando tipos XDTO e podem ser valores XDTO ou objetos XDTO.
O serviço da Web é chamado da seguinte forma:
● uma conexão adequada com a infobase é selecionada no conjunto de conexões; se não houver conexão necessária, uma conexão será criada;
● uma nova sessão é criada e um evento é gerado para a sessão criada Configuração de parâmetros de sessão(no módulo de sessão);
● o método de serviço da Web solicitado é chamado e o manipulador é chamado Configuração de Parâmetros de Sessão()(no módulo de sessão) cada vez que um parâmetro de sessão não inicializado é acessado.
CONSELHO. Não é recomendado realizar operações com uso intensivo de recursos no manipulador de eventos Configuração de parâmetros de sessão.
Evento Configuração de parâmetros de sessão O módulo de sessão é chamado no servidor em modo privilegiado. O módulo de serviço chamado é executado em
servidor em modo normal.
O módulo de sessão é usado para inicializar os parâmetros da sessão e executar um determinado conjunto de comandos ao chamar qualquer serviço Web do sistema 1C:Enterprise.

Exemplo de implementação de serviço da Web

Por exemplo, você precisa criar um serviço Web do sistema 1C:Enterprise, que deverá retornar a composição de sua parte tabular utilizando o número da fatura transmitida. Um exemplo semelhante usando serviços HTTP será discutido em outro artigo.
Para descrever o valor de retorno, vamos criar um pacote XDTO Dados da fatura com espaço para nome http://www.MyCompany.ru/shipment, contendo três tipos de objetos XDTO:
● Nomenclatura – para transferir dados do elemento do diretório Nomenclatura. Este tipo de objeto XDTO conterá as seguintes propriedades:
● Nome – tipo de string do namespace
Nome completo– tipo de string do namespace http://www.w3.org/2001/XMLSchema;
● Código de barras – tipo de string do namespace http://www.w3.org/2001/XMLSchema;
● PurchasePrice – tipo int do namespace http://www.w3.org/2001/XMLSchema.
Linha de fatura– para transmissão de dados em uma linha de uma fatura. Este tipo de objeto XDTO conterá as seguintes propriedades:
● Nomenclature – digite Nomenclature no namespace; é uma referência a um objeto XDTO,
que definimos acima;
● Quantidade – tipo int do namespace http://www.w3.org/2001/XMLSchema;
● Preço – tipo int do namespace http://www.w3.org/2001/XMLSchema;
● Sum – tipo int do namespace http://www.w3.org/2001/XMLSchema.
Fatura de vendas– para transmitir dados em todas as linhas da fatura. Este tipo de objeto XDTO conterá uma única propriedade:
● Composição – tipo Linha de fatura do espaço para nome http://www.MyCompany.ru/shipment. Representa uma referência a um objeto XDTO,
que definimos acima. Para que esta propriedade contenha um número ilimitado de valores, você deve defini-la
propriedade Limite superior para -1.
Depois que os tipos XDTO necessários forem criados, você deverá adicionar um novo serviço Web à configuração Dados da fatura com os seguintes valores de propriedade:

URI do namespace – http://www.MyCompany.ru/shipment;
● Pacotes XDTO – Dados da fatura;
Nome do arquivo de publicação– remessa.1cws.
O serviço Web criado deverá ter a operação Get definida com os seguintes valores de propriedade:
Tipo de retornoFatura de vendas do espaço para nome http://www.MyCompany.ru/shipment;
Possível valor vazio- instalado;
● Nome do procedimento – Obter.
Para a operação Get, você deve definir o parâmetro DocumentNumber com os seguintes valores de propriedade:
● Tipo de valor – tipo de string do namespace http://www.w3.org/2001/XMLSchema;
Direção de Transmissão – Entrada.
Após isso, você deve abrir o módulo do Web service criado e colocar neste módulo a função Get(), que será executada quando este Web service for chamado.

Função Get (DocumentNumber) Exportar //Recebe o objeto fatura pelo número passado DocumentLink = Documentos.Invoice. FindByNumber(DocumentNumber, CurrentDate()); Se DocumentLink.Empty() Então Retornar indefinido; fim se; Documento = DocumentLink.GetObject(); // Obtém tipos de objetos XDTO NomenclaturaTipo= FactoryXDTO.Type ("http://www.MyCompany.ru/shipment", "Nomenclatura"); Tipo de fatura = FactoryXDTO.Type(“http://www.MyCompany.ru/shipment”, “Fatura”); LineType da fatura = FactoryXDTO.Type("http://www.MyCompany.ru/shipment", "Linha de fatura"); // Cria um objeto de fatura XDTO Fatura = FábricaXDTO.Create(TipoFatura); Para cada linha de documento do ciclo Document.Composition // Cria objetos XDTO de linha de fatura // e nomenclaturas Linha da fatura = FactoryXDTO.Create(InvoiceStringType); Item = FábricaXDTO.Create(NomenclaturaTipo); //Preenche as propriedades do item Nomenclatura.Nome = Linha do Documento.Nomenclatura.Nome; Nomenclature.FullName = Linha do Documento.Nomenclature.FullName; Nomenclatura.Barcode = Linha do Documento.Nomenclatura.Barcode; Item.PurchasePrice = DocumentLine.Nomenclature.PurchasePrice; // Preencha as propriedades da linha da fatura de consumíveisº Linha da fatura.Item = Item; Linha.Quantidade da Fatura = Linha.Quantidade do Documento; Linha da Fatura.Price = Linha do Documento.Price; Linha.Valor da fatura = Linha.Valor do documento; //Adiciona uma linha de fatura Fatura.Composição.Adicionar(FaturaString); Fim do Ciclo; //Devolve a fatura Retornar Fatura de vendas; Função Final

Trabalhando com serviços da web de terceiros

O sistema 1C:Enterprise pode usar serviços web fornecidos por outros provedores de diversas maneiras:
● usando links estáticos criados na árvore de configuração;
● usando links dinâmicos criados por ferramentas de linguagem integradas;
● uma combinação dos métodos anteriores.
A vantagem de utilizar links estáticos é a maior rapidez, já que a descrição do serviço web do provedor é obtida apenas uma vez, no momento da criação do link. No futuro, ao acessar este serviço web, será utilizada a descrição existente do serviço web.
Ao utilizar links dinâmicos, a descrição do serviço web do fornecedor será recebida pelo sistema 1C:Enterprise sempre que o serviço web for chamado, o que, naturalmente, tornará o trabalho com este serviço web mais lento. Contudo, a vantagem desta abordagem é a capacidade de obter uma descrição atualizada do serviço web do fornecedor. Ao usar links estáticos, para obter a descrição atual do serviço web, você deve reimportar a descrição WSDL usando o configurador e salvar a configuração alterada.
Ao operar soluções de aplicativos, pode surgir uma situação em que o mesmo serviço web é fornecido em endereços diferentes (URL), mas possui exatamente a mesma descrição (WSDL). Neste caso, é necessário carregar a descrição do web service na configuração (criar um objeto na árvore de objetos de configuração), mas durante a utilização, especificar o endereço específico onde o web service está localizado. O método combinado permite que você trabalhe dessa forma. Como exemplo, considere a seguinte situação: existe um serviço web replicado que executa
alguma função. Uma solução de aplicação escrita em 1C:Enterprise utiliza os serviços deste serviço, enquanto o endereço do serviço pode ser diferente (o serviço é replicável) e a descrição é fixa. Em seguida, uma descrição do serviço web pode ser carregada na solução aplicacional, e nas configurações da solução aplicacional, prever a inserção do endereço de uma instância específica do serviço, que (o endereço) será utilizado durante a operação.
Outro método também está disponível: um link dinâmico é usado, mas o endereço do local do serviço web não é obtido do arquivo de descrição (WSDL), mas é especificado diretamente ao criar o objeto.
Ao tentar carregar uma descrição de serviço Web no configurador (criando um link estático) ou ao utilizar um link dinâmico (utilizando o objeto WS Definition), o sistema verifica a descrição de serviço Web carregada (WSDL). Se houver um erro na descrição de um serviço Web (do “ponto de vista” do sistema 1C:Enterprise), a descrição não será carregada e uma exceção será gerada. O texto da exceção conterá um diagnóstico detalhado dos motivos da falha no download. Os erros WSDL são listados na ordem em que foram encontrados. Cada erro WSDL contém uma entrada com uma descrição detalhada como esta:

<Тип элемента с ошибкой>.<Имя>
[<Тип элемента с ошибкой>.<Имя>[…]]
<Описание ошибки>
<Тип элемента с ошибкой>
<Имя>
Nesta descrição:
● O tipo de elemento com erro é o tipo de elemento WSDL. Na maioria das vezes corresponde ao nome da tag no arquivo xml que descreve o serviço da Web.
● Descrição do erro – descrição de um erro específico.
● Nome—O nome do objeto WSDL onde ocorreu o erro.

Exemplo de uso de um link WS estático

Como exemplo de uso de serviços web de terceiros, considere chamar um serviço web que foi criado anteriormente no exemplo acima

Primeiramente, você deve adicionar um novo objeto de configuração do WS-link denominado Invoice Data à árvore de configuração, que se refere ao serviço publicado. Para fazer isso, importe a descrição WSDL do serviço publicado e especifique como URL http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl. Uma descrição da importação de uma descrição WSDL está escrita em outro artigo.
Depois disso, por exemplo, no módulo fatura, você pode criar o procedimento abaixo. Preenche a parte tabular do documento com os dados da fatura do fornecedor obtidos através do serviço web do fornecedor.

Procedimento GetDataConsumableInvoice(Número da fatura do fornecedor) Proxy = WSLinks.InvoiceData. CriarWSProxy("http://www.MyCompany.ru/shipment", "Dados da fatura", "Dados da fatura"); Dados da fatura = Proxy.Get(); Se Dados da fatura = Indefinido então Retornar; fim se; //Preenche a fatura com os dados recebidos Para cada ciclo de composição de dados do LineInvoice NovaRow = DocumentObject.Composition.Add(); NovaLinha.Quantidade = LinhaIncl.Quantidade; NovaLinha.Price = LinhaIncl.Price; NewLine.Amount = RowIncl.Amount; //Encontre o item da nomenclatura usando os dados transmitidos // (por exemplo, por código de barras) NovaLinha.Nomenclatura = Diretórios.Nomenclatura. Encontrar por detalhes("Código de barras", LineInk.Nomenclatura.Código de barras); Fim do Ciclo; Fim do procedimento

Se o endereço da localização real do serviço for diferente do endereço usado ao carregar a descrição do serviço web na configuração,
então o novo endereço deverá ser especificado explicitamente ao criar o objeto WSProxy:

Exemplo de uso de um link WS dinâmico

O uso de um link dinâmico difere do uso de um link estático apenas na forma como um proxy WS é criado e não há necessidade de criar um link WS na árvore de configuração.
Se compararmos com o exemplo apresentado na seção anterior, então, ao contrário da criação de um proxy baseado em um link estático, ao usar um link dinâmico, um proxy WS é criado usando o construtor da seguinte forma:

// Cria um proxy WS baseado na definição do WS
Definição = Nova WSDefinition (“http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl”);
Proxy = Novo WSProxy (Definição, “http://www.MyCompany.ru/shipment”, “Dados da fatura”, “Dados da fatura do sabão”);
Ao criar um proxy WS baseado em um link estático, fica assim:

// Cria um proxy WS baseado no link
Proxy = WSLinks.InvoiceData. CreateWSProxy (“http://www.MyCompany.ru/shipment”, “InvoiceData”, “InvoiceData”);
Se o endereço do local real do serviço for diferente do endereço especificado no arquivo WSDL usado para criar a definição de serviços da web, o novo endereço deverá ser especificado explicitamente ao criar o objeto WSProxy a partir da definição de serviços da web:

// Cria um proxy WS baseado na definição do WS Definição = Nova SDefinições("http://www.MyCompany.ru/shipment/ws/Shipment.1cws?wsdl"); Proxy = Novo WSProxy (Definição, "http://www.MyCompany.ru/shipment", "Dados da fatura", "Dados da fatura",);

Editando Propriedades de Serviço Web

Na aba Básico, insira o nome, sinônimo e comentário do objeto.
Na aba Operações são criados objetos Operações subordinados, que, por sua vez, podem possuir objetos Parâmetros subordinados necessários para trabalhar com objetos deste tipo. A descrição dos objetos subordinados é realizada na paleta de propriedades.

Propriedades de Operação

Além das propriedades gerais dos objetos de configuração, uma operação de serviço Web contém as seguintes propriedades:

● Tipo de valor de retorno – o tipo de valor que a operação de serviço da Web retorna. Pode ser um tipo de valor XDTO ou um tipo de objeto
XDTO.
● Nulo Possível — Indica se o valor de retorno pode ser nulo.
● Em uma transação – indica se o código do módulo de serviço Web será executado em uma transação ou não. Se a propriedade estiver definida, quando o serviço Web for chamado, uma transação será iniciada automaticamente e, quando o serviço Web for concluído, a transação será confirmada ou revertida (dependendo dos resultados da execução). Se a propriedade não estiver definida, quando o módulo de serviço da Web começar a ser executado
a transação não será iniciada.
● Nome do método – nome do procedimento exportado do módulo de serviço Web que será executado quando esta propriedade for chamada.
A guia Subsistemas indica a quais subsistemas pertencem os objetos deste tipo.
Na aba Outros, são definidas as seguintes propriedades:
● URI do namespace — contém o URI do namespace do serviço Web. Cada serviço Web pode ser identificado exclusivamente por seu
nome e URI do namespace ao qual pertence. O namespace de serviço não deve ser igual aos namespaces conhecidos que já estão em uso ou reservados por outras organizações. É recomendável que o namespace do serviço inclua um fragmento exclusivo da organização que está desenvolvendo o serviço Web. Por exemplo, para uma organização chamada Promresurs, faz sentido iniciar todos os namespaces com um prefixo, por exemplo, http://promresurs.com. Então o URI do namespace do serviço da Web será semelhante a http://promresurs.com/public/services/OurService.
● Pacotes XDTO – uma lista de pacotes XDTO cujos tipos podem ser usados ​​como tipos de retorno de operação e tipos de parâmetros de operação de um serviço Web.
● Nome do arquivo de publicação – o nome do arquivo de descrição do serviço Web, localizado no servidor Web.
Clicar no botão Módulo abre o editor do módulo de serviço da Web.

Propriedades dos parâmetros
Além das propriedades gerais dos objetos de configuração, o parâmetro de operação do serviço Web contém as seguintes propriedades:
● Tipo de valor—tipo de valor do parâmetro de operação do serviço Web. Pode ser um tipo de valor XDTO ou um tipo de objeto XDTO.
● Nulo Possível — indica se o valor do parâmetro de operação pode ser nulo.
● Direção de transmissão – determina a direção da transmissão de dados usando este parâmetro. Valores possíveis:
● Entrada – significa que o parâmetro é utilizado para transmitir dados ao serviço Web;
● Saída – significa que o parâmetro é utilizado para receber dados do serviço Web;
● Entrada-Saída – significa que o parâmetro pode ser utilizado tanto para transmitir dados quanto para recebê-los do serviço Web.