Aplicación en TSD y comunicación con 1C: Enterprise 8.3 a través del servicio HTTP. Parte 1.1 (Descripción detallada de la API)

Esta parte apareció después de que comencé la implementación completa. Después de la operación de combate, era necesario cambiar la estructura del intercambio de datos. Resultó ser muy difícil introducir TSD en el trabajo. Se eligió la "plataforma móvil 1C" como software, ya que Kotlin fue muy duro. En esta parte, hablaré sobre cómo se implementó inicialmente el intercambio y proporcionaré código en el ejemplo de un directorio tanto en el lado del servidor como en el lado del cliente.

1. Descripción general del algoritmo de intercambio.


En el lado del servidor, se utilizan planes de intercambio con registro automático de cambios. La práctica ha demostrado que esta es la forma menos costosa en términos de programación. En el lado de TSD, en cada directorio, se agregó un documento, un accesorio , en los registros se agregó un accesorio con el mismo nombre.

El intercambio en sí ahora se divide en dos etapas.

  1. Recibimos nuevos datos, arreglamos una señal de actualización;
  2. Enviamos confirmación de que los datos han sido recibidos. Si la respuesta es sí, eliminamos el signo de la actualización;

Tal esquema apareció después de que el TSD comenzó a abandonar el área de cobertura WiFi. A menudo resultó que los datos llegaron, pero la respuesta no fue enviada.

Para facilitar la entrada de TSD en funcionamiento, ha aparecido un directorio con valores predefinidos para cada uno ( ).

2. Como se implementó anteriormente.


La solicitud fue iniciada por el TSD. Cada 15 segundos hubo una solicitud de nuevos datos, para cada directorio, documento, registro. Los datos se recopilan en lotes de 100 elementos. Lo que impuso sus limitaciones. Si completa el registro para todo el nodo, los datos se cargan unos 30 minutos. Porque En la implementación actual, no había ningún mecanismo para notificar al TSD sobre la presencia de otro paquete.

Un fragmento de código 1C en TSD
 () 
	
	.();
	.();

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


Después de que el número de directorios se convirtió en más de cinco, surgió una imagen triste: cada acción en el lado del servidor es la misma. La solicitud de datos es diferente. Pero arreglar los cambios para los directorios es lo mismo. Echemos un vistazo al ejemplo de OKEY. En resumen, entonces

  • Preparamos la conexión, tomamos todas las constantes.
  • Estamos preparando una solicitud. Cada directorio se encuentra en su propia ruta. Y luego sigue el comando con los parámetros. algo como esto:
    localhost/ws/okeis/getNew&node=.
  • Preparar la estructura de respuesta.
  • Obtenemos la respuesta y completamos la estructura según el código de respuesta HTTP.
  • Si tiene éxito, implemente JSON en estructuras 1C.
  • Comenzamos la transacción. Arreglamos cambios en el directorio. Confirmar transacción
  • Llamamos a la función de confirmar cambios en el lado del servidor
  • Y ahora la fijación es exactamente la misma en el lado del servidor

Inicialmente, cada directorio tenía su propio procedimiento de reparación, ahora se ve así.

Un montón de código 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 artículo aborda la implementación de la frente. No hagas esto, a menos que necesites ensamblar rápidamente un prototipo y probarlo en la batalla.

Si te gusta el artículo, en el próximo te diré cómo se implementa ahora.

All Articles