{"id":32465,"date":"2019-10-31T21:47:12","date_gmt":"2019-10-31T18:47:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/pro-veb-klient-1s\/"},"modified":"2026-05-20T19:17:21","modified_gmt":"2026-05-20T17:17:21","slug":"pro-veb-klient-1s__trashed","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","title":{"rendered":"Sobre el cliente web 1C","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Una de las caracter\u00edsticas agradables de la tecnolog\u00eda 1C:Enterprise es que la soluci\u00f3n de aplicaci\u00f3n, desarrollada con tecnolog\u00eda de formularios gestionados, puede ejecutarse tanto en un cliente delgado (ejecutable) en Windows, Linux y MacOS X, como en un cliente web en 5 navegadores: Chrome, Internet Explorer, Firefox, Safari y Edge, y todo esto sin modificar el c\u00f3digo fuente de la aplicaci\u00f3n. Adem\u00e1s, externamente la aplicaci\u00f3n en el cliente delgado y en el navegador funciona y se ve pr\u00e1cticamente id\u00e9ntica.<br \/>\nEncuentra 10 diferencias (debajo hay 2 im\u00e1genes):<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nVentana del cliente delgado en Linux:<\/p>\n<p><img decoding=\"async\" alt=\"Sobre el cliente web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/6a836d01f80f447302e04d1827d5eebb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa misma ventana en el cliente web (en el navegador Chrome):<\/p>\n<p><img decoding=\"async\" alt=\"Sobre el cliente web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/1cab8bdf0d9d1c9d6601219c3ae6018c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfPor qu\u00e9 creamos el cliente web? Hablando con cierta pomposidad, esta tarea nos la plante\u00f3 el tiempo. Desde hace tiempo, trabajar a trav\u00e9s de Internet se ha convertido en un requisito necesario para las aplicaciones empresariales. Al principio, a\u00f1adimos la posibilidad de trabajar a trav\u00e9s de Internet para nuestro cliente delgado (algunos de nuestros competidores, por cierto, se detuvieron en esto; otros, en cambio, abandonaron el cliente delgado y se limitaron a implementar un cliente web). Nosotros decidimos dar a nuestros usuarios la opci\u00f3n de elegir la variante de cliente que m\u00e1s les convenga.<\/p>\n<p><img decoding=\"async\" alt=\"Sobre el cliente web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/345d070d695cfc4854c485148d22d24c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa adici\u00f3n de la posibilidad de trabajar a trav\u00e9s de Internet para el cliente delgado fue un gran proyecto que implic\u00f3 un cambio completo en la arquitectura de interacci\u00f3n cliente-servidor. La creaci\u00f3n del cliente web, por otro lado, es un proyecto completamente nuevo, que comenz\u00f3 desde cero.<\/p>\n<h3>Planteamiento del problema<\/h3>\n<p>\nEntonces, los requisitos para el proyecto son: el cliente web debe hacer lo mismo que el cliente delgado, a saber:<\/p>\n<ol>\n<li>Mostrar la interfaz de usuario<\/li>\n<li>Ejecutar el c\u00f3digo del cliente escrito en el lenguaje 1C<\/li>\n<\/ol>\n<p>\nLa interfaz de usuario en 1C se describe en un editor visual, pero de forma declarativa, sin disposici\u00f3n pixel por pixel de los elementos; se utilizan aproximadamente una treintena de tipos de elementos de interfaz: botones, campos de entrada (texto, num\u00e9rico, fecha\/hora), listas, tablas, gr\u00e1ficos, etc. <\/p>\n<p>El c\u00f3digo del cliente en el lenguaje 1C puede contener llamadas al servidor, trabajar con recursos locales (archivos, etc.), imprimir y mucho m\u00e1s.<\/p>\n<p>Tanto el cliente delgado (al trabajar a trav\u00e9s de la web) como el cliente web utilizan el mismo conjunto de servicios web para comunicarse con el servidor de aplicaciones 1C. La implementaci\u00f3n en los clientes, por supuesto, es diferente: el cliente delgado est\u00e1 escrito en C++, mientras que el cliente web est\u00e1 en JavaScript.<\/p>\n<h3>Un poco de historia<\/h3>\n<p>\nEl proyecto de creaci\u00f3n del cliente web comenz\u00f3 en 2006, con un equipo de 5 personas involucradas en promedio. En etapas espec\u00edficas del proyecto, se contrataron desarrolladores para implementar funcionalidades espec\u00edficas (documentos en tabla, diagramas, etc.); por lo general, eran los mismos desarrolladores que hab\u00edan creado esas funcionalidades en el cliente ligero. Es decir, los desarrolladores reescribieron en JavaScript componentes que anteriormente hab\u00edan creado en C++.<\/p>\n<p>Desde el principio, rechazamos la idea de cualquier conversi\u00f3n autom\u00e1tica (incluso parcial) del c\u00f3digo C++ del cliente ligero a JavaScript para el cliente web debido a las profundas diferencias conceptuales entre estos dos lenguajes; el cliente web se escribi\u00f3 en JavaScript desde cero.<\/p>\n<p>En las primeras iteraciones del proyecto, el cliente web convert\u00eda el c\u00f3digo del lenguaje incorporado 1C directamente a JavaScript. El cliente ligero lo hace de manera diferente: el c\u00f3digo en el lenguaje incorporado 1C se compila a bytecode, y luego se interpreta en el cliente. Posteriormente, el cliente web tambi\u00e9n comenz\u00f3 a hacer esto: en primer lugar, esto mejor\u00f3 el rendimiento, y en segundo lugar, permiti\u00f3 unificar la arquitectura del cliente ligero y del cliente web.<\/p>\n<p>La primera versi\u00f3n de la plataforma 1C:Enterprise que soportaba el cliente web fue lanzada en 2009. En ese momento, el cliente web soportaba 2 navegadores: Internet Explorer y Firefox. En los planes iniciales estaba la inclusi\u00f3n de Opera, pero debido a problemas insuperables en ese momento con los controladores de cierre de la aplicaci\u00f3n en Opera (no se pod\u00eda rastrear con un 100% de certeza que la aplicaci\u00f3n se estaba cerrando, y en ese momento realizar el procedimiento de desconexi\u00f3n del servidor de aplicaciones 1C), tuvimos que renunciar a esos planes.<\/p>\n<h3>Estructura del proyecto<\/h3>\n<p>\nEn total, la plataforma 1C:Enterprise tiene 4 proyectos escritos en JavaScript:<\/p>\n<ol>\n<li>WebTools \u2013 bibliotecas generales utilizadas por los otros proyectos (aqu\u00ed tambi\u00e9n incluimos <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Library\">Google Closure Library<\/a><\/noindex>).<\/li>\n<li>Elemento de control <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000785.htm\">DocumentoFormateado<\/a><\/noindex> (implementado en JavaScript tanto en el cliente ligero como en el cliente web)<\/li>\n<li>Elemento de control <noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/planirovshchik\/\">Programador<\/a><\/noindex> (implementado en JavaScript tanto en el cliente ligero como en el cliente web)<\/li>\n<li>Cliente web<\/li>\n<\/ol>\n<p>\nLa estructura de cada proyecto recuerda a la estructura de los proyectos Java (o proyectos .NET \u2013 cada quien lo que prefiera); tenemos espacios de nombres y cada espacio de nombres se encuentra en una carpeta separada. Dentro de cada carpeta hay archivos y clases del espacio de nombres. En el proyecto del cliente web hay alrededor de 1000 archivos.<\/p>\n<p>Estructuralmente, el cliente web se divide grosso modo en los siguientes subsistemas:<\/p>\n<ul>\n<li>Interfaz de aplicaci\u00f3n cliente gestionada\n<ul>\n<li>Interfaz com\u00fan de la aplicaci\u00f3n (men\u00fas del sistema, paneles)<\/li>\n<li>Interfaz de formularios gestionados, que incluye alrededor de 30 controles (botones, varios tipos de campos de entrada: texto, num\u00e9ricos, fecha\/hora, etc., tablas, listas, gr\u00e1ficos, etc.)<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>Modelo de objetos accesible para desarrolladores en el cliente (m\u00e1s de 400 tipos en total: modelo de objetos de la interfaz gestionada, configuraciones de dise\u00f1o de datos, formato condicional, etc.)<\/li>\n<li>Int\u00e9rprete del lenguaje incorporado 1C<\/li>\n<li>Extensiones de navegador (se utilizan para funcionalidades no soportadas en JavaScript)\n<ul>\n<li>Trabajo con criptograf\u00eda<\/li>\n<li>Trabajar con archivos<\/li>\n<li>Tecnolog\u00eda de componentes externos que permite su uso tanto en clientes delgados como en web<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Caracter\u00edsticas del desarrollo<\/h3>\n<p>\nImplementar todo lo anteriormente descrito en JavaScript no es tarea sencilla. Quiz\u00e1s el cliente web de 1C sea una de las aplicaciones m\u00e1s grandes del lado del cliente escritas en JavaScript, con alrededor de 450.000 l\u00edneas. Utilizamos activamente en el c\u00f3digo del cliente web un enfoque orientado a objetos que simplifica el trabajo con un proyecto tan grande.<\/p>\n<p>Para minimizar el tama\u00f1o del c\u00f3digo del cliente, inicialmente utilizamos nuestro propio ofuscador, y a partir de la versi\u00f3n de la plataforma 8.3.6 (octubre de 2014) comenzamos a utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Google_Closure_Tools#Closure_Compiler\">Google Closure Compiler<\/a><\/noindex>. El efecto del uso en cifras: el tama\u00f1o del marco del cliente web despu\u00e9s de la ofuscaci\u00f3n:<\/p>\n<ul>\n<li>Nuestro propio ofuscador \u2013 1556 kB<\/li>\n<li>Google Closure Compiler \u2013 1073 kB<\/li>\n<\/ul>\n<p>\nEl uso de Google Closure Compiler nos ayud\u00f3 a aumentar la velocidad del cliente web en un 30% en comparaci\u00f3n con nuestro propio ofuscador. Adem\u00e1s, se redujo el uso de memoria por parte de la aplicaci\u00f3n entre un 15% y un 25% (dependiendo del navegador).<\/p>\n<p>Google Closure Compiler trabaja muy bien con c\u00f3digo orientado a objetos, por lo que su eficacia para el cliente web es m\u00e1xima. Closure Compiler realiza varias buenas cosas para nosotros:<\/p>\n<ul>\n<li>Verificaci\u00f3n est\u00e1tica de tipos en la etapa de compilaci\u00f3n del proyecto (asegurada mediante la cobertura del c\u00f3digo con anotaciones JSDoc). Esto resulta en una tipificaci\u00f3n est\u00e1tica muy cercana al nivel de tipificaci\u00f3n en C++. Esto ayuda a detectar un porcentaje bastante alto de errores en la etapa de compilaci\u00f3n del proyecto.<\/li>\n<li>Reducci\u00f3n del tama\u00f1o del c\u00f3digo a trav\u00e9s de ofuscaci\u00f3n<\/li>\n<li>Una serie de optimizaciones del c\u00f3digo ejecutable, como las siguientes:\n<ul>\n<li>sustituciones en l\u00ednea de funciones. Llamar a una funci\u00f3n en JavaScript es una operaci\u00f3n bastante costosa, y las sustituciones en l\u00ednea de m\u00e9todos peque\u00f1os que se utilizan con frecuencia aceleran significativamente el rendimiento del c\u00f3digo.<\/li>\n<li>C\u00e1lculo de constantes en tiempo de compilaci\u00f3n. Si una expresi\u00f3n depende de una constante, se insertar\u00e1 el valor real de la constante.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\nUtilizamos WebStorm como entorno de desarrollo para el cliente web.<\/p>\n<p>Para el an\u00e1lisis de c\u00f3digo utilizamos <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sonarqube.org\/\">SonarQube<\/a><\/noindex>, donde integramos analizadores de c\u00f3digo est\u00e1ticos. Con la ayuda de estos analizadores, supervisamos la degradaci\u00f3n de la calidad del c\u00f3digo fuente en JavaScript y evitamos que ocurra.<\/p>\n<p><img decoding=\"async\" alt=\"Sobre el cliente web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/886fe89a8c12d29d940b6b59316ea627.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00bfQu\u00e9 tareas resolvimos\/estamos resolviendo?<\/h3>\n<p>\nEn el curso de la implementaci\u00f3n del proyecto, nos enfrentamos a una serie de tareas interesantes que tuvimos que resolver.<\/p>\n<h4>Intercambio de datos con el servidor y entre ventanas<\/h4>\n<p>\nExisten situaciones en las que la ofuscaci\u00f3n del c\u00f3digo fuente puede interferir con el funcionamiento del sistema. El c\u00f3digo externo al c\u00f3digo ejecutable del cliente web, debido a la ofuscaci\u00f3n, puede tener nombres de funciones y par\u00e1metros que difieren de aquellos que nuestro c\u00f3digo ejecutable espera. El c\u00f3digo externo para nosotros es:<\/p>\n<ul>\n<li>C\u00f3digo que proviene del servidor en forma de estructuras de datos<\/li>\n<li>C\u00f3digo de otra ventana de la aplicaci\u00f3n<\/li>\n<\/ul>\n<p>\nPara evitar la ofuscaci\u00f3n al interactuar con el servidor, utilizamos la etiqueta @expose:<\/p>\n<pre><code class=\"javascript\">\/**\n * @constructor\n * @extends {Base.SrvObject}\n *\/\nSrv.Core.GenericException = function ()\n{\n    \/**\n     * @type {string}\n     * @expose\n     *\/\n    this.descr;\n\n    \/**\n     * @type {Srv.Core.GenericException}\n     * @expose\n     *\/\n    this.inner;\n\n    \/**\n     * @type {string}\n     * @expose\n     *\/\n    this.clsid;\n\n    \/**\n     * @type {boolean}\n     * @expose\n     *\/\n    this.encoded;\n}<\/code><\/pre>\n<p>\nY para evitar la ofuscaci\u00f3n al interactuar con otras ventanas, utilizamos lo que llamamos interfaces exportables (interfaces en las que todos los m\u00e9todos son exportables).<\/p>\n<pre><code class=\"javascript\">\/**\n * \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 DropDownWindow\n *\n * @interface\n * @struct\n *\/\nWebUI.IDropDownWindowExp = function(){}\n\n\/**\n * \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 1 \u0432\u043f\u0435\u0440\u0435\u0434 \u0438\u043b\u0438 \u043d\u0430\u0437\u0430\u0434\n *\n * @param {boolean} isForward\n * @param {boolean} checkOnly\n * @return {boolean}\n * @expose\n *\/\nWebUI.IDropDownWindowExp.prototype.moveMarker = function (isForward, checkOnly){}\n\n\/**\n * \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0438\u043b\u0438 \u043a\u043e\u043d\u0435\u0446\n *\n * @param {boolean} isFirst\n * @param {boolean} checkOnly\n * @return {boolean}\n * @expose\n *\/\nWebUI.IDropDownWindowExp.prototype.moveMarkerTo = function (isFirst, checkOnly){}\n\n\/**\n * @return {boolean}\n * @expose\n *\/\nWebUI.IDropDownWindowExp.prototype.selectValue = function (){}<\/code><\/pre>\n<h4>Usamos Virtual DOM antes de que se volviera mainstream)<\/h4>\n<p>\nComo todos los desarrolladores que trabajan con interfaces de usuario web complejas, nos dimos cuenta r\u00e1pidamente de que el DOM no es adecuado para trabajar con interfaces de usuario din\u00e1micas. Casi de inmediato se implement\u00f3 un an\u00e1logo de Virtual DOM para optimizar el trabajo con la interfaz de usuario. Durante el procesamiento de eventos, todos los cambios en el DOM se almacenan en memoria y, solo al finalizar todas las operaciones, se aplican los cambios acumulados al \u00e1rbol DOM.<\/p>\n<h4>Optimizaci\u00f3n del rendimiento del cliente web<\/h4>\n<p>\nPara que nuestro cliente web funcione m\u00e1s r\u00e1pido, tratamos de aprovechar al m\u00e1ximo las capacidades nativas del navegador (CSS, etc.). As\u00ed, la barra de herramientas del formulario (que se encuentra pr\u00e1cticamente en cada formulario de la aplicaci\u00f3n) se renderiza exclusivamente con los medios del navegador, utilizando un dise\u00f1o din\u00e1mico basado en CSS.<\/p>\n<p><img decoding=\"async\" alt=\"Sobre el cliente web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/116261ca79218eaa2bee9a4f5104092b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Pruebas<\/h4>\n<p>\nPara las pruebas funcionales y de rendimiento, utilizamos una herramienta de desarrollo propio (escrita en Java y C++), as\u00ed como un conjunto de pruebas basadas en <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Selenium\">Selenium<\/a><\/noindex>.<\/p>\n<p>Nuestra herramienta es vers\u00e1til: permite probar pr\u00e1cticamente cualquier programa de ventana, y por lo tanto es adecuada tanto para probar clientes ligeros como clientes web. La herramienta registra las acciones del usuario que inici\u00f3 la soluci\u00f3n de aplicaci\u00f3n \"1C\" en un archivo de script. Al mismo tiempo, se graban im\u00e1genes del \u00e1rea de trabajo de la pantalla, los est\u00e1ndares. Durante el control de nuevas versiones del cliente web, los scripts se reproducen sin la participaci\u00f3n del usuario. En caso de que la captura de pantalla no coincida con el est\u00e1ndar en alg\u00fan paso, la prueba se considera fallida, tras lo cual un especialista en calidad lleva a cabo una investigaci\u00f3n para determinar si es un error o un cambio planificado en el comportamiento del sistema. En caso de comportamiento planificado, los est\u00e1ndares se reemplazan autom\u00e1ticamente por nuevos.<\/p>\n<p>La herramienta tambi\u00e9n mide el rendimiento de las aplicaciones con una precisi\u00f3n de hasta 25 milisegundos. En algunos casos, repetimos partes del script (por ejemplo, repetimos varias veces la entrada de un pedido) para analizar la degradaci\u00f3n del tiempo de ejecuci\u00f3n con el tiempo. Todos los resultados de las mediciones se registran en un registro para su an\u00e1lisis.<\/p>\n<p><img decoding=\"async\" alt=\"Sobre el cliente web 1C\" src=\"\/wp-content\/uploads\/2019\/04\/058bab976becf6fd38b2ec668492043b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Nuestra herramienta de prueba y la aplicaci\u00f3n que probamos<\/b><\/p>\n<p>Nuestra herramienta y Selenium se complementan; por ejemplo, si un bot\u00f3n en una de las pantallas ha cambiado de ubicaci\u00f3n, Selenium puede no detectarlo, pero nuestra herramienta lo notar\u00e1, ya que realiza una comparaci\u00f3n pixel por pixel de la captura de pantalla con el est\u00e1ndar. Adem\u00e1s, la herramienta es capaz de rastrear problemas con el procesamiento de la entrada del teclado o del rat\u00f3n, ya que precisamente eso es lo que reproduce.<\/p>\n<p>Las pruebas en ambas herramientas (la nuestra y Selenium) ejecutan scripts t\u00edpicos de trabajo de nuestras soluciones de aplicaci\u00f3n. Las pruebas se inician autom\u00e1ticamente despu\u00e9s de la construcci\u00f3n diaria de la plataforma \"1C:Enterprise\". En caso de que se ralentice la ejecuci\u00f3n de los scripts (en comparaci\u00f3n con la construcci\u00f3n anterior), realizamos una investigaci\u00f3n y eliminamos la causa de la ralentizaci\u00f3n. Nuestro criterio es simple: la nueva construcci\u00f3n no debe funcionar m\u00e1s lentamente que la anterior.<\/p>\n<p>Para investigar incidentes de ralentizaci\u00f3n, los desarrolladores utilizan diferentes herramientas; principalmente se utiliza <noindex><a rel=\"nofollow\" href=\"http:\/\/apmblog.dynatrace.com\/2014\/12\/11\/dynatrace-ajax-edition-4-5-last-page-chapter-yet-story-continues\/\">Dynatrace AJAX Edition<\/a><\/noindex> de la empresa <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Dynatrace\">DynaTrace<\/a><\/noindex>. Se realiza un registro de los logs de la operaci\u00f3n problem\u00e1tica en la versi\u00f3n anterior y en la nueva, y luego se analizan los logs. En este contexto, el tiempo de ejecuci\u00f3n de operaciones individuales (en milisegundos) puede no ser un factor determinante, ya que en el navegador se ejecutan peri\u00f3dicamente procesos de servicio como la recolecci\u00f3n de basura, que pueden interferir con el tiempo de ejecuci\u00f3n de las funciones y distorsionar los resultados. Los par\u00e1metros m\u00e1s relevantes en este caso ser\u00edan el n\u00famero de instrucciones de JavaScript ejecutadas, el n\u00famero de operaciones at\u00f3micas sobre el DOM, etc. Si el n\u00famero de instrucciones\/operaciones en el mismo escenario en la nueva versi\u00f3n ha aumentado, eso casi siempre significa una disminuci\u00f3n en el rendimiento que debe ser corregida.<\/p>\n<p>Otra de las razones de la disminuci\u00f3n del rendimiento puede ser que Google Closure Compiler, por alguna raz\u00f3n, no pudo realizar la sustituci\u00f3n en l\u00ednea de la funci\u00f3n (por ejemplo, porque la funci\u00f3n es recursiva o virtual). En este caso, intentamos corregir la situaci\u00f3n reescribiendo el c\u00f3digo fuente.<\/p>\n<h3>Extensiones de navegador<\/h3>\n<p>\nEn caso de que la soluci\u00f3n de aplicaci\u00f3n necesite funcionalidad que no est\u00e1 disponible en JavaScript, utilizamos extensiones de navegador:<\/p>\n<ul>\n<li>para trabajar con archivos<\/li>\n<li>para trabajar con criptograf\u00eda<\/li>\n<li>trabajo con <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000545.htm\">componentes externos<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNuestras extensiones constan de dos partes. La primera parte es lo que se llama extensi\u00f3n de navegador (generalmente, extensiones escritas en JavaScript para Chrome y Firefox), que interact\u00faan con la segunda parte: una extensi\u00f3n binaria que implementa la funcionalidad que necesitamos. Cabe mencionar que escribimos 3 versiones de extensiones binarias: para Windows, Linux y MacOS. La extensi\u00f3n binaria se suministra como parte de la plataforma 1C:Enterprise y se encuentra en el servidor de aplicaciones 1C. Al primer llamado desde el cliente web, se carga en el computadora del cliente y se instala en el navegador.<\/p>\n<p>Al trabajar en Safari, nuestras extensiones utilizan NPAPI, y al trabajar en Internet Explorer, utilizan la tecnolog\u00eda ActiveX. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Microsoft_Edge\">Microsoft Edge<\/a><\/noindex> todav\u00eda no admite extensiones, por lo que el cliente web funciona con limitaciones.<\/p>\n<h3>Desarrollo futuro<\/h3>\n<p>\nUno de los grupos de tareas para el equipo de desarrollo del cliente web es la evoluci\u00f3n de la funcionalidad. La funcionalidad del cliente web debe ser id\u00e9ntica a la del cliente ligero; toda nueva funcionalidad se implementa simult\u00e1neamente en ambos, el cliente ligero y el cliente web.<\/p>\n<p>Otras tareas incluyen el desarrollo de la arquitectura, la refactorizaci\u00f3n, el aumento del rendimiento y la fiabilidad. Por ejemplo, una de las direcciones es avanzar hacia un modelo de trabajo as\u00edncrono. Actualmente, parte de la funcionalidad del cliente web se basa en un modelo de interacci\u00f3n sincr\u00f3nica con el servidor. El modelo as\u00edncrono se est\u00e1 volviendo m\u00e1s relevante en los navegadores (y no solo en ellos), lo que nos lleva a modificar el cliente web reemplazando las llamadas sincr\u00f3nicas por as\u00edncronas (junto con la refactorizaci\u00f3n correspondiente del c\u00f3digo). La transici\u00f3n gradual al modelo as\u00edncrono se explica por la necesidad de apoyar las soluciones lanzadas y su adaptaci\u00f3n gradual.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/315414\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS X, \u0442\u0430\u043a \u0438 \u043a\u0430\u043a \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434 5 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432 \u2013 Chrome, Internet Explorer, Firefox, Safari, Edge, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u2013 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u2013 \u0432\u043d\u0435\u0448\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 1\u0421 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pro-veb-klient-1s__trashed\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:47:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-05-20T17:17:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sobre el cliente web 1C | ProHoster","description":"Una de las caracter\u00edsticas agradables de la tecnolog\u00eda 1C:Enterprise es que la soluci\u00f3n aplicada, desarrollada con la tecnolog\u00eda de formularios gestionados, puede ejecutarse tanto en el cliente ligero (ejecutable) en Windows, Linux, como en MacOS.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 1\u0421 | ProHoster","og:description":"\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u043e\u0440\u043c, \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0432 \u0442\u043e\u043d\u043a\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c) \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043f\u043e\u0434 Windows, Linux, MacOS.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pro-veb-klient-1s__trashed","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:47:12+00:00","article:modified_time":"2026-05-20T17:17:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32465","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:00:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:58:23","updated":"2026-01-21 11:00:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=32465"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32465\/revisions"}],"predecessor-version":[{"id":173305,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32465\/revisions\/173305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/24269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=32465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=32465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=32465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}