Aplicativo no TSD e comunicação com 1C: Enterprise 8.3 através do serviço HTTP. Parte 1.1 (Descrição detalhada da API)

Esta parte apareceu depois que iniciei a implementação completa. Após a operação de combate, houve a necessidade de alterar a estrutura da troca de dados. Acabou sendo muito difícil introduzir o TSD no trabalho. “Plataforma móvel 1C” foi escolhida como o software, Kotlin foi muito difícil. Nesta parte, falarei sobre como a troca foi implementada inicialmente e fornecerei código no exemplo de um diretório, tanto no lado do servidor quanto no lado do cliente.

1. Descrição geral do algoritmo de troca.


No lado do servidor, são usados ​​planos de troca com o log de alterações automático. A prática mostrou que esta é a maneira menos dispendiosa em termos de programação. No lado do TSD, em cada diretório, foi adicionado um documento, adereços , nos registros, adereços com o mesmo nome.

A troca em si agora está dividida em duas etapas.

  1. Recebemos novos dados, corrigimos um sinal de atualização;
  2. Enviamos confirmação de que os dados foram recebidos. Se a resposta for sim, removemos o sinal da atualização;

Esse esquema apareceu depois que o TSD começou a deixar a área de cobertura Wi-Fi. Muitas vezes, os dados chegaram, mas a resposta não foi enviada.

Para facilitar a entrada do TSD em operação, um diretório com valores predefinidos apareceu para cada um ( ).

2. Como foi implementado anteriormente.


A solicitação foi iniciada pelo TSD. A cada 15 segundos, havia uma solicitação de novos dados, para cada diretório, documento e registro. Os dados são coletados em lotes de 100 elementos. O que impôs suas limitações. Se você concluir o registro para o nó inteiro, os dados serão carregados cerca de 30 minutos. Porque na implementação atual, não havia mecanismo para notificar o TSD sobre a presença de outro pacote.

Um pedaço de código 1C no TSD
 () 
	
	.();
	.();

	.();
	.();
			
	.();
	.();
	
	.();
	.();
	
	.();
	.();


Depois que o número de diretórios passou a ser mais de cinco, surgiu uma imagem triste: cada ação no lado do servidor é a mesma. A solicitação de dados é diferente. Mas corrigir alterações nos diretórios é a mesma coisa. Vamos ver o exemplo de OKEY. Em suma, então

  • Preparamos a conexão, pegamos todas as constantes.
  • Estamos preparando uma solicitação. Cada diretório está em sua própria rota. E então o comando com parâmetros segue. algo como isto:
    localhost/ws/okeis/getNew&node=.
  • Prepare a estrutura de resposta
  • Nós obtemos a resposta e preenchemos a estrutura, dependendo do código de resposta HTTP.
  • Se for bem-sucedido, implemente o JSON nas estruturas 1C.
  • Começamos a transação. Corrigimos alterações no diretório. Confirmar transação
  • Chamamos a função de confirmar alterações no lado do servidor
  • E agora a fixação é exatamente a mesma no lado do servidor

Inicialmente, cada diretório tinha seu próprio procedimento de correção, agora parece com isso.

Muitos códigos 1C

	
 () 
HTTP = .HTTP();
	HTTP = .HTTP("okeis", "getAll?node="+(..()));
	
	 = HTTP.(HTTP);
	
	 =  ;
	.("", .);
	.("", .());

	 . = 200 
		 = .;
		 = .JSON();
		  .("") 
			();
			 = ;
			    .okeis 
				 = .code;
				 = .name;
				 = .fullName;
				 = .internationalReduction;
				
				 = ..();
				
				 () 
					 = .();
				
					 = ..();
				;
				
				. = ;
				. = ;
				. = ;
				. = ;
				. = ;
				
				
					.();
				
					 = ;
					;
				;
				
			;
			
			   
				();
			
				();
			;
		;			
	;




 get()
	
	 .URL.("") = "getAll" 
		
		(0,"  ");
		
		 = ..("node");
		
		 = ();
		 = HTTP(200, );
		
		(0,"  ");
		 ;
	;

	 = HTTP(400,  (",", , " "));
	 ;




 () 
	
	 =  ;
	. = "
	               |	.  
	               |
	               |	.  
	               |
	               |	.";
	
	 = .();
	 = .();
	
	 =  ;
	
	 .() 
		.( ("code", ..));
	;
	
	 =  ;
	.("okeis", );
	
	
	HTTP = .HTTP();
	HTTP = .HTTP("okeis", "dataObtained?node="+(..()));
	
	 = .();
	
	HTTP.();
	
	 = HTTP.(HTTP);
	
	 . = 200 
		();
		 = ;
				
		      
			 = ..(.code).();
			. = ;
			
				.();
			
				 = ;
				;
			;
				
		;
		
		   
			();
		
			();
		;
		
	;
	



 post()
	
	 = .URL.("");

	  = "dataObtained" 
		
		 = ..("node");
		 = ..("nameStructure");

		 = .();
		 = JSON();
		
		 =  ("", , , );
		
		  
			 = HTTP(200,  ("code", 0));
		
			 = HTTP(400,  ("code", 100));
		;
		
		 ;
	;
	 
	 = HTTP(400,  (",", , " "));
	 ;



 (, , , )
	
	 = ();
	
	();
	 = ;
	    [] 
		
		 = [].(.code);
		
		 () 
			
				.(,);
			
				 = ;
				;
			;	
		;
	;
	
	  
		();
		 ;
	
		();
		 ;
	;
	
	


Este artigo discute a implementação da testa. Não faça isso, a menos que você precise montar rapidamente um protótipo e testá-lo em batalha.

Se você gostou do artigo, no próximo, mostrarei como ele é implementado agora.

All Articles