Contactos

El proceso de trabajo en segundo plano finalizó de forma anormal. El proceso de trabajo en segundo plano finalizó de forma anormal. Obtener un objeto de trabajo

Pregunta: El proceso de trabajo en segundo plano falló...


¡Buenas tardes a todos y que tengan una buena semana!)
Contabilidad empresarial, edición 3.0 (3.0.46.11).
Plataforma 8.3.9.2033.
Al publicar documentos en grupos, se produce el error "El proceso de trabajo en segundo plano finalizó de forma anormal". No se dan razones...
Reiniciar el servidor SQL, el servidor 1C (nunca se sabe) no ayuda... ¿Quizás alguien ha encontrado un problema similar? Incluso es difícil decir cuándo apareció este error porque hace mucho tiempo que no utilizamos la ejecución grupal (cerrando el mes)...

Respuesta:() () Buenas tardes nuevamente) Encendí la revista de tecnología y encontré estas cosas interesantes (¿tal vez sabes cuál es el problema?):
Se intentó realizar una operación en un objeto que no es un socket...
El proceso termina. Llamada saliente denegada...
No se encontraron servidores que alojen el servicio...

Pregunta: trabajos en segundo plano


Plataforma 1C: Enterprise 8.3 (8.3.9.2170), configuración BP 3.0.
La configuración configura la integración a través de fuentes de datos externas (tipo DBMS - OracleDatabase). Se han agregado una serie de tablas desde las cuales se cargan datos maestros y transacciones. Porque Había muchos datos, por lo que se decidió realizar una descarga por lotes mediante trabajos en segundo plano. El tamaño de la porción es 100 000, el tamaño del lote es 10 000, el número de transacciones en el documento es 1000 y el número de trabajos en segundo plano que se ejecutan simultáneamente es 8.
Ejecuto, cargo, todo está ok. Pero si lo pongo por la noche, siento que 1c entra en modo de suspensión, es decir. Después de un tiempo, como muestra el registro, los trabajos en segundo plano se inician, pero no se completan. Como resultado, resultó que las tareas comenzaron a las 12 de la noche y se completaron a las 8 de la mañana (cuando moví el mouse) y luego continuaron ejecutándose en modo normal. Lo ejecuté tanto en clientes ligeros como pesados. Hay una configuración en los parámetros: el tiempo para quedarse dormido en una sesión pasiva es 1200, pero ¿esto no se aplica solo al cliente ligero y podría ser un problema? No quiero desactivar esto, porque... los usuarios no salen del programa, déjenlos quedarse dormidos. ¿Alguien ha encontrado un problema similar? ¿Cómo lo decidiste?

Respuesta:

No existe tal posibilidad.

¿Cuál es el punto de ejecutar un trabajo en segundo plano y esperar a que se complete?
¿Para no crear más de 8 tareas en segundo plano?

Arrastre el "administrador" de trabajos en segundo plano al lado del servidor y déjelo controlar...

Ejecuté entre 40 y 50 tareas en segundo plano en el Pentuim D840; el vuelo fue normal, luego estuvo limitado por el procesador/memoria.

Pregunta: Cómo transferir un archivo a un trabajo en segundo plano


Plataforma 8.3.6.2152
Debe transferir el archivo de UV a un trabajo en segundo plano para su posterior procesamiento.
Hice esto:
&EnCliente
Procedimiento Comando1(Comando) FileDD = New BinaryData(FileName); StorageAddressForBackground = PlaceInTemporaryStorage(FileDD, UniqueIdentifier); Iniciar UploadLoadOnServer (StorageAddressForBackground) EndProcedure & Función OnServer StartUploadLoadOnServer (StorageAddressForBackground) Parámetros del método = Nueva matriz; MethodParameters.Add(StorageAddressForBackground); Trabajo = BackgroundTasks.Run("MyGeneralModule.MyBackground", MethodParameters); Función final
En el módulo general:

Procedimiento MyBackground(StorageAddress) Exportar FileDD = GetFromTemporaryStorage(StorageAddress); Si TypeValue(FileDD) = Type("BinaryData") Entonces Registro de asiento de diario Registro de asiento de diario("Depurar","Sin DD"); Terminara si ; Fin del procedimiento Intenté esto: PlacedFiles = New Array; PlacedFiles.Add(NewDescriptionofTransferFile(FileName)); PlacedFiles = Nueva matriz; Si NO es PlaceFiles(PlaceFiles, PlaceFiles, False, UniqueIdentifier), entonces regresa; Terminara si ; StorageAddressForBackground = PlacedFiles.Storage; Intenté esto: StorageAddressForBackground = PlaceInTemporaryStorage(Undefined, UniqueIdentifier); PlaceFile (Dirección de almacenamiento para fondo, Nombre de archivo, Falso);
Normalmente se transfiere desde el fondo al cliente mediante almacenamiento temporal, pero por alguna razón no se transfiere del cliente al fondo.

Respuesta: En general, todo resultó bastante sencillo. Resulta que puedes pasar estúpidamente datos binarios como parámetro a un trabajo en segundo plano. Para que los aficionados no cualificados citen referencias y les digan que "así es como estaba previsto", el código de trabajo es:
&EnCliente
Procedimiento Comando1 (Comando) Iniciar UploadLoadOnServer (Nuevos datos binarios (Nombre de archivo)) EndProcedure
&OnServer Función StartUploadLoadOnServer(DD) Parámetros del método = Nueva matriz; MethodParameters.Add(DD); Trabajo = BackgroundTasks.Run("MyGeneralModule.MyBackground", MethodParameters); Procedimiento EndFunctions Exportación MyBackground(FileDD) Si TypeValue(FileDD) = Tipo("BinaryData") Entonces Registro de asiento de diario("Depuración","Sí DD"); De lo contrario Registro de asiento de diario("Depurar","Sin DD"); Terminara si ; Fin del Procedimiento

Pregunta: Ejecutar un trabajo en segundo plano con el usuario deseado


¡Hola!
Hay 1C:Enterprise 8.3 (8.3.11.2924), cliente - servidor UT 11.3.4.93.
En esta configuración, los movimientos en el registro "Liquidaciones con clientes sobre documentos" no se realizan en el momento de la contabilización del documento, sino con la tarea rutinaria "Ejecución de movimientos diferidos en liquidaciones con clientes\proveedores".
Al mismo tiempo, a veces la tarea de rutina generaba un error, porque Intenté realizar movimientos en un período cerrado (antes de la fecha de prohibición de edición). En la configuración de la tarea rutinaria registramos un usuario especial cuya fecha de prohibición estaba abierta, después de lo cual todo empezó a funcionar.
Sin embargo, es necesario garantizar que estos movimientos en los registros se realicen en el momento en que se publica el documento y no cuando se inicia el trabajo en segundo plano según el cronograma.
Si ejecuta el código en sí, que realiza una tarea de rutina al publicar un documento, se produce el mismo error: el período está cerrado. Y si ejecuta mediante programación una tarea en segundo plano que ejecuta el mismo código en el momento en que se publica el documento, se produce exactamente el mismo error, porque el período se cierra y el trabajo en segundo plano, iniciado mediante programación, se inicia con el nombre del usuario actual y se cierra su fecha de prohibición. Sin embargo, cuando se inicia un trabajo en segundo plano de acuerdo con un cronograma, que tiene el usuario "correcto" instalado en el programador, todo va a la perfección. A continuación se explica cómo hacer esto mediante programación, cómo ejecutar mediante programación una tarea en segundo plano con el usuario deseado "a través del programador" como lo hacen las tareas programadas estándar, ¿por favor dígame?

Respuesta:

¿No es para quien está configurado?
Esto debe ser un error de configuración.

Lis2007 dijo:

Hola, a la vez a veces la tarea de rutina generaba un error, porque... Intenté realizar movimientos en un período cerrado (antes de la fecha de prohibición de edición). En la configuración de la tarea de rutina, registramos un usuario especial cuya fecha de prohibición estaba abierta, después de eso todo empezó a funcionar.

Haga clic para ampliar...

Pregunta: Depurar un trabajo en segundo plano


El trabajo en segundo plano se está ejecutando con un error. Decidí depurarlo.
Lo lanzo mediante procesamiento externo con una línea:
BackgroundTasks.Run("MiMódulo.MiTarea");
No se alcanza el punto de interrupción en el módulo.
Se permite la depuración en el servidor, se verifica la depuración, se habilita la conexión automática y se habilitan los trabajos en segundo plano. ¿Qué más podría ser el problema?

Respuesta: En los módulos comunes, había una llamada a funciones que requerían la ejecución del cliente en lugar de la del servidor. Tuve que ponerlos entre paréntesis #Si Cliente Entonces. El de fondo también funcionó.

Pregunta: Error al realizar un intercambio


Buenas tardes Dime dónde cavar:
Realizo un intercambio en la base de datos contable. Se cargan alrededor de tres docenas de documentos desde UT-shka mediante un intercambio estándar. Piensan durante mucho tiempo (alrededor de una hora) y terminan con el mensaje:
El proceso de trabajo en segundo plano falló

Probablemente, cada programador de 1C 8.3, tarde o temprano, tuvo que configurar la ejecución de ciertas tareas de acuerdo con un cronograma. A continuación daré una descripción detallada de estos mecanismos, espero que sea información útil para los programadores novatos de 1C. Esto es muy conveniente porque no requiere acción humana, la tarea rutinaria se configura una vez y funciona de acuerdo con su horario.

Encontrará instrucciones detalladas utilizando un ejemplo a continuación.

¿Qué son las tareas rutinarias y en segundo plano en 1C?

  • Tareas programadas es un mecanismo especial de 1C Enterprise 8.3 diseñado para realizar una acción específica de acuerdo con un cronograma determinado.
  • Trabajo en segundo plano- objetos generados por una tarea de rutina que realiza directamente la acción prevista sin la participación del usuario o programador 1C 8.2.

El mecanismo de trabajos programados y en segundo plano funciona en modo cliente-servidor (SQL), gracias a la funcionalidad del DBMS. Si tiene una base de datos de archivos, la tarea también se puede configurar, pero según un principio ligeramente diferente.

Configuración de trabajos en segundo plano en modo cliente-servidor 1C

Primero, creemos un nuevo objeto de metadatos: una tarea de rutina. Llamaré a mi tarea "Cargar tipos de cambio". Veamos la paleta de propiedades de este objeto de configuración:

Obtenga 267 lecciones en video sobre 1C gratis:

  • Nombre del método— ruta al procedimiento que se ejecutará en un trabajo en segundo plano según un cronograma determinado. El trámite debe estar en un módulo común. Se recomienda no utilizar los estándar, sino crear los suyos propios. ¡No olvide que los trabajos en segundo plano se ejecutan en el servidor!
  • Uso- una señal de que está utilizando una tarea rutinaria.
  • Predeterminado— indica si la tarea de rutina está predeterminada. Si desea que la tarea de rutina funcione inmediatamente después de colocarse en la base de datos, especifique esta marca. De lo contrario, deberá utilizar el procesamiento de Job Console o hacer que el trabajo se ejecute mediante programación.
  • Número de reintentos cuando un trabajo finaliza de forma anormal— cuántas veces se reinició el trabajo en segundo plano si se ejecutó con un error.
  • Intervalo de reintento cuando el trabajo finaliza de forma anormal— con qué frecuencia se reiniciará el trabajo en segundo plano si se completó con un error.

Y el escenario más interesante es Cronograma:

Aquí configura el intervalo de inicio del procedimiento especificado en el campo "Nombre del método". Digamos que configuré

¡Atención!¡No olvide desactivar el bloqueo de la ejecución de trabajos de rutina y en segundo plano a nivel de DBMS!

Esto se puede hacer en la utilidad de administración de la versión cliente-servidor o al crear una nueva base de datos:

Configuración de tareas de rutina en modo de archivo 1C

En modo archivo, configurar este tipo de trabajos es algo más difícil. Para tal tarea, se debe iniciar una sesión separada del programa 1C. Esto suele solucionarse creando un usuario "técnico" cuya sesión esté siempre activa.

En modo archivo, un trabajo de rutina se inicializa cuando se inicia el método “RunTaskProcessing()”.

Para un usuario específico, puede configurar este método para que se ejecute utilizando otro método:

ConectarWaitHandler( <ИмяПроцедуры>, <Интервал>, <Однократно>).

  • Nombre del procedimiento— el nombre del procedimiento conectado como controlador de espera. El nombre del procedimiento exportado de un módulo de aplicación administrado (un módulo de aplicación normal) o un módulo compartido global. El trámite debe estar ubicado en el cliente..
  • Intervalo— período entre ejecuciones de operaciones en segundos.
  • Una vez- cómo completar la tarea, una vez o no.

ConectarWaitHandler, 3600);

Un video de dos minutos que muestra cómo configurar una tarea de rutina en el configurador 1C:

Probablemente, ni una sola configuración seria en 1C 8.3 u 8.2 pueda funcionar sin el uso de tareas de rutina y en segundo plano. Son muy convenientes, ya que se ejecutarán según un cronograma claramente definido sin intervención del usuario o programador.

Por ejemplo, necesitas intercambiar datos con otro programa una vez al día. Utilizando tareas rutinarias y en segundo plano, 1C podrá realizar estas acciones de forma independiente, por ejemplo, fuera del horario laboral. Este método no afectará la experiencia del usuario de ninguna manera y ayudará a ahorrar tiempo.

Primero, averigüemos qué significan y cuál es su diferencia:

  • Tarea programada le permite lanzar cualquier acción específica de acuerdo con un cronograma preconfigurado.
  • Trabajo en segundo plano Es un objeto que contiene las acciones a realizar.

Supongamos que nuestra empresa vende algo y tiene su propio sitio web en el que se muestran los precios. Queremos subirlos una vez al día para mantener la relevancia.

Abra la configuración y agregue una tarea programada.

Configuración de propiedades

Veamos los parámetros más importantes que deben completarse en sus propiedades.

  • En el campo " Nombre del método» selecciona el procedimiento de un módulo general específico que se ejecutará directamente. Le indicará todos los pasos para subir precios a nuestra web. Tenga en cuenta que la ejecución se llevará a cabo en el servidor. Esto es lógico porque las operaciones rutinarias se realizan sin la participación del usuario.
  • La tarea programada se puede desactivar o activar según sea necesario. No es necesario editar su agenda cada vez. Para hacer esto, en la paleta de propiedades, configure o borre la bandera " Uso».
  • Otra cosa importante es establecer si esta tarea de rutina será predeterminado, O no. Las tareas programadas predefinidas se inician automáticamente. Si esta función no está instalada, deberá iniciarlas mediante programación o utilizar el procesamiento de la "Consola de tareas" con ITS.
  • También puedes especificar Número de repeticiones e intervalo entre ellas. en caso de terminación anormal. La terminación anormal se refiere a aquellas situaciones en las que los trabajos no se completaron debido a un error.

Configurar un horario

El último paso es configurar un cronograma para nuestra carga al sitio usando el hipervínculo correspondiente en la paleta de propiedades.

Verá una configuración de horario típica en 1C 8.3. Aquí no hay nada complicado. En este ejemplo, configuramos el lanzamiento de nuestra carga de precios en el sitio todos los días de cinco a siete de la mañana. En el caso de que la tarea programada no tenga tiempo de completarse antes de las 7:00, se completará al día siguiente.

Bloquear tareas programadas

Ejecute la utilidad estándar "Administración de servidores empresariales 1C" y abra las propiedades de la base de datos donde creó la tarea de rutina (para las versiones cliente-servidor de 1C).

En la ventana que se abre (después de ingresar su nombre de usuario y contraseña para acceder a la seguridad de la información), verifique que la casilla "El bloqueo de tareas rutinarias está habilitado" no esté seleccionada. Si encuentra una situación en la que la tarea no funciona, verifique esta configuración primero.

De la misma forma, puedes desactivar por completo las tareas rutinarias en 1C 8.3. Para deshabilitar trabajos en segundo plano específicos, puede utilizar el procesamiento de la “Consola de trabajos en segundo plano” integrado en las últimas versiones.

Tareas en segundo plano y programadas en modo archivo

En este modo, configurar y ejecutar estas tareas es mucho más difícil de organizar. La mayoría de las veces se crea una cuenta adicional, cuya sesión siempre estará abierta.

En este caso, las tareas rutinarias se activan mediante el método “RunTaskProcessing()”.

También puedes utilizar la siguiente construcción:

Como nombre del procedimiento, debe especificar el nombre del procedimiento del cliente que se ejecutará. El intervalo muestra cuántos segundos después tendrá lugar la ejecución. El parámetro "Única vez" no es necesario. Refleja si este procedimiento se realizará una o varias veces.

Errores de seguimiento en trabajos en segundo plano

Puede ver el progreso de los trabajos en segundo plano, así como la presencia de posibles errores, en el registro. En el filtro, establezca la selección en la aplicación "Trabajo en segundo plano" y, si es necesario, seleccione la importancia de interés, por ejemplo, solo "Errores".

El registro mostrará todas las entradas que coincidan con su selección, junto con un comentario que le ayudará a comprender el motivo del error.

Concepto de programación asincrónica

El concepto de programación asincrónica es que el resultado de una función no está disponible inmediatamente, sino después de un tiempo en forma de alguna llamada asincrónica (que viola el orden normal de ejecución).

Aquellos. La idea principal de la programación asincrónica es emitir llamadas a métodos individuales y continuar realizando otros trabajos en paralelo sin esperar a que finalicen las llamadas.

Algunos métodos que minimizan la probabilidad de excepciones no requieren un enfoque asincrónico, pero otros lo requieren desde el comienzo del desarrollo.

Como puede verse en los gráficos, no existe un coeficiente de acciones interactivas útiles del usuario con un modelo de programación sincrónico, ya que el sistema bloquea la interfaz de usuario, mientras que con un modelo asincrónico, el usuario continúa trabajando activamente en el sistema.

Cuando se ejecuta de forma sincrónica, la aplicación tiene un solo subproceso. Con el modelo de programación asincrónica, puede ejecutar varios subprocesos en paralelo y reaccionar a nuevas acciones de los usuarios a medida que se ejecutan. Una vez que se ejecuta el n-thread, muestra el resultado en la pantalla.

Tareas en segundo plano en 1C:Enterprise 8

En 1C:Enterprise 8, los trabajos en segundo plano están diseñados para realizar tareas de aplicaciones de forma asincrónica. Pueden generar trabajos secundarios en segundo plano, por ejemplo, para paralelizar cálculos complejos entre diferentes servidores en funcionamiento del clúster en un modo de operación cliente-servidor.

Es posible restringir la ejecución de trabajos en segundo plano que tengan los mismos métodos según un criterio de aplicación específico. La creación y gestión programática de trabajos en segundo plano es posible desde cualquier conexión de usuario a la base de información del sistema. El trabajo en segundo plano se ejecuta en nombre del usuario que lo creó.

El mecanismo de tareas funciona tanto en el modo de operación cliente-servidor como en el modo de archivo, pero las capacidades para administrar y ejecutar tareas en ambas versiones son algo diferentes.

Opción cliente-servidor

En la versión cliente-servidor, la programación de tareas la realiza el programador de tareas, que se encuentra físicamente en el administrador del clúster.

El programador comprueba periódicamente si se ha recibido alguna solicitud para ejecutar trabajos en segundo plano. Si hay trabajos que deben ejecutarse, el programador determina los procesos de trabajo menos cargados en el clúster y asigna secuencialmente a cada uno de ellos su tarea a ejecutar. Por lo tanto, el mismo proceso de trabajo puede potencialmente ejecutar múltiples trabajos en paralelo. Después de que un proceso de trabajo recibe un trabajo, el proceso de trabajo establece una conexión con la base de datos y ejecuta el trabajo dentro de esa conexión. Una vez completado el trabajo, el proceso de trabajo notifica al planificador si el trabajo se completó con éxito o sin éxito.

Opción de archivo

A partir de la versión 8.3.3.641 de la plataforma, los desarrolladores han simplificado significativamente el trabajo con trabajos en segundo plano en la versión de archivo.

Anteriormente, para ejecutar tareas automáticamente, era necesario iniciar una sesión adicional separada de 1C:Enterprise, utilizada como programador de tareas. Y en esta sesión fue necesario ejecutar periódicamente el método del lenguaje incorporado. EjecutarProcesamiento de tareas(). Este enfoque era bastante engorroso, inconveniente y limitaba en gran medida el uso de tareas rutinarias y en segundo plano en la versión de archivo del trabajo.

Ahora todo se ha vuelto mucho más fácil. Si se inicia un cliente ligero o pesado, y también si el servidor web tiene conexiones de cliente, en cada una de estas aplicaciones se inicia automáticamente otro hilo con una conexión a la base de datos. Estos subprocesos se dedican a realizar tareas rutinarias y en segundo plano.

Cada una de las aplicaciones enumeradas realiza sus propias tareas en segundo plano. Si una aplicación ha iniciado varios trabajos en segundo plano, se ejecutan secuencialmente, en el orden en que se recibieron.

La obvia desventaja de los trabajos en segundo plano de 1C: dado que se ejecutan en el lado del servidor, no hay posibilidad de trabajo interactivo con el usuario (por ejemplo, es imposible mostrar un mensaje u otra información; todos estos datos deben almacenarse dentro de la base de información y procesarse posteriormente en de alguna manera).

Cabe señalar que los trabajos en segundo plano son puramente objetos de software y no se pueden almacenar en la base de datos. Es decir, solo podemos crear una instancia de una clase, inicializar sus propiedades y lanzarla para su ejecución.

Un ejemplo de ejecución de código asíncrono en 1C:Enterprise 8

“Escribir programas en los que se desconoce el resultado de una llamada a una función es mucho más difícil que los normales. Llamadas anidadas, manejo de errores, control de lo que sucede: todo se vuelve más complicado”, esto lo dirán sólo aquellos que no saben cómo utilizar correctamente las capacidades de la plataforma, ¡pero nosotros no!

¡Demostremos la simplicidad y elegancia de la ejecución de código asíncrono en 1C:Enterprise 8!

Paso 1. Creemos un nuevo sistema de seguridad de la información para el desarrollo de configuraciones.

Paso 2. En la configuración agregaremos el módulo general “Asynchronous Handlers”

¿Por qué agregamos un módulo compartido? Aquí todo es simple: para realizar operaciones asincrónicas en 1C:Enterprise 8, se utilizan trabajos en segundo plano, que tienen su propio administrador: "BackgroundTask Manager". Este objeto tiene un método "Ejecutar", con la ayuda del cual se inicia la tarea en segundo plano.

Pasemos al asistente de sintaxis.

Entonces necesitaremos un módulo común.

Paso 3. En el módulo general “Manejadores asíncronos” agregaremos el procedimiento de exportación OurLongOperation()

Procedimiento OurLongOperation(Duración) Exportar // Simulación de una acción a largo plazo (Duración seg.). FechaInicioOperación = FechaActual(); Mientras que CurrentDate() - Fecha de inicio de la operación< Длительность Цикл КонецЦикла; КонецПроцедуры

Etapa 4. Agregue procesamiento de “Concepto de programación asincrónica” a la configuración (puede crear procesamiento externo)

Agregue un atributo al formulario:

Duración (Número)

y dos equipos

Realizar operación larga;

Realice una operación larga y larga de forma asincrónica.

Paso 5. Según el asistente de sintaxis, complete el módulo del formulario.

&En el procedimiento del cliente Realizar operación de larga duración (comando) ExecuteLong-RunningOperationOnServer(); EndProcedure &OnServer Procedimiento ExecuteLongOperationOnServer() AsynchronousHandlers.OurLongOperation(Duration); Fin del procedimiento &En el procedimiento del cliente Realizar una operación de larga duración de forma asincrónica (comando) Realizar una operación de larga duración de forma asincrónica en el servidor (); Fin del procedimiento &En el procedimiento del servidor Realice una operación de larga duración de forma asincrónica en el servidor() Parámetros = Nueva matriz; Parámetros.Agregar(Duración); BackgroundTasks.Execute("AsynchronousHandlers.OurLongOperation", Parámetros, Nuevo Identificador Único, "Ejemplo de concepto de programación asincrónica"); Fin del Procedimiento

Paso 6.¡Lanzamos y comprobamos!

Resultado:

Si hacemos clic en el botón “Realizar operación larga”, la interfaz de usuario se bloquea durante los segundos de “Duración”;

Si hacemos clic en el botón "Realizar operación de larga duración de forma asincrónica", la interfaz de usuario no se bloquea y el código del programa se ejecuta en paralelo.

Podemos verificar que el código del programa se ejecuta de forma asincrónica mirando el registro.

Podemos depurar el código del programa que se ejecuta en "segundo plano" si configuramos la propiedad apropiada en los parámetros de depuración.

Un ejemplo de ejecución de código asíncrono en 1C:Enterprise 8 usando BSP

Consideremos un ejemplo de implementación del concepto de programación asincrónica en 1C:Enterprise 8 en BSP usando el ejemplo del procesamiento de "Asuntos actuales".

La lógica es la siguiente: cuando se inicia el programa, se inicializa el área de trabajo de la página de inicio, donde se puede mostrar el formulario de procesamiento "Asuntos de actualidad". Este formulario lo completa la actualidad del usuario y lleva tiempo completarlo. Si los desarrolladores no tuvieran la capacidad de ejecutar código de forma asincrónica, entonces la interfaz de usuario se bloquearía mientras se completaba el formulario de procesamiento.

Analicemos el código del programa del formulario.

El evento del formulario "Cuando CreadoEnServidor" llama al procedimiento "RunBackgroundTask"; esto es lo que necesitamos.

Sin distraernos con los matices, analicemos este procedimiento.

Y aquí vemos que se utiliza el administrador de trabajos en segundo plano y su método "Ejecutar". Tenga en cuenta que los desarrolladores almacenan una identificación única para el trabajo en segundo plano.

Para hacer esto, los desarrolladores utilizan el método. ConectarWaitHandler(<ИмяПроцедуры>, <Интервал>, <Однократно>).



En el procedimiento enganchado Conectable_CheckTaskComplete() los desarrolladores llaman a la función Trabajo completado (ID de tarea)


Esta función verifica la ejecución de un trabajo en segundo plano por identificador.

Cabe señalar que el BSP ha desarrollado módulos generales para respaldar las operaciones del servidor a largo plazo.

Por lo tanto, el concepto de programación asincrónica en 1C:Enterprise 8 aumenta ligeramente la complejidad de resolver problemas para el desarrollador, pero mejora significativamente la funcionalidad del programa desde el punto de vista del usuario.

Nos permite realizar cualquier cálculo en el sistema sin que el usuario lo note, es decir, en segundo plano. Además, este mecanismo nos permite paralelizar el proceso de cálculo. Incluso podemos paralelizar el procedimiento que se ejecutará. Para hacer esto, nuestro trabajo en segundo plano debe ejecutar varios trabajos en segundo plano más. En este caso los procesos están paralelizados y, si tenemos un sistema multiprocesador y multinúcleo, nuestro algoritmo funcionará de manera eficiente. Después de iniciar varios procesos, podemos decirle al sistema que debe esperar a que finalicen estos procesos para poder combinar de alguna manera el resultado.

Por ejemplo, en configuraciones típicas, mientras el usuario está trabajando, se ejecutan varios tipos de trabajos de servicio en segundo plano. Esto puede evidenciarse mediante entradas de registro que registran el hecho de que se realizaron dichas acciones. Además, esto no afecta de ninguna manera el trabajo del usuario, simplemente no los nota.

Idealmente, se implementa un trabajo en segundo plano en una versión cliente-servidor, en cuyo caso toda la carga va al servidor. En cuanto a la versión del archivo, es posible realizar un trabajo en segundo plano, pero tiene algunas peculiaridades.

Esto es lo que producirá el sistema si no tiene en cuenta estas características y ejecuta un trabajo en segundo plano en la versión de archivo de la base de datos.


El trabajo en segundo plano de 1C tiene algunas limitaciones. Dado que se ejecuta en el lado del servidor, no hay posibilidad de trabajo interactivo con el usuario. Por ejemplo, no puede mostrar un mensaje ni ninguna información. Todos estos datos deben almacenarse dentro de la base de información y procesarse posteriormente de alguna manera.
Al comunicarse con el asistente de sintaxis, puede obtener información más detallada sobre los trabajos en segundo plano de 1C. Cabe señalar aquí que este objeto es puramente software y no se almacena en la base de datos de ninguna manera. Es decir, creamos una instancia de la clase, inicializamos las propiedades y la lanzamos para su ejecución.

¿Qué herramientas tenemos para gestionar trabajos en segundo plano? Esta instalación es un objeto de metadatos. "Administrador de tareas en segundo plano". Este objeto tiene un método. "Correr", con este método, se inicia el trabajo en segundo plano.

Tiene los siguientes parámetros:
"Nombre del método"- el nombre del procedimiento o función a ejecutar, y debe ser un procedimiento o función del contexto del servidor;

"Opciones"- una matriz de parámetros, cuyo número de elementos debe corresponder al número de parámetros de nuestro procedimiento/función especificado en el parámetro "Nombre del método";

"Llave"- una determinada clave de unicidad, que es una línea mediante la cual el sistema comprende si es necesario iniciar una tarea en segundo plano o si dicha tarea ya se está ejecutando;

"Nombre"- aquí puede especificar una descripción arbitraria de nuestro método.

El valor de retorno es un objeto. "Tarea de fondo", que contiene el nombre del método actual, la clave actual y varias propiedades y métodos más. Uno de esos métodos es el método "Espera completa". Su propósito es que podamos decirle al sistema que no haga nada hasta que se complete el trabajo en segundo plano.

Trabajo en segundo plano 1C 8.2, 8.3 - Ejemplo de uso

Pongamos un ejemplo de cómo trabajar con trabajos en segundo plano de 1C. Primero, crearemos un algoritmo simple que cargará brevemente el sistema 1C de tal manera que no podamos hacer nada en este momento.

Para esto:

1. Creemos un módulo común. "Controladores de tareas en segundo plano", que se compilará en el lado del servidor;


2. En él describiremos el procedimiento de exportación. "ProduceBackgroundCalculation(Parámetro)", que toma un parámetro de tipo cadena;

Procedimiento PerformBackgroundCalculation(Parámetro) ExportStartTime = CurrentDate(); Mientras que CurrentDate() - Hora de inicio< = 6 Цикл КонецЦикла ; КонецПроцедуры Процедура КнНажатие() ОбработчикиФоновыхЗаданий. ПроизветиФоновоеВычисление("Algún parámetro") ; Fin del Procedimiento
Listo. Ahora, cuando comienzas a procesar y presionas un botón, el sistema se congela durante varios segundos, durante los cuales no se puede hacer nada. Esto es exactamente lo que necesitábamos hacer.

Ahora nos aseguraremos de que estos cálculos se realicen en segundo plano, es decir, para que la tarea en segundo plano 1C 8.2, 8.3 se ejecute, pero no interfiera con nosotros.

Para esto:

1. Durante el procesamiento, en el evento de clic del botón, escriba el siguiente código.

Procedimiento KnPress() Parámetros = Nueva matriz; Opciones. Agregar( "Algún parámetro") ; Tarea de fondo. Correr ( "Manejadores de tareas en segundo plano. Realizar cálculo en segundo plano", Parámetros, Nuevo Identificador Único, "Prueba") ; Fin del Procedimiento

Aquí pasamos el nombre del procedimiento del módulo común como primer parámetro y una matriz de parámetros como segundo. Al tercer parámetro se le debe pasar una clave única y al cuarto parámetro una descripción de nuestro procedimiento.



¿Te gustó el artículo? Compártelo