Recibir datos a través de una conexión com desde 1s. V8: conexión COM. Recibir y comparar enumeraciones a través de una conexión COM

Pregunta: Análisis de un sitio usando COM IE 11


Buen día.!
La pregunta es muy conocida, es necesario tomar la información del sitio. Pero hay matices:
1. No hay forma de ir directamente a la página de autorización (primero vaya a la página de inicio, haga clic en el enlace Iniciar sesión, obtenga el formulario de autorización y solo luego inicie sesión).
2. Debe visitar el sitio web a través de barra de búsqueda busque datos, luego léalos y busque nuevamente (los datos pueden estar en ruso e inglés, es decir, si los datos para la búsqueda están en ruso, entonces debe buscar en la "versión rusa" del sitio, y este es otro enlace a otra página. Es el mismo problema con el inglés).

Eventualmente:
- vaya a la página de inicio - inicie sesión - busque datos - (vaya a otra versión del sitio, si es necesario) - tómelo.

Problema:
Los datos no se leen en la propiedad "documento" cuando se sigue un enlace.
Ocurre en dos puntos:
- cuando seguimos el enlace para iniciar sesión (esto no es un botón, sino simplemente un enlace);
- cuando cambiamos el idioma en el sitio (también un enlace).

Nota
Si, antes de seguir un enlace en la etapa de autorización, recibe un enlace, cierra el com y lo abre nuevamente con la transición a través del método IE.navigate("link"), entonces los datos en la propiedad "documento" funcionan normalmente. Pero no podrás hacer lo mismo al cambiar el idioma en el sitio, porque... Necesito iniciar sesión nuevamente y además no quisiera resolver este problema exactamente así.

Aquí está el código:

&En el procedimiento del cliente SetWaitingIE(IE, SecondCall=False) Si NO IE.Busy Entonces D = CurrentDate() + 3; Mientras D >= CurrentDate() Bucle si IE.Busy luego cancelar; terminara si; Fin del ciclo; terminara si; Mientras que IE.Busy Loop EndLoop; Mientras que IE.ReadyState< 4 Цикл КонецЦикла; Попытка Если IE.Document.ReadyState = Null Тогда IE.Refresh(); УстановитьОжиданиеИЕ(IE); КонецЕсли; Пока IE.Document.ReadyState <>Ciclo "completo" EndCycle; Excepción si se realiza una segunda llamada y luego se regresa; De lo contrario Enlace = IE.LocationURL; IE.Salir(); IE = GetCOM("InternetExplorer.Aplicación"); IE.Navigate(Enlace); SetExpectIE(IE, Verdadero); terminara si; intento final; EndProcedure &OnClient Función PerformUserAuthorization(IE, Enlace, Inicio de sesión, Contraseña, Autorizado=False, SC=0) Elementos de intento = IE.Document.GetElementsByName("nombre de usuario"); Si Elements.Length = 1, entonces para cada El de Elements Loop El.Value = Login; Fin del ciclo; terminara si; Elementos = IE.Document.GetElementsByName("contraseña"); Si Elements.Length = 1, entonces para cada El de Elements Loop El.Value = Contraseña; Fin del ciclo; terminara si; IE.Document.GetElementById("ID").Click(); Establecer esperaIE(IE); Autorizado = Verdadero; Excepción si CN > 3, entonces devuelve falso; terminara si; IE.Salir(); IE.Navigate(Enlace); Establecer esperaIE(IE); MF = MF + 1; Si PerformUserAuthorization (IE, enlace, inicio de sesión, contraseña, SCH) entonces devuelve Verdadero; terminara si; intento final; Devolución autorizada; EndFunction &OnClient Procedimiento Upload(Comando) SpTables = GetListTablesForUpload(); Si SpTables = False, entonces regresa; terminara si; IE = GetCOM("InternetExplorer.Aplicación"); Para cada fila de SpTable.SOURCE_LIST Ciclo RA = Row.ID; Recurso = Cadena.RECURSO; IE.Navigate(Recurso); Establecer esperaIE(IE); Pruebe si Line.NEW_PAGE_IN_LOGIN = 1 Entonces Clases = IE.Document.GetElementsByClassName("ClassName"); Si Classes.Length = 1 Entonces, para cada clase de Classes Loop Resource = Class.All(0).Href; Abortar; Fin del ciclo; Probando IE.Quit(); IE = IE.Navigate(Recurso); Establecer esperaIE(IE); Informe de excepción("¡La conexión al sitio "" +String.NAME + "" falló!"); Abortar; intento final; De lo contrario Report("¡La conexión al sitio "" +String.NAME + "" falló!"); Abortar; terminara si; terminara si; Si NO es PerformUserAuthorization(IE, Resource, String.LOGIN, String.PASSWORD) Then Report("¡La autorización del usuario en el sitio "" + String.NAME + "" no se ha completado!"); Abortar; terminara si; Recurso = IE.LocationURL; Lista de personas = SpTable.FACE_CODES.FindLines(Nueva estructura("FUENTE", RA)); ListaNoEncontrada = Nueva matriz; Para cada persona de la lista de personas, ciclo PersonName = Person.NAME_IN_SITE; Esto es ruso = CharacterCode(PersonName, 1) >= 1040; TechResource = ?(Esto es ruso, StrReplace(Resource, "en_US", "ru_RU"), StrReplace(Resource, "ru_RU", "en_US")); Si TekResurs<>IE.LocationURL Luego RootClasses = IE.Document.GetElementsByClassName("ClassName"); Si RootClasses.Length = 1, entonces para cada RootClass de RootClasses Loop Classes = RootClass.Children; Abortar; Fin del ciclo; GrupoAm = Falso; Grupo Ru = Falso; Para cada clase del bucle de clases Si HPreg(Class.ClassName) = "encabezado desplegable" Entonces AmGroup = Find(Class.InnerText, "Americans") > 0; RuGroup = Buscar(Class.InnerText, "Europa") > 0; ElseIf HPreg(Clase.NombreClase)<>"seleccionado" Entonces, si AmGroup y Find(Class.All(0).InnerText, "English") > 0 O RuGroup y Find(Class.All(0).InnerText, "Russia") > 0, entonces IE.Navigate(Class .Todos(1).Href); Establecer esperaIE(IE); Abortar; terminara si; terminara si; Fin del ciclo; terminara si; terminara si; IE.Document.GetElementById("ID").Value = NombreDePersona; FindButton = IE.Document.GetElementById("ID"); BotónBuscar.Enfoque(); FindButton.Click(); Intentando SetExpect(IE); //Circuta los datos recibidos ExceptionListNotFound.Add(Person); Continuar; intento final; Fin del ciclo; Informe de excepción("Error:" + Símbolos.PS + ErrorDescription()); Abortar; intento final; Fin del ciclo; IE.Salir(); Fin del Procedimiento

Respuesta:

El tema es muy interesante, pero personalmente, lamentablemente, no tengo ni la experiencia ni la oportunidad de comprender de alguna manera este problema. Si puedes encontrar información sobre este tema, por favor compártela.
--- Una asociación mensajes, 29 de abril de 2016 ---

Según tengo entendido, ¿no hay acceso a la base de datos SQl?

--- Fusión de mensajes, 29 de abril de 2016 ---

Bueno, si se analiza, ¿qué tipo de acceso?

Pregunta: Conexión COM 1C 8.3 - 1C 8.3 ¿Es posible ingresar al depurador en la conexión?


Quería preguntar a los miembros del foro si es posible depurar cuando me conecto a través de una conexión COM utilizando el procesamiento desde una base de datos en la plataforma 8.3.6 (BP 3.0) al módulo de conexión externa de una base de datos escrita por mí mismo (que también ejecuta en la plataforma 8.3.6) y llamar a las exportaciones desde sus procedimientos utilizando el procesamiento? Actualmente, las bases de datos se basan en archivos y están ubicadas en una PC, pero está prevista una versión de servidor. Hasta ese momento, utilizaba las construcciones siguientes para transmitir código arbitrario para su ejecución a través de una conexión COM, así como para registrar errores. A continuación se muestran fragmentos de procedimientos en la base de datos autoescrita en el módulo de conexión externa:

Función ExecuteIn(CodeExecute, Parámetro auxiliar = "") Exportar
Control de seguridad(); // Protección contra intentos de ejecutar código malicioso al conectarse externamente en nombre de otro usuario Respuesta = "0" //Si no es necesario devolver nada, entonces si no hay errores en el código  // devuelve simplemente OK  //Porque El código transmitido puede contener errores, entonces envolveremos su ejecución en un intento. Intente ejecutar (CodeExecute); // Ejecuta el código como una cadena en otra computadora a través de una conexión COM (Módulo de conexión externa de Libra Base) Excepción //si hay un error, devolvemos su texto Respuesta = ErrorDetailView(ErrorInfo()); Intento final; Devolver respuesta; EndFunction Función TestConnection(InParameter, OutParameter) ExportSecurityCheck(); // Protección contra intentos de ejecutar código malicioso al conectarse externamente en nombre de otro usuario. OutParameter = "¡Hay una conexión con la base de la báscula a través de una conexión COM!"; Devuelve Verdadero; Función final
Desde BP 3.0 ejecuto el siguiente fragmento:
Intentar
Com = Nuevo COMObject("V83.COMConnector"); Conexión = Com.Connect ("File=""C:\1 c\Base_1C\Libra""; Usr=""ComExchange""; Pwd=""1"";"); TellUser("¡Prueba aprobada! Hay una conexión a la base de datos de la báscula"); Error de excepción = ErrorDetailView(ErrorInfo()); TellUser("¡No hay conexión COM con la base Libra! Detalles"+Error); Com=Indefinido; Devolver ; Intento final; Fuera = ""; En = "1"; Si Connection.Communication Test(In, Out) Then TellUser("¡La prueba de comunicación con la configuración de la báscula fue exitosa! Respuesta: "+Out); De lo contrario, TellUser("¡Falló la prueba de comunicación con la configuración de la báscula! Respuesta: "+Fuera); Terminara si ;
Entiendo, por supuesto, que no será posible ingresar al operador Ejecutar (CodeString1C8), pero ¿existe esa posibilidad al llamar a un procedimiento de módulo remoto? conexión externa desde la base de datos principal Connection.TestConnections(In, Out) para ingresar su código en la misma sesión del depurador en la función Security Check() de su procedimiento de llamada?
Ya miré la documentación que pude encontrar sobre este tema. Configuré las opciones para habilitar la depuración y los puntos de interrupción en todas partes en ambas configuraciones. Lancé ambos configuradores.
¿Es incluso posible en esta situación depurar el procedimiento Security Check() más en el lado del módulo de conexión externo?

Pregunta: Dirección IP incorrecta en la conexión COM


Existe un procesamiento que transfiere documentos a través de V83.ComConnector entre servidores. El servidor 1 (versión 1C 8.2.19.90) siempre se conecta al servidor 2 (versión 8.3.8.2033). La línea de conexión contenía la dirección IP del servidor 2 y todo funcionó bien. En el servidor 1 también vi la plataforma instalada como en el servidor 2, versión 8.3.9.2033 (si esto es importante).

El problema es que en el Servidor 2 la dirección IP cambió, el procesamiento por supuesto dejó de funcionar y cuando ingresé una nueva IP en la línea de conexión, el procesamiento genera un error, cuya descripción sigue siendo la IP anterior (!) y el texto. “Un intento de establecer una conexión no tuvo éxito porque no se recibió la respuesta requerida de otra computadora dentro del tiempo requerido, o el conexión establecida debido a una respuesta incorrecta de una computadora ya conectada."

Reiniciaron todo, borraron cachés, etc., los administradores juran que todo está bien de su parte, puedes iniciar sesión de un servidor a otro a través de RDP, etc.

¿Qué puede estar mal, cómo puedo solucionarlo? ¡Busqué en Internet y no pude encontrar tal situación!

Respuesta:() ¡100% seguro! El segundo día lo intento, como escribí, lo miro con un depurador, incluso creé un estúpido procesamiento unicelular para una prueba de conexión, aparece ese error y listo.

Pregunta: Conexión COM a diferentes versiones.


Hola a todos.
Tengo una base de datos tipo "Consolidación", que recopila diferentes datos de diferentes bases de datos y reúne todo en una sola pila. El problema es que necesitas conectarte a estas bases de datos a través de com, pero son versiones diferentes, por lo que al final aparece un error como
¡Error de conexión! (ExternalProcessing.TransferHistory.Form.Form.Form(12)): Error al llamar al método de contexto (Connect): Se produjo una excepción (V83.COMConnector. 1): No coinciden las versiones del cliente y del servidor 1 C:Enterprise Client las versiones difieren y servidor (8.3.8.1964 - 8.3.6.2332), aplicación cliente: conexión COM

Configuré una conexión, otra se cae...

Sé que de alguna manera, a través del servicio de componentes, puedes crear “tus propias clases (conectores)” para cada versión y luego crear un Nuevo Objeto COM correspondiente a la versión de plataforma de la clase... tal vez me equivoque.

Ayúdame a superar este problema...

Respuesta: Eso es todo... eliminaré la pregunta...

Pregunta: Error de comunicación al procesar el llenado


Hola.
8.2 Comercio minorista 1.
Me conecto a 8.1 No es una configuración típica.
Me conecto vía com a la base de datos e intento crear un documento, pero al llamar a “CreateDocument()” o “GetObject()” ocurre un error en el procedimiento. ProcesamientoRelleno. ver figura

Intento lo mismo en la base de datos 8.1, pero no hay ningún error y tampoco entro al procesamiento de llenado.
¿Qué podría estar mal?

Respuesta: turboq, ¡un módulo de documento escrito torcidamente!

Agregado después de 5 minutos.
¡Ella no es llamada! ¡Está intentando compilar! Pero como al conectarse a través de ComConnector el problema del modo de diálogo NO EXISTE, el módulo de documento no se puede compilar.
Para tales casos, cuando sea necesario implementar el trabajo con un diálogo en un módulo de objeto, use instrucciones para el preprocesador

Este no es tu error, sino un error en el módulo de documento en la base de datos a la que te estás conectando.

En la base de datos, el código se ejecuta en el cliente y hay un Modo de Diálogo, por lo que todo sucede sin errores.

No utilice ComConnector, V8.Application para la conexión, entonces las cosas de la interfaz estarán disponibles para usted

Agregado después de 5 minutos.
=======================================================================================================================
de la descripción de la conexión externa (SP) Destaqué en negrita lo que deberías leer sobre ComConnections

Descripción:

En general, trabajar con 1C:Enterprise 8 a través de una conexión externa es similar a trabajar con 1C:Enterprise en modo de automatización del servidor. Las principales diferencias son las siguientes:

  • En el caso de un servidor de automatización, se inicia una aplicación 1C:Enterprise 8 completa y, en el caso de una conexión externa, se inicia un servidor COM en proceso relativamente pequeño.
  • No disponible cuando se trabaja a través de una conexión externa funcionalidad, de una forma u otra relacionada con la organización de la interfaz de usuario de 1C:Enterprise 8;
  • Cuando se ejecuta una conexión externa, el módulo de aplicación administrada (módulo aplicación regular) configuración 1C:Enterprise 8. Su función cuando se trabaja con una conexión externa la desempeña el módulo de conexión externa.
Al utilizar una conexión externa, existen las siguientes ventajas en comparación con el uso de un servidor de automatización:
  • Configuración de conexión más rápida ya que no es necesario crear ningún proceso separado Sistema operativo y todas las acciones se realizan dentro del proceso de llamada;
  • Acceso más rápido a las propiedades y métodos de los objetos 1C:Enterprise, ya que organizar un acceso no requiere comunicación entre procesos;
  • Menor consumo de recursos del sistema operativo.
Para organizar el acceso a los datos de 1C:Enterprise 8 a través de una conexión externa, se realiza la siguiente secuencia de acciones:
  • se crea un administrador de conexiones COM, con la ayuda del cual se establece la conexión;
  • se realiza una llamada al método Connect del administrador de conexiones COM. El método Connect devuelve una conexión externa con base de información 1C: Empresa 8;
  • a través de una conexión externa se accede a métodos, propiedades y objetos válidos de la infobase con la que se establece la conexión.
¡Importante! Debido a la falta de una interfaz de usuario, no todos los objetos, propiedades y métodos se pueden utilizar en una conexión externa.
La unión exterior proporciona Acceso completo a su contexto global. Por tanto, una conexión externa como sus métodos puede tener: constantes del sistema, valores de objetos especificados en el configurador, cuyo acceso se realiza mediante administradores (por ejemplo, constantes, enumeraciones, directorios, documentos, registros de documentos, informes , procesamiento, planes de tipos de características, planes de cuentas, planes de tipos de cálculo, registros), así como las variables declaradas en el módulo de conexión externa con la palabra clave Exportar.

Disponibilidad:

Integración.

Pregunta: Conexión COM, plan de tipo de características.


La tarea consiste en crear mediante programación un nuevo elemento en un plan conocido de tipos de características a través de una conexión COM. La conexión está establecida, aquí todo está bien.

Escribo así:

TypeDescriptionTech = New TypeDescription("DirectoryLink. Contrapartes"); PurposeProperties = Conexión. Planos de Tipos de Características. Fines de las propiedades de las categorías de objetos. Buscar por nombre(“Directorio “Personas””); NuevoElemento = Conexión. Planos de Tipos de Características. Propiedades del objeto. CrearArtículo(); Nuevo elemento. Nombre = Nombre de propiedad; Nuevo elemento. Asignación de propiedad = Asignación de propiedad; Nuevo elemento. ValueType = DescripciónTypesTech;

La última línea no funciona. Y esto es comprensible, encuentra ese tipo para la base de datos donde se ejecuta 1C, pero necesito un tipo para la base de datos adjunta. ¿Cómo conseguirlo?

En mi versión, simplemente se crea un elemento con el tipo de valor "Lista personalizada". En principio funciona, pero algo feo.

Plataforma 8.3. Una conexión COM es un requisito previo. Las soluciones sin su uso no son de interés.

Respuesta:

Rollos. Gracias, funcionó.

Pregunta: Conexión COM. Problema de parámetro de consulta


Buen día.
Problema con la solicitud mediante conexión COM.

Perem TK; ArrayItems = COM.NewObject("Array"); Para cada línea de la nomenclatura del ciclo TZNomenclature = COM.Directories.Nomenclature.GetLink(COM.NewObject("UniqueIdentifier", Abbr(String.Nomenclature.Identifier))); Matriz de nomenclatura.Add(Nomenclatura); Fin del ciclo; Si ArrayItems.Cantidad()<>0 Entonces Solicitud = COM.NewObject("Solicitud"); Request.Text = "SELECT |PricesItemsSliceLast.Commodities AS Nomenclatura, |PricesItemsSliceLast.SalePrice AS Precio, |PricesItemsSliceLast.RateVAT, |PricesItemsSliceLast.RateNP |FROM |RegisterInformation.PricesSliceLast(|&DateDoc, |T ipPrices = &TypePrices |Y Inventario Inventario B ( &Matriz de Nomenclatura) |E Inventario y Materiales.EsteGrupo = FALSE |Y Documento de ENLACE del Registrador.Configuración de Precios de Venta) AS NomenclaturaPreciosSliceLast"; Request.SetParameter("Matriz de elementos", Matriz de elementos); Request.SetParameter("DataDoc", EndDay(ParametersStructure.DataDoc)); Request.SetParameter("PriceType", COM.Directories.PriceTypes.GetRef(COM.NewObject("UniqueIdentifier", ParameterStructure.PriceType.Identifier))); TZ = COM.NewObject("Tabla de valores"); TK = Solicitud.Ejecutar().Cargar(); De lo contrario, TK = Nueva tabla de valores; TK.Columns.Add("Nomenclatura"); TK.Columns.Add("Precio"); TK.Columns.Add("Porcentaje"); TK.Columns.Add("tipo de IVA"); terminara si;

El problema está precisamente en el artículo o en una serie de artículos; si los configura como parámetro, la solicitud devuelve precios vacíos; si no especifica este parámetro en absoluto, entonces la solicitud devuelve los datos correctos.
En la consola de consultas de esa misma base de datos externa se procesa todo sin problemas.
¿Qué podría estar mal?

Respuesta:

Intente hacerlo a través de VremTable. Cree una tabla de valores con columnas resp. por ejemplo, complételo, incorpórelo a la solicitud y luego aplíquelo con una conexión interna.

Pregunta: Conexión COM desde la base de datos de archivos a la base de datos de archivos


Buen día. Tengo una base de datos de archivos 8.3, desde la cual estoy intentando conectarme a otra base de datos de archivos mediante una conexión COM:

Directorio = "C:\Users\1C\Workflow (prueba)"; Usuario = "Administrador"; Contraseña = ""; Parámetros de conexión = "Archivo="+Directorio+";Usr="+Usuario+";Pwd="+Contraseña+";"; V83 = Nuevo COMObject("V83.COMConnector"); Intento de conexión = V83.Connect(ConnectionParameters); Informe de excepción ("¡No se pudo conectar al flujo de documentos!"); intento final;


Se lanza una excepción, sin descripción del error.
Ambas bases de datos se ven obligadas a iniciarse en 8.3. El directorio y el usuario están especificados correctamente. ¿Cuál podría ser la razón?

Respuesta:

Escribo la línea de código V82 = New COMObject(" V83.COMConnector"); y el resto del código es el siguiente, sin cambios.

Cuando las versiones de las plataformas de origen y de destino son diferentes, se produce un error.

¿No está claro qué versión de la biblioteca registrar y dónde registrarla?

Creo que necesito registrar la biblioteca, versión 8.2.18.61, y lo hago mediante un archivo bat.

regsvr32 /n /i:usuario "C:\Archivos de programa (x86)\1cv82\8.2.18.61\bin\comcntr.dll"
pausa

msk-test1c:1641 - este es el servidor 8.3.5.1098
V82 = Nuevo COMObject("V82. COMConnector"); Informe ("Conéctese a Contabilidad 3.0..."); Intento de conexión = V82. Connect("srvr = ""msk-test1c:1641""; ref = ""db_test""; usr = ""Administrador""; pwd = ""123"""); Notificar ("¡Viva la conexión establecida!"); Informe de excepción ("¡No hay conexión a la base de datos!"); Informe(DescripciónError()); // Información = Información acerca del error(); // Informe("Descripción= "" + Info.Descripción + """); // Informe ("NombreMódulo= "" + Info.NombredelMódulo + """); // Informe ("LineNumber=" + Info.LineNumber); // Informe ("SourceLine= "" + Información.CadenaFuente + """); Retorno; EndAttempt;

¿Dónde registrar la biblioteca, en el cliente, en el servidor 8.2, en el servidor 8.3? La siguiente figura.
(para la versión cliente-servidor y para la versión de archivo de la base de datos 1C)

Respuesta: Había una tarea para comunicarse con un terminal a través de un servicio web. La base es, bueno, digamos liviana. ¿También 0,5 o más rápido?

Es difícil decirlo: no tengo suficientes datos. Estábamos satisfechos con 0,5 segundos, menos el cliente 1C innecesario en una máquina de terceros, menos la sincronización de las versiones de la biblioteca después de actualizar el motor 1C, menos el maldito comsafearray, nombres normales y tipos de campos... Pensó en nosotros desde el otro lado (un sistema que se integra con 1C) "no entenderán" cuando resulte que necesitan reescribir sus llamadas 1C a un nuevo "modelo de comunicación del sistema". Pero después de haber probado una función una vez en la base de datos de prueba, ahora se burlan de nosotros diciendo "cambiemos al servicio lo antes posible".

Pregunta: ¿Cómo utilizar TypeContains para objetos Com?


Si Attribute.Type.ContainsType(Type("DirectoryLink.Nomenclature")) Entonces existe IsNomenclature = True; terminara si;

"Props" se recibió de una conexión de comunicación con otra base de datos 1c. Se produce un error al comparar:

(ExternalProcessing.Coficiente Recalculation.Form.Form.Form(183)): Error al llamar al método de contexto (ContainsType)
Si Attribute.Type.ContainsType(Type("DirectoryLink.Nomenclature")) Entonces
porque:
Se produjo una excepción (1C:Enterprise 8.3.8.1964): el tipo no coincide (parámetro número "1")

Sospecho que debería compararse con el tipo en com. ¿Cómo comprobar el tipo correctamente?

Respuesta:

No rueda. Resolví el problema así:
En la base de datos del receptor en el módulo general con la casilla de conexión externa marcada, el código es:

Función CheckAttributeType(Atributo, Tipo) Exportar Devolver Attribute.Type.ContainsType(Type(Type)); Función final

En la base de datos desde la que me conecto, llamo al procedimiento vía Com:

ComConnection.Avis_ExchangeProcedures.CheckAttributeType(Atributo, "DirectoryLink.Nomenclature")

Imprimir (Ctrl+P)

Una de las opciones para intercambiar datos entre bases de datos 1C es el intercambio a través de una conexión COM. Usando una conexión COM, puede conectarse de una base de datos 1C a otra y leer o escribir datos. Este método se puede utilizar tanto en versiones cliente-servidor de bases de datos como en bases de datos de archivos. Este artículo analiza estos tipos de conexiones en la plataforma 8.3.

conexión de comunicación

Puede crear dos tipos de objetos COM para la aplicación 1C. Estas son conexiones viejas V83.Aplicación y conexiones de comunicaciones Conector V83.COM . En caso de V83.Aplicación Se lanza una copia casi completa de la aplicación 1C. En caso de uso Conector V83.COM Se lanza una pequeña parte del servidor. La velocidad de funcionamiento en este caso es mayor, pero es posible que algunas funciones no estén disponibles. En particular, trabajar con formularios y módulos comunes para los que no está configurada la propiedad de trabajar con conexiones externas. Principalmente deberías usar Conector V83.COM y sólo en caso de falta de funcionalidad V83.Aplicación. La diferencia en la velocidad operativa puede ser especialmente notable en bases de datos de gran volumen. Para plataforma 8.2 usada V82.Application o V82.COMConnector

Establecer una conexión OLE

Conexión = Nuevo COMObject(“V83.Application”);

Establecer una conexión COM

Conexión = Nuevo COMObject(“V83.COMConnector”);

Cadena de conexión

//Para la opción cliente-servidor
Cadena de conexión= “Srvr = ““NombreServidor” “;Ref = “ “NombreBase”;
//Para la opción de modo de archivo:
Cadena de conexión= “Archivo = ““RutaKBase” “; Usr = Nombre de usuario; Contraseña = Contraseña”;
Intentar
Conexión = Conexión . Conectar(Cadena de conexión) ;
Excepción
Mensaje = Nuevo mensaje al usuario;
Mensaje . Texto = "No se pudo conectar a la base de datos" + DescripciónErrores(); Mensaje . Para reportar();
Intento final;

Desconexión

Conexión = Indefinido;
Para objeto V83.Aplicación Es necesario finalizar la conexión; de lo contrario, quedará una sesión incompleta, que luego deberá eliminarse manualmente. En caso de Conector V83.COM la conexión se interrumpe automáticamente cuando se completa el procedimiento en el que se realizó la conexión. Y hay un pequeño detalle más. Para el usuario bajo el cual se realiza la conexión, la casilla de verificación "Solicitar confirmación al cerrar el programa" debe estar desactivada en su configuración.

Método nuevoObjeto()

Para crear un nuevo objeto, puede utilizar el método NewObject(), por ejemplo:

Para Conector V83.COM

SolicitarCOM = Conexión. NuevoObjeto( "Pedido ") ;
TablaCOM = Conexión. NuevoObjeto( “Tabla de Valores”) ;
ArrayCOM = Conexión. NuevoObjeto(“Matriz”);

ViewCOM =Conexión.NuevoObjeto

Para V83.Aplicación

SolicitarOLE = Conexión. NuevoObjeto(“ Pedido ") ;
TablaOLE = Conexión. Nuevo objeto(“Tabla de Valores”) ;
ArrayOLE = Conexión.NuevoObjeto(“Matriz”);
ViewCOM =Conexión.NuevoObjeto(“Identificador único”, StringUID);

SolicitarCOM . Texto ="ELEGIR
| Cargos de las Organizaciones Código,
| Cargos de las Organizaciones.Nombre
|DESDE | Directorio. Cargos de las Organizaciones
CÓMO POSICIONES DE LAS ORGANIZACIONES”;

Resultado = SolicitarCOM. Correr();
Muestra = Resultado. Elegir () ;
Adiós selección. Próximo()Ciclo
FinCiclo;
También puede utilizar administradores de objetos de configuración:
DirectorioCOM = Conexión. Directorios. Nombre del directorio;
DocumentoCOM = Conexión. Documentación. Nombre del documento;
RegistroCOM = Conexión. Registros de información. NombreRegistro;

Recibir y comparar enumeraciones a través de una conexión COM

Para comparar los valores de los elementos de enumeración definidos en la configuración, es necesario convertir estos elementos a uno de los tipos primitivos, cuya comparación es sencilla. Estos tipos pueden ser de tipo numérico o de cadena. Puede convertir el valor de un elemento de enumeración a un tipo numérico como este:

Elemento de enumeración = Conexión.Directorios.Directorio1.FindByCode(1).Props1;

PosiblesValues ​​= Elemento de enumeración.Metadata().Valores de enumeración;

EnumerationElementNumber = PossibleValues.Index(PossibleValues.Find(Connection.XMLString(EnumerationElement)));

Si EnumerationItemNumber = 0 Entonces Informe( “Valor de enumeración1”);

ElseIfEnumerationItemNumber = 1 Entonces Informe("EnumerationValue2");

terminara si;

Recuperar un objeto a través de COM por identificador

A través de los administradores de objetos de configuración obtenemos un objeto com, por ejemplo:
DocumentoCOM = Conexión. Documentación. Nombre del documento;

Luego obtenemos una cadena de identificación única:

StringUID =Conexión.cadena ( DocumentoCOM.UniqueIdentifier())

Identificador = Nueva U Identificador único (StringUID);
CON linkByIdentifier = Documentos[DocumentName].GetLink(Identificador);

Si necesita encontrar un objeto COM por documento por identificador, debe escribir así:

WidCOM = Conexión.NuevoObjeto(“Identificador único”, StringUID);
LinkByIdentifier = Connection.Documents[DocumentName].GetLink(WidCOM);

Una forma de transferir datos de una configuración 1C a otra es una conexión de software mediante COM. Muchas empresas utilizan varias bases de datos diferentes, entre las cuales deben existir determinadas conexiones y dependencias. Si es necesario no solo transferir datos, sino también realizar cierto procesamiento de datos, entonces una conexión COM será el mecanismo óptimo. La capacidad de analizar datos de otra base de datos 1C es útil para cualquier desarrollador.

Nos conectamos vía COM a la base de datos 1C.

Para implementar una conexión COM en 1C, se utiliza un mecanismo especial llamado COMConnector. Este objeto se instala junto con la plataforma y se utiliza para conectar bases de datos. Cabe señalar que para las versiones 8.2 y 8.3 se utilizan objetos con diferentes nombres: "V82.COMConnector" y "V83.COMConnector", respectivamente.

Recuerde que la duración de la conexión COM a la base de datos cuesta una licencia; no se deje llevar por la ejecución simultánea de varias conexiones. Esto es especialmente importante para organizaciones que tienen un número limitado de licencias. Este problema se puede resolver con la ayuda de tareas de rutina que se ejecutan cuando no hay conexiones de usuarios activas a la base de información.

Para poder conectarse a otra base de datos y solicitar la información necesaria, debe conocer los siguientes datos:

  1. ¿Qué tipo es? Archivo o cliente-servidor;
  2. Donde está localizado;
  3. ¿Qué nombre y contraseña puedes usar para iniciar sesión?
  4. ¿Qué datos le interesan?

A partir de los primeros tres puntos, para implementar una conexión COM, es necesario crear una cadena de parámetros. Dependiendo del tipo de seguridad de la información, será diferente. apariencia. Con la ayuda de la cadena recibida, se establece una conexión con la que se pueden recopilar datos de otra base de datos para analizarlos y procesarlos utilizando cualquier método.

Parámetros de conexiónFileIB = "File=""Path_to_database""; Usr=""User_name"";Pwd=""Contraseña"""; Parámetros de conexiónClientServerIB = "Srvr=""Server_Name""; Ref=""Database_Name""; Usr=""User_Name""; Pwd=""Contraseña""";

La función de conexión es sencilla y no debería generar dudas si todos los parámetros se especifican correctamente. Para acelerar la depuración y el análisis posibles errores es mejor encerrar la conexión en la construcción "Probar". La función devolverá un valor del tipo “objeto COM”, con el que trabajarás para obtener los datos necesarios.

&Función OnServer ConnectToBase() exportConnectionIB Parameters = "File=""E:\1c base de datos\ERP""; Usr=""Administrator"";Pwd=""1"""; V83COMCon= Nuevo COMObject("V83.COMConnector"); Intente devolver V83COMCon.Connect (parámetros de conexión IB); Informe de excepción (Descripción de error()); Devolver indefinido; intento final; Función final

A través de una conexión COM no sólo puedes seleccionar datos, sino también agregarlos a la base de datos a la que te estás conectando. Recuerde que podemos transferir 4 tipos de datos primitivos a través de un objeto COM. Otros tipos deberán especificarse utilizando las funciones de búsqueda integradas de la plataforma. Tenga en cuenta que las funciones globales de la plataforma también se acceden a través de una conexión COM.

Recibimos datos de la base de datos 1C.

Una vez que haya recibido el objeto deseado, deberá leer los datos de otra base de datos. Para hacer esto, utilizamos una solicitud a través de una conexión COM en 1C 8.3 utilizando el valor recibido del tipo "objeto COM" de la función. Es importante conectarse primero a la base de datos y luego ejecutar la solicitud. La ejecución se produce mediante el método NewObject, especificando el tipo de objeto en forma de cadena como parámetro: "Solicitud".

&Procedimiento OnServer TestCOMOnServer() Conexión = ConnectToBase(); Si TypeValue(Connection) Type("Indefinido") Entonces RequestBPZO = Connection.NewObject("Solicitud"); RequestBPZO.Text = "SELECCIONE los primeros 15 | DirectoryUser.Name AS Nombre |DESDE | Directory.users AS DirectoryUser"; Seleccionar = RequestBPZO.Execute().select(); Mientras que el bucle Selection.next() Report(Selection.Number); Fin del ciclo; terminara si; Fin del Procedimiento >

Por ejemplo, para obtener información sobre los usuarios de un determinado departamento, estableceremos una condición en la solicitud mediante parámetros. Un parámetro será de tipo simple: una cadena, y la división será un enlace al elemento del directorio "Estructura empresarial". El resultado de la consulta es una tabla con los campos enumerados del tipo que existen en la base de datos a la que se produjo la conexión COM. Si necesita convertirlos a otros tipos, utilice las funciones estándar de la plataforma:

  • Línea();
  • Número();
  • Fecha de().
SolicitudBPZO = Conexión.NuevoObjeto("Solicitud"); RequestBPZO.Text = "SELECCIONE los primeros 15 | DirectoryUser.Name COMO Nombre | FROM | Directory.Users COMO DirectoryUser I DONDE | DirectoryUser.Department = &RequiredDepartment | Y DirectoryUser.Name como ""%"" + &RequiredName+ ""%""" ; Solicitar BPZO.SetParameter("Departamento requerido", Conexión. Directorios. Estructura empresarial. Buscar por código("00-000023")); RequestBPZO.SetParameter("Nombre requerido","Ekaterina"); Seleccionar = RequestBPZO.Execute().select(); Mientras que el bucle Selection.next() Report(Selection.Name); Fin del ciclo;

Si necesita transferir una matriz a la base de datos para seleccionarla en función de varios parámetros, por ejemplo, departamentos, también se utiliza el comando NuevoObjeto. De manera similar, puedes pasar una lista o tabla de valores, llenándolas con elementos de otra base de datos a través de una conexión. Todos están disponibles para que usted pueda buscar métodos existentes objetos y mecanismos de plataforma.

SolicitudBPZO = Conexión.NuevoObjeto.("Solicitud"); RequestBPZO.Text = "SELECCIONE los primeros 15 | DirectoryUser.Name COMO Nombre | FROM | Directory.Users COMO DirectoryUser I DONDE | DirectoryUser.Department B (&NecessaryDepartment) | Y DirectoryUser.Name como ""%"" + &NecessaryName+ ""%" " "; Matriz de departamentos = Connection.NewObject("Matriz"); Matriz de departamentos.Agregar(Conexión.Directorios.Estructura empresarial.Buscar por código ("00-000023")); Matriz de departamentos.Agregar(Conexión.Directorios.Estructura empresarial.Buscar por código ("00-000038")); Matriz de departamentos.Agregar(Conexión.Directorios.Estructura empresarial.Buscar por código ("00-000046")); Solicitar BPZO.SetParameter("Departamento requerido", Matriz de departamentos); RequestBPZO.SetParameter("Nombre requerido","Ekaterina"); Seleccionar = RequestBPZO.Execute().select(); Mientras que el bucle Selection.next() Report(Selection.Name); Fin del ciclo;

Al transferir documentos o elementos de directorio, siempre surge la cuestión de controlar la transferencia de un objeto específico. Con la ayuda de conexiones COM, estos problemas se pueden resolver mediante un identificador único. Debe encontrar un objeto en la base de datos del complemento por identificador de la seguridad de la información actual utilizando la función "GetLink", utilizando el identificador como una cadena. Si no encuentra uno, puede crearlo mediante una conexión COM.

StrIdent = String(Directories.Users.FindByCode("00-0000313").UniqueIdentifier()); Si NO ValueFilled(Connection.Directories.Users.GetLink(Connection.NewObject("UniqueIdentifier", StrIdent))) entonces NewUser = Connection.Directories.Users.CreateItem(); NuevoUsuario.Nombre = Directorios.Usuarios.FindByCode("00-0000313").Nombre; NuevoUsuario.Individual = Directorios.Usuarios.FindByCode("00-0000313").Individual; NuevoUsuario.Write(); terminara si;

Además, una conexión COM tiene derecho a utilizar procedimientos y funciones de módulos 1C comunes con la propiedad "Conexión externa" habilitada. Además de esta condición, la función o procedimiento llamado debe exportarse y no incluir acciones interactivas realizadas en el servidor. De lo contrario, verá un error indicando que la operación no es válida.

Compuesto..; FunciónVariable = Conexión...; llamada a función>nombre del módulo general>llamada a procedimiento>nombre del módulo general>

Las posibilidades de conexión externa con otra base de datos en 1C son bastante amplias y pueden permitirle realizar muchas tareas. Es importante poder evaluar correctamente las herramientas y elegir la solución óptima. En la mayoría de los casos, esta habilidad aparece solo con la experiencia o al estudiar ejemplos del trabajo de especialistas experimentados.


Palabras clave: COM, conexión, externo, OLE, Automatización, Connect, ComConnector, Srvr

Cuando se utilizan conexiones COM 1C:Enterprise 8.0 para acceder a los datos, existen las siguientes ventajas en comparación con el uso de un servidor de automatización:

  1. Establecimiento de conexión más rápido, ya que no es necesario crear un proceso de sistema operativo separado y todas las acciones se realizan dentro del proceso de llamada;

  2. Acceso más rápido a las propiedades y métodos de los objetos 1C:Enterprise, ya que organizar un acceso no requiere comunicación entre procesos;
  3. Menor consumo de recursos del sistema operativo.

En general, trabajar con 1C:Enterprise 8.0 a través de una conexión COM es similar a trabajar con 1C:Enterprise en modo Automatización del servidor. Las principales diferencias son las siguientes:

  1. En el caso de un servidor de automatización, se inicia una aplicación 1C:Enterprise 8.0 completa y, en el caso de una conexión COM, se inicia un servidor COM en proceso relativamente pequeño.

  2. Cuando se trabaja a través de una conexión COM, la funcionalidad relacionada de una forma u otra con la organización de la interfaz de usuario de 1C:Enterprise 8.0 no está disponible;
  3. Cuando se opera una conexión COM, no se utiliza el módulo de aplicación de configuración 1C:Enterprise 8.0. Su función cuando se trabaja con una conexión COM la desempeña el módulo de conexión externo.

1.1 Procedimiento para establecer una conexión COM

Para organizar el acceso a los datos de 1C:Enterprise 8.0 a través de una conexión COM, se realiza la siguiente secuencia de acciones:

  1. se crea un objeto COM con el identificador V8.COMConnector, con cuya ayuda se establece la conexión;

  2. Se llama al método Connect del objeto V8.COMConnector creado previamente. El método Connect devuelve un enlace a un objeto de conexión COM con la base de datos 1C:Enterprise 8.0;
  3. A través del objeto de conexión COM recibido se accede a los métodos, propiedades y objetos válidos de la infobase con la que se establece la conexión.

¡Importante! Debido a la falta de una interfaz de usuario en una conexión COM, no todos los objetos, propiedades y métodos se pueden utilizar en una conexión COM.

1C:Objetos empresariales accesibles externamente a través de una conexión COM:

  1. Variables y procedimientos/funciones exportados del módulo de unión externo

  2. Variables exportadas y procedimientos/funciones de módulos comunes
  3. Incluir y excluir módulos completos estableciendo propiedades de módulos comunes

  4. Incluir y excluir fragmentos de módulos comunes utilizando un preprocesador
  5. Contexto global 1C:Enterprise 8.0, a excepción de los objetos estrechamente vinculados a la aplicación cliente (TextDocument, TabularDocument, ...)

1.2 Módulo de conexión externo

Como ya se señaló, las responsabilidades del módulo de aplicación cuando se trabaja a través de una conexión COM las realiza el módulo de conexión externo. Este módulo puede tener procedimientos de controlador de eventos When SystemStarts() y WhenSystemCompletes(), que pueden contener acciones realizadas durante la inicialización y terminación de la conexión, respectivamente.

Los procedimientos, funciones y variables globales definidas en un módulo de unión externo con la palabra clave Exportar pasan a formar parte, como en el caso de un módulo de aplicación, del contexto global.

1.3 Módulos comunes

Se han introducido las propiedades "Cliente", "Servidor" y "Conexión externa" para módulos comunes. Están destinados a determinar en la configuración el uso de módulos en la versión cliente - servidor y en modo de conexión COM.

1.4 Objeto "V8.COMConnector"

La única tarea que resuelve el objeto COM V8.COMConnector es establecer una conexión COM con la base de información 1C:Enterprise 8.0. Se puede establecer un número ilimitado de conexiones utilizando una instancia del objeto V8.COMConnector. El objeto V8.COMConnector tiene un único método Connect, diseñado para establecer una conexión COM con la base de datos 1C:Enterprise 8.0.

<СтрокаСоединенияИБ>

La línea de conexión con el sistema de seguridad de la información es una cadena de fragmentos de la forma Parámetro=Valor. Los fragmentos están separados entre sí por ";". Si el valor contiene espacios en blanco, debe estar encerrado entre doble comillas (").

Parámetros comunes:

usr - nombre de usuario;
Contraseña: contraseña.

El siguiente parámetro está definido para la versión del archivo:

Archivo - directorio de la base de datos.

Los siguientes parámetros están definidos para la opción cliente-servidor:

Srvr - 1C:Nombre del servidor empresarial;
Ref: nombre de la base de datos en el servidor.

El método Connect establece una conexión COM a la base de datos 1C:Enterprise 8.0 y devuelve un enlace al objeto de conexión COM.

// Se crea un objeto conector
V8 = Nuevo COMObject("V8.COMConnector");
// se crea un objeto de conexión COM
Conexión = V8.Connect("File=""c:\InfoBases\Trade""; Usr=""Director"";")

1.5 Objeto de conexión COM

Una conexión COM a la base de datos 1C:Enterprise proporciona acceso completo a su contexto global (consulte “Contexto de ejecución del módulo de programa”). Por tanto, una conexión COM puede tener como métodos: constantes del sistema, valores especificados en el configurador de objetos a los que se accede mediante administradores (por ejemplo, constantes, enumeraciones, directorios, documentos, registros de documentos, informes, procesamiento, planes de tipos). de características, planes de cuentas, planes de tipos de cálculo, registros), así como variables declaradas en el módulo de conexión externa con la palabra clave Exportar.

Además, la conexión COM tiene un método NewObject adicional que se puede utilizar para crear valores de ciertos tipos.

tk = Conexión. NuevoObjeto("Tabla de Valores");

Método de cadena Le permite obtener representaciones de cadenas de valores de 1C:Enterprise.

Ver = Connection.String(Data.UniqueIdentifier());

1.6. Características de trabajar con una conexión COM.

En Automatización y en una conexión COM, VERDADERO y FALSO tienen los siguientes valores: -1 (menos uno) y 0.

Es posible organizar un grupo de conexiones COM. Al mismo tiempo, se crean CON ANTICIPACIÓN varios objetos de conexión COM en el servidor receptor 1C:Enterprise y se necesita incluso menos tiempo para establecer una conexión, ya que no es necesario crear un nuevo objeto.

Se ha implementado un nuevo objeto Query Builder, diseñado para generar textos de consulta basados ​​en la configuración especificada. este objeto admite la funcionalidad del generador de informes que no está relacionada con la salida de un informe a un documento de hoja de cálculo y otras tareas relacionadas con interfaz de usuario. Este objeto se puede utilizar en el servidor 1C:Enterprise y en una conexión COM.

Puede utilizar objetos COM cuando ejecute el lenguaje integrado en el servidor 1C:Enterprise.

Los errores COM se convierten en excepciones de lenguaje integrado.

Si la configuración intenta crear un objeto no válido, p. documento de hoja de cálculo, en un módulo de conexión externo, en un módulo compartido o en un módulo objeto, la conexión COM puede no establecerse o interrumpirse como excepción.

Una de las opciones para intercambiar datos entre bases de datos 1C es el intercambio a través de una conexión COM.

Usando una conexión COM, puede conectarse de una base de datos 1C a otra y leer o escribir datos. Este método se puede utilizar tanto en versiones cliente-servidor de bases de datos como en bases de datos de archivos. En este artículo veremos ejemplos de este tipo de conexión. Los ejemplos utilizan la plataforma 8.2.

Puede crear dos tipos de objetos COM para la aplicación 1C. Este V82.Aplicación Y Conector V82.COM. En caso de V82.Aplicación Se lanza una copia casi completa de la aplicación 1C. en caso de uso Conector V82.COM Se lanza una pequeña parte del servidor.
La velocidad de funcionamiento en este caso es mayor, pero es posible que algunas funciones no estén disponibles. En particular, trabajar con formularios y módulos comunes para los que no está configurada la propiedad de trabajar con conexiones externas. Principalmente deberías usar Conector V82.COM y sólo en caso de falta de funcionalidad V82.Aplicación. La diferencia en la velocidad operativa puede ser especialmente notable en bases de datos de gran volumen.

Entonces empecemos

  1. Creemos un objeto COM
    • Para V82.Aplicación Conexión = Nuevo COMObject("V82.Application");
    • Para Conector V82.COM Conexión = Nuevo COMObject("V82.COMConnector");
  2. Creemos una cadena de conexión.
    • para la versión del servidor de la base de datos ConnectionString = "Srvr = " "ServerName" ";Ref = " "BaseName" ;
    • para la versión del archivo de la base de datos ConnectionString = "File = " "PathKBase" "; Usr = Nombre de usuario; Pwd = Contraseña";
  3. Conexión a la base de datos Intento de conexión = Conexión. Conectar (Cadena de conexión); Mensaje de excepción = Nuevo mensaje para el usuario; Mensaje. Texto = + DescripciónError(); Mensaje. Para reportar() ; Intento final;
  4. Desconectarse de la base de datos Conexión = Indefinido;

    Para objeto V82.Aplicación Es necesario finalizar la conexión; de lo contrario, quedará una sesión incompleta, que luego deberá eliminarse manualmente. En caso de Conector V82.COM la conexión se interrumpe automáticamente cuando se completa el procedimiento en el que se realizó la conexión. Y hay un pequeño detalle más.

    Para el usuario bajo el cual se realiza la conexión, la casilla de verificación "Solicitar confirmación al cerrar el programa" debe estar desactivada en su configuración.

Ahora juntemos todo el código.

Conexión = Nuevo COMObject("V82.Application"); //Conexión = Nuevo COMObject("V82.COMConnector"); ConnectionString = "Srvr = " "Server1C" ";Ref = " "MiBase" "; Usr = Petya; Pwd = 123" ; //ConnectionString = "File = ""С:\MyBase""; Usr = Petya; Pwd = 123"; Intento de conexión = Conexión. Conectar (Cadena de conexión); Mensaje de excepción = Nuevo mensaje para el usuario; Mensaje. Texto = "No se pudo conectar a la base de datos"+ DescripciónError() ; Mensaje. Para reportar() ; Intento final; Conexión = Indefinido;

Para tipo de conexión V82.Aplicación el método se utiliza para el objeto COM que se creó inicialmente y para Conector V82.COM Se aplica el método a la conexión. seguir trabajando con la solicitud procede medios estándar 1C. en código se ve así:

Solicitud = Conexión. NuevoObjeto("Solicitud"); // Para Conector V82.COM Solicitud = Conexión. NuevoObjeto("Solicitud"); // Para V82.Aplicación Pedido. Texto = "SELECCIONAR | Cargos de las Organizaciones Código, | Cargos de las Organizaciones.Nombre|DESDE | Directorio.Puestos de Organizaciones AS Puestos de Organizaciones"; Resultado = Solicitud. Correr(); Muestra = Resultado. Elegir() ; Adiós selección. Siguiente() Bucle Final del Bucle;

Para la versión 1C:Enterprise 8.3 todo permanece sin cambios excepto que al crear objetos COM debes usar "Conector V83.COM" o "V83.Aplicación".




Arriba