VirtualXML® Ejecutable Externo (VirtualXML.EXE y VirtualXML_x64.EXE) VirtualXML
Adicionalmente a la librería de funciones VirtualXML.DLL, VirtualXML provee de un programa ejecutable externo para equipos de 32 y 64 bits (VirtualXML.EXE y VirtualXML_x64.EXE) que se ejecuta desde la línea de comandos.

Este programa externo utiliza archivos de texto (scripts) para realizar el proceso de firmado, sellado y timbrado de documentos fiscales digitales (CFDIs) en versiones 3.2 y 3.3.

Es muy útil cuando tu lenguaje de programación no soporta llamadas a DLLs externas o bien cuando requieres hacer una factura sin necesidad de recurrir a un programa formal.

Los scripts de VirtualXML son simplemente archivos de texto con la extensión .vxml (aunque pueden tener cualquier extensión), que contienen llamadas a las funciones de la librería VirtualXML con un formato específico.

Ejemplo:

Si queremos crear un documento CFDI en la version 3.3 nuestro script (archivo de texto) deberá contener las siguientes lineas:

                 |>| VirtualXML_New | 3.3 |<|

Si observas bien, esta es una llamada similar a la función VirtuaXML_New() y utiliza incluso su mismo parámetro.

Las reglas para el llamado a las instrucciones de VirtualXML para los archivos scripts son muy simples:

             Se coloca una sola instrucción por línea
             |>|  Inicia instruccion VirtualXML
             Instruccion Virtual XML + | (pleca, pipe)
             Parámetro(s) de la función separados por " | " (pleca, pipe) en vez de ",". Son los mismos parametros de la funciones de la DLL a excepción del "handler" de la función, el cual no es requerido en el Script.
             Parámetro que no deba de ser expresado se representa vacio: " | | "
             |<|  Termina instruccion VirtualXML

Similar a como se usan la funciones de la DLL VirtualXML, cada llamada a una función va creando en la memoria de la computadora el archivo XML, en el ejemplo anterior se crea el siguiente nodo:

                        <?xml version="1.0" encoding="UTF-8"?>
                        <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
                                                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                       xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                                       Version="3.3"
                        </cfdi:Comprobante>

Tal como si estuvieramos programando en un lenguaje de programación convencional, agregaremos mas instrucciones VirtualXML, siguiendo la regla de llamado, así por ejemplo para completar el nodo <cfdi:Comprobante> agregaremos:

                 |>|VirtualXML_SetComprobanteInfo_cfdi33| A | 1 | %cb_date | 99 | Contado Comercial | 1000.00 | 50.00 | MXN | | 1102.00 | I | PPD | 53050 | |<|

Y en la memoria de la computadora se habra creado:

                         <?xml version="1.0" encoding="UTF-8"?>
                         <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
                                                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                                        Version="3.3"
                                                        Serie="A"
                                                        Folio="1"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="Contado Comercial"
                                                        SubTotal="1000.00"
                                                        Descuento="50.00"
                                                        Moneda="MXN"
                                                        Total="1102.00"
                                                        TipoDeComprobante="I"
                                                        MetodoPago="PPD"
                                                        LugarExpedicion="53050">
                         </cfdi:Comprobante>

Agregamos información de Emisor y Receptor:

                 |>| VirtualXML_SetEmisorInfo_cfdi33 | AAA010101AAA | Empresa de prueba SA de CV | 601 |<|
                 |>| VirtualXML_SetReceptorInfo_cfdi33 | CTE940531F58 | Cibernetica y Tecnología SA de CV| | | G01 |<|

Y Obtenemos esto:

                         <?xml version="1.0" encoding="UTF-8"?>
                         <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
                                                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                                        Version="3.3"
                                                        Serie="A"
                                                        Folio="1"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="Contado Comercial"
                                                        SubTotal="1000.00"
                                                        Descuento="50.00"
                                                        Moneda="MXN"
                                                        Total="1102.00"
                                                        TipoDeComprobante="I"
                                                        MetodoPago="PPD"
                                                        LugarExpedicion="53050">
                                    <cfdi:Emisor Rfc="AAA010101AAA" Nombre="Empresa de prueba SA de CV" RegimenFiscal="601"/>
                                    <cfdi:Receptor Rfc="CTE940531F58" Nombre="Cibernetica y Tecnología­ SA de CV" UsoCFDI="G01"/>
                         </cfdi:Comprobante>

Agreguemos un concepto y sus respectivos impuestos:

               |>|VirtualXML_AddConcepto_cfdi33| 84111506| SEF500 | 1 | H87 | Timbre | Paquete de 500 timbres fiscales | 500.00 | 500.00 | |<|
               |>|VirtualXML_AddConceptoTraslado_cfdi33| 500.00 | 002 | Tasa | 0.160000 | 80.00 |<|

Nuestro XML en memoria va así:

                         <?xml version="1.0" encoding="UTF-8"?>
                         <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
                                                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                                        Version="3.3"
                                                        Serie="A"
                                                        Folio="1"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="Contado Comercial"
                                                        SubTotal="1000.00"
                                                        Descuento="50.00"
                                                        Moneda="MXN"
                                                        Total="1102.00"
                                                        TipoDeComprobante="I"
                                                        MetodoPago="PPD"
                                                        LugarExpedicion="53050">
                                    <cfdi:Emisor Rfc="AAA010101AAA" Nombre="Empresa de prueba SA de CV" RegimenFiscal="601"/>
                                    <cfdi:Receptor Rfc="CTE940531F58" Nombre="Cibernetica y Tecnología SA de CV" UsoCFDI="G01"/>
                                    <cfdi:Conceptos>
                                                     <cfdi:Concepto ClaveProdServ="84111506" NoIdentificacion="SEF500" Cantidad="1" ClaveUnidad="H87" Unidad="Timbre"
                                                                             Descripcion="Paquete de 500 timbres fiscales" ValorUnitario="500.00" Importe="500.00">
                                                             <cfdi:Impuestos>
                                                                     <cfdi:Traslados>
                                                                                 <cfdi:Traslado Base="500.00" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="80.00"/>
                                                                      </cfdi:Traslados>
                                                             </cfdi:Impuestos>
                                    </cfdi:Concepto>
                         </cfdi:Comprobante>

Finalmente el nodo de impuestos y sus valores:

             |>|VirtualXML_SetImpuestosInfo_cfdi33| 152.00 | |<|
             |>|VirtualXML_AddTraslado_cfdi33| 002 | Tasa | 0.160000 | 152.00 |<|

Nuestro XML en memoria está listo:

                         <?xml version="1.0" encoding="UTF-8"?>
                         <cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3"
                                                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                                        xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                                        Version="3.3"
                                                        Serie="A"
                                                        Folio="1"
                                                        Fecha="%cb_date"                                            
                                                        Sello=""
                                                        FormaPago="99"
                                                        NoCertificado=""
                                                        Certificado=""
                                                        CondicionesDePago="Contado Comercial"
                                                        SubTotal="1000.00"
                                                        Descuento="50.00"
                                                        Moneda="MXN"
                                                        Total="1102.00"
                                                        TipoDeComprobante="I"
                                                        MetodoPago="PPD"
                                                        LugarExpedicion="53050">
                                    <cfdi:Emisor Rfc="AAA010101AAA" Nombre="Empresa de prueba SA de CV" RegimenFiscal="601"/>
                                    <cfdi:Receptor Rfc="CTE940531F58" Nombre="Cibernetica y Tecnología SA de CV" UsoCFDI="G01"/>
                                    <cfdi:Conceptos>
                                                     <cfdi:Concepto ClaveProdServ="84111506" NoIdentificacion="SEF500" Cantidad="1" ClaveUnidad="H87" Unidad="Timbre"
                                                                             Descripcion="Paquete de 500 timbres fiscales" ValorUnitario="500.00" Importe="500.00">
                                                             <cfdi:Impuestos>
                                                                     <cfdi:Traslados>
                                                                                 <cfdi:Traslado Base="500.00" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="80.00"/>
                                                                      </cfdi:Traslados>
                                                             </cfdi:Impuestos>
                                    </cfdi:Concepto>
                                    <cfdi:Impuestos TotalImpuestosTrasladados="152.00">
                                             <cfdi:Traslados>
                                                   <cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="152.00"/>
                                             </cfdi:Traslados>
                                    </cfdi:Impuestos>
                         </cfdi:Comprobante>

Nuestro XML está listo, ahora debemos "procesarlo" (firmarlo, sellarlo y timbrarlo digitalmente), esta operación se realiza usando LA MISMA FUNCION como si utilizaramos la función de la DLL:

            |>|VirtualXML_ProcesaDocumento| AAA010101AAA.cer | AAA010101AAA.key | 12345678a | EjemploCFDI33simple.xml |<|

El resultado del procesamiento lo obtendremos un archivo de texto con el mismo nombre del archivo de salida especificado en la llamada a la función VirtualXML_ProcesaDocumento(). los 21 valores recuperados estarán ahi.

Para procesar nuestro archivo script, desde la línea de comandos haremos:

             C:\>  VirtualXML.exe <archivo.vxml>

También es posible procesar mas de 1 documento CFDI a la vez dentro del mismo archivo .VXML, simplemente repite las instrucciones de llenado del CFDI tantas veces como documentos quieras timbrar y podrás timbrar tantos documentos como desees con un solo archivo .VMXL

El ejemplo completo quedaría como sigue;


Ejemplo:

|>|VirtualXML_New|3.3|<|
|>|VirtualXML_SetVirtualPACInfo|demo_cibertec|demo|<|
|>|VirtualXML_GetValues|EjemploCfdi33Simple.txt|0|<|
|>|VirtualXML_SetComprobanteInfo_cfdi33|A|1|%cb_date|99|Contado Comercial|1000.00|50.00|MXN||1102.00|I|PPD|53050||<|
|>|VirtualXML_SetEmisorInfo_cfdi33|AAA010101AAA|Empresa de prueba SA de CV|601|<|
|>|VirtualXML_SetReceptorInfo_cfdi33|CTE940531F58|Cibernetica y Tecnología SA de CV|||G01|<|
|>|VirtualXML_AddConcepto_cfdi33|84111506|SEF500|1|H87|Timbre|Paquete de 500 timbres fiscales|500.00|500.00||<|
|>|VirtualXML_AddConceptoTraslado_cfdi33|500.00|002|Tasa|0.160000|80.00|<|
|>|VirtualXML_SetImpuestosInfo_cfdi33|152.00||<|
|>|VirtualXML_AddTraslado_cfdi33|002|Tasa|0.160000|152.00|<|
|>|VirtualXML_ProcesaDocumento|AAA010101AAA.cer|AAA010101AAA.key|12345678a|EjemploCFDI33simple.xml|<|

El resultado de este documento queda en un archivo de texto similar a este:

VIRTUALXML_GET_DESCERROR[1]: VIRTUALXML_OK
VIRTUALXML_GET_ERROR[2]:
VIRTUALXML_GET_CSDNUMBER[3]: 30001000000300023708
VIRTUALXML_GET_SELLO[4]: L7U9zYzmSCGtrzsaryv3K4Zhn/n4tDon/sm5MoJsYYCuQcFtUCMtJlN05hlt7D+I4g7+fvoiJbmKL+96ysbrWc6X9iu0NYhMxewBMqajcCGNiAIzDquq2zlXtzn5SXn5UOxJfzicR8MvnTXr/yg+MaK5zdMCCzFO9GmGXyOOubCXo/QbE+POIloft9dgKNPKmEJ5+E5hB7U5VJ+85By3kKquZeppulFHHUWG1OEankwg8gdxKqI3fcnvJnc/GbNsLBBxuVuxwWB0Kd+qRV6XfjGIkan8a2HNPlTHNMWXRaeHrJ7m1FGHX8cgR6y1qPj7fmU2xv/PzS8tWzWDu9UfVQ==
VIRTUALXML_GET_CADENA[5]: ||3.3|J|999999|2017-08-22T08:26:14|99|30001000000300023708|Por Definir|100.00|MXN|116.00|I|PPD|66269|AAA010101AAA|MIRADOR AUTOMOTRIZ, S.A. DE C.V.|601|MVA021112M8A|PRUEBA|G03|01010101|1|H87|Servicio|PRUEBA|100|100|100|002|Tasa|0.160000|16|002|Tasa|0.160000|16.00|16.00||
VIRTUALXML_GET_SATCSDNUMBER[6]: 20001000000300022323
VIRTUALXML_GET_SATSELLO[7]: jynm9eepM9TAOgykOpIQ6KHwc45ZZL7lwpQppyl2ggzrBZ9J9SRSmPGR/tnCgdzdjapMlLRYmcyKfk76EKNfwn7gDsmP8i4BV2jwgGqD+EJ73hSjpB5M69XykVI4vltJN0prGXtReJzl2UBIHQJRnAKxm+vuept+88oBnYpHjTpkYkybMb+t4DrSEL9GO7Cbx8xosUD20HpPCtMk/4Po4ucGSAR8X5sDQKokMjvrEm8fftyxWgKRSI4inZHcAUNiIXxuHfogRTH57awreGyZGraf8nm3TGXFOGWHy1nxI3O3UkaCu+A3ZuDqvAczc3eTy0kF4XAXk942JrDzgQYCTA==
VIRTUALXML_GET_SATCADENA[8]: ||1.1|2ADF43A0-393B-4F3D-AF25-F1A4797EFB05|2017-08-22T14:58:58|FEL100622S88|L7U9zYzmSCGtrzsaryv3K4Zhn/n4tDon/sm5MoJsYYCuQcFtUCMtJlN05hlt7D+I4g7+fvoiJbmKL+96ysbrWc6X9iu0NYhMxewBMqajcCGNiAIzDquq2zlXtzn5SXn5UOxJfzicR8MvnTXr/yg+MaK5zdMCCzFO9GmGXyOOubCXo/QbE+POIloft9dgKNPKmEJ5+E5hB7U5VJ+85By3kKquZeppulFHHUWG1OEankwg8gdxKqI3fcnvJnc/GbNsLBBxuVuxwWB0Kd+qRV6XfjGIkan8a2HNPlTHNMWXRaeHrJ7m1FGHX8cgR6y1qPj7fmU2xv/PzS8tWzWDu9UfVQ==|20001000000300022323||
VIRTUALXML_GET_SATUUID[9]: 2ADF43A0-393B-4F3D-AF25-F1A4797EFB05
VIRTUALXML_GET_SATFECHA[10]: 2017-08-22T14:58:58
VIRTUALXML_GET_CSDINI[11]: 170518035456Z
VIRTUALXML_GET_CSDFIN[12]: 210518035456Z
VIRTUALXML_GET_VPID[13]: 407708
VIRTUALXML_GET_DISP[14]: 5000
VIRTUALXML_GET_DLLVERSION[15]: vxml170816v1.0.3.5
VIRTUALXML_GET_FECHAXML[16]: 2017-08-22T08:26:14
VIRTUALXML_GET_WARN[17]:
VIRTUALXML_GET_PAC[18]: DFA
VIRTUALXML_GET_REVISION[19]: x86
VIRTUALXML_GET_SATRFCPROVCERTIF[20]: FEL100622S88
VIRTUALXML_GET_SATLEYENDA[21]:

Vease Tambien