Plataforma "1C: Enterprise": ¿qué hay debajo del capó?

¡Hola, Habr!
En este artículo comenzaremos la historia de cómo funciona por dentro. plataforma "1C:Empresa 8" y qué tecnologías se utilizan en su desarrollo.

Plataforma "1C: Enterprise": ¿qué hay debajo del capó?

¿Por qué creemos que esto es interesante? En primer lugar, porque la plataforma 1C:Enterprise 8 es una aplicación grande (más de 10 millones de líneas de código) en C++ (cliente, servidor, etc.), JavaScript (cliente web) y, más recientemente, Y Java. Los proyectos grandes pueden ser interesantes al menos por su escala, porque en tales proyectos surgen con toda su fuerza problemas que son invisibles en una base de código pequeña. En segundo lugar, "1C:Enterprise" es un producto replicable, "en caja", y hay muy pocos artículos sobre tales desarrollos en Habré. También siempre es interesante saber cómo es la vida en otros equipos y empresas.

Entonces empecemos. En este artículo daremos una descripción general de algunas de las tecnologías que se utilizan en la plataforma y describiremos el panorama, sin profundizar en la implementación. De hecho, para muchos mecanismos, una historia detallada requeriría un artículo separado y, para algunos, ¡un libro completo!
Para empezar, vale la pena decidir las cosas básicas: qué es la plataforma 1C:Enterprise y en qué componentes se compone. La respuesta a esta pregunta no es tan simple, porque el término "Plataforma" (para abreviar, lo llamaremos así) se refiere a un medio para desarrollar aplicaciones comerciales, un entorno de ejecución y herramientas de administración. Se pueden distinguir a grandes rasgos los siguientes componentes:

  • clúster de servidores
  • Cliente “ligero” capaz de conectarse al servidor a través de http y su propio protocolo binario
  • Cliente para trabajar en una arquitectura de dos niveles con una base de datos ubicada en un disco duro o carpeta de red.
  • cliente web
  • herramientas de administración del servidor de aplicaciones
  • entorno de desarrollo (conocido como Configurador)
  • Entorno de ejecución para iOS, Android y Windows Phone (plataforma móvil 1C)

Todas estas partes, a excepción del cliente web, están escritas en C++. Además, está el recientemente anunciado Configurador de nueva generación, escrito en Java.

aplicaciones nativas

C++03 se utiliza para desarrollar aplicaciones nativas. Para Windows, se utiliza como compilador Microsoft Visual C++ 12 (un perfil compatible con Windows XP), y para Linux y Android, gcc 4.8, para iOS, clang 5.0. La biblioteca estándar utilizada es la misma para todos los sistemas operativos y compiladores: STLPort. Esta solución reduce la probabilidad de errores específicos de la implementación de STL. Actualmente estamos planeando migrar a la implementación STL incluida con CLang, ya que STLPort ha sido descontinuado y es incompatible con el modo habilitado para C++11 de gcc.
La base del código del servidor es 99% común, la del cliente, 95%. Además, incluso la plataforma móvil utiliza el mismo código C++ que la “grande”, aunque el porcentaje de unificación allí es algo menor.
Como la mayoría de los usuarios de C++, no pretendemos utilizar el 100% de las capacidades del lenguaje y sus bibliotecas. Por lo tanto, prácticamente no usamos Boost y una de las características del lenguaje es la conversión dinámica de tipos. Al mismo tiempo, utilizamos activamente:

  • STL (específicamente cadenas, contenedores y algoritmos)
  • herencia múltiple, incl. herencia de implementación múltiple
  • Patrones
  • y deducciones
  • punteros inteligentes (implementación personalizada)

Al utilizar herencia múltiple de interfaces (clases completamente abstractas), se hace posible un modelo de componentes, que se analizará a continuación.

Компоненты

Para garantizar la modularidad, toda la funcionalidad se divide en componentes, que son bibliotecas dinámicas (*.dll para Windows, *.so para Linux). Hay más de ciento cincuenta componentes en total; a continuación se describen algunos de ellos:

backend
Contiene el motor de metadatos de la plataforma.

cuenta
Objetos que los desarrolladores de aplicaciones utilizan para crear registros contables (planos de cuentas y registros contables)

BSL
Motor de ejecución de lenguaje integrado

Nuke
Implementación personalizada del asignador de memoria.

dbeng8
Motor de base de datos de archivos. Un motor de base de datos de servidor de archivos simple basado en ISAM, que también incluye un procesador SQL simple

wbase
Contiene las clases base y funciones para implementar la interfaz de usuario de Windows: clases de ventana, acceso GDI, etc.

Dividir en varios componentes es útil desde varios puntos de vista:

  • La separación promueve un mejor diseño, en particular un mejor aislamiento del código.
  • A partir de un conjunto de componentes se pueden montar de forma flexible diferentes opciones de entrega:
    • Por ejemplo, una instalación de cliente ligero contendrá wbase, pero no tendrá backend
    • pero en el servidor wbase por el contrario no será
    • ambas opciones, por supuesto, contendrán nuclear y bsl.

Todos los componentes necesarios para esta opción de inicio se cargan cuando se inicia el programa. Esto, en particular, es necesario para registrar clases SCOM, que se analizarán a continuación.

SCOM

Para la descomposición a un nivel inferior se utiliza el sistema SCOM, una biblioteca similar en ideología a ATL. Para aquellos que no han trabajado con ATL, enumeramos brevemente las principales capacidades y características.
Para una clase SCOM especialmente diseñada:

  • Proporciona métodos de fábrica que le permiten crear una clase a partir de otro componente conociendo sólo su nombre (sin revelar la implementación).
  • Proporciona una infraestructura de puntero inteligente para contar referencias. No es necesario monitorear manualmente la vida útil de la clase SCOM
  • Le permite averiguar si un objeto implementa una interfaz específica y convertir automáticamente un puntero al objeto en un puntero a la interfaz.
  • Cree un objeto de servicio al que siempre se pueda acceder a través del método get_service, etc.

Por ejemplo, puede describir una clase para leer JSON (por ejemplo, JSONStreamReader) en el componente json.dll.
Se pueden crear clases e instancias a partir de otros componentes; deben registrarse en la máquina SCOM:

SCOM_CLASS_ENTRY(JSONStreamReader)

Esta macro describirá una clase de grabadora estática especial, cuyo constructor se llamará cuando el componente se cargue en la memoria.
Después de esto, puede crear una instancia del mismo en otro componente:

IJSONStreamReaderPtr jsonReader = create_instance<IJSONStreamReader>(SCOM_CLSIDOF(JSONStreamReader));

Para respaldar los servicios, SCOM ofrece una infraestructura adicional bastante compleja. Para ello es fundamental el concepto de proceso SCOM, que sirve como contenedor para ejecutar servicios (es decir, desempeña el papel de localizador de servicios) y también contiene un enlace a recursos localizados. El proceso SCOM está vinculado al hilo del sistema operativo. Gracias a esto, dentro de la aplicación podrás recibir servicios como este:

SCOM_Process* process = core::current_process();
if (process)
         return get_service<IMyService>(process);

Además, al cambiar procesos lógicos (SCOM) vinculados a un hilo, se pueden obtener aplicaciones que son prácticamente independientes desde el punto de vista del espacio de información, ejecutándose dentro del mismo hilo. Así es como funciona nuestro cliente ligero con una base de datos de archivos: dentro de un proceso del sistema operativo hay dos procesos SCOM, uno asociado con el cliente y el segundo con el servidor. Este enfoque nos permite unificar la escritura de código que funcionará tanto en la base de datos de archivos local como en la versión cliente-servidor "real". El precio de tal uniformidad es elevado, pero la práctica demuestra que vale la pena.

Sobre la base del modelo de componentes SCOM, se implementan tanto la lógica empresarial como la parte de la interfaz de 1C: Enterprise.

Interfaz de usuario

Por cierto, sobre interfaces. No utilizamos controles estándar de Windows; nuestros controles se implementan directamente en la API de Windows. Para la versión Linux se ha realizado una capa que funciona a través de la biblioteca wxWidgets.
La biblioteca de controles no depende de otras partes de 1C:Enterprise y la utilizamos en otras pequeñas utilidades internas.

A lo largo de los años de desarrollo de 1C:Enterprise, la apariencia de los controles ha cambiado, pero un cambio importante en los principios ocurrió solo una vez, en 2009, con el lanzamiento de la versión 8.2 y la llegada de los "formularios administrados". Además de cambiar la apariencia, el principio de diseño del formulario ha cambiado fundamentalmente: se abandonó el posicionamiento de los elementos píxel por píxel en favor del diseño fluido de los elementos. Además, en el nuevo modelo, los controles no funcionan directamente con objetos de dominio, sino con DTO especiales (Objetos de transferencia de datos).
Estos cambios hicieron posible crear un cliente web 1C:Enterprise que replica la lógica C++ de los controles JavaScript. Intentamos mantener la equivalencia funcional entre clientes ligeros y web. En los casos en los que esto no es posible, por ejemplo debido a limitaciones de la API de JavaScript disponible (por ejemplo, la capacidad de trabajar con archivos es muy limitada), a menudo implementamos la funcionalidad necesaria utilizando extensiones de navegador escritas en C++. Actualmente admitimos Internet Explorer y Microsoft Edge (Windows), Google Chrome (Windows), Firefox (Windows y Linux) y Safari (MacOS).

Además, la tecnología de formularios administrados se utiliza para crear una interfaz para aplicaciones móviles en la plataforma 1C. En los dispositivos móviles, los controles se dibujan utilizando tecnologías nativas del sistema operativo, pero para la lógica de diseño del formulario y la respuesta de la interfaz, se utiliza el mismo código que en la plataforma "grande" 1C:Enterprise.

Plataforma "1C: Enterprise": ¿qué hay debajo del capó?
Interfaz 1C en el sistema operativo Linux

Plataforma "1C: Enterprise": ¿qué hay debajo del capó?
Interfaz 1C en un dispositivo móvil

Interfaz 1C en otras plataformas Plataforma "1C: Enterprise": ¿qué hay debajo del capó?
Interfaz 1C en el sistema operativo Windows

Plataforma "1C: Enterprise": ¿qué hay debajo del capó?
Interfaz 1C - cliente web

Fuente abierta

Aunque no utilizamos bibliotecas estándar para desarrolladores de C++ en Windows (MFC, controles de WinAPI), no escribimos todos los componentes nosotros mismos. La biblioteca ya ha sido mencionada. wxWidgets, y también usamos:

  • cURL para trabajar con HTTP y FTP.
  • OpenSSL para trabajar con criptografía y establecer conexiones TLS
  • libxml2 y libxslt para análisis XML
  • liberal para trabajar con protocolos de correo (POP3, SMTP, IMAP)
  • mimético analizar mensajes de correo electrónico
  • sqllite para almacenar registros de usuarios
  • UCI para la internacionalización

La lista continua.
Además, utilizamos una versión altamente modificada. Prueba de Google и Simulacro de Google al desarrollar pruebas unitarias.
Las bibliotecas requirieron adaptación para ser compatibles con el modelo de organización de componentes SCOM.
La prevalencia de 1C hace que la plataforma sea una excelente prueba de solidez para las bibliotecas que se utilizan en ella. Una variedad de usuarios y escenarios revelan rápidamente errores incluso en las áreas de código más utilizadas. Los corregimos nosotros mismos e intentamos devolvérselos a los autores de la biblioteca. La experiencia de interacción resulta muy diferente.
Desarrolladores cURL и liberal responder rápidamente a las solicitudes de extracción, pero el parche, por ejemplo, en OpenSSL Nunca logramos devolverlo.

Conclusión

En el artículo abordamos varios aspectos principales del desarrollo de la plataforma 1C: Enterprise. En el ámbito limitado del artículo, sólo abordamos algunos aspectos interesantes, en nuestra opinión.
Puede encontrar una descripción general de los distintos mecanismos de la plataforma. aquí.
¿Qué temas serían de su interés en futuros artículos?

¿Cómo se implementa la plataforma móvil 1C?
¿Descripción de la estructura interna del cliente web?
¿O quizás esté interesado en el proceso de selección de funciones para nuevas versiones, desarrollo y prueba?

¡Escribe en los comentarios!

Fuente: habr.com

Añadir un comentario