# Documentación de Histrix > Documentación técnica del framework Histrix, desarrollado por Mundo IT. Este archivo reúne la documentación completa de https://docs.histrix.com.ar/ en un solo texto plano, para usarla como contexto en un asistente de AI. Cada página incluye su URL: citala al responder para que se pueda verificar la fuente. Generado el 2026-08-28 · 35 páginas. ============================================================================== # Introducción ============================================================================== ------------------------------------------------------------------------------ ## Qué es Histrix URL: https://docs.histrix.com.ar/es/introduccion/ Descripción general del framework, sus capacidades y su modelo de trabajo. ------------------------------------------------------------------------------ Histrix es un framework para construir aplicaciones de gestión de información. Las pantallas —consultas, fichas, formularios de ingreso, árboles, gráficos, calendarios— se declaran en archivos XML que el motor interpreta en cada request: no hay compilación ni build previo, y un cambio en un XML se refleja al recargar la página. Sobre esa base se desarrollan módulos por dominio (clientes, proveedores, stock, contabilidad, tesorería, entre otros) y se los configura por cliente sin duplicar el motor. ## Modelo de trabajo - **Definición declarativa.** Un XML describe la tabla base, los campos, los joins, los filtros y el comportamiento de grabación. El motor genera el SQL, renderiza la interfaz y expone la misma definición por API REST. - **Extensión en PHP cuando hace falta.** El atributo `dataSource` reemplaza la generación automática de SQL por una clase propia. Ver [DataSource en PHP](https://docs.histrix.com.ar/es/datasource/). - **Multi-base.** Una misma instalación atiende varias bases de datos, cada una con su configuración, sus XML propios y su módulo base. Los XML de la base sobrescriben por completo los del módulo. ## Orígenes de datos - Bases de datos propias o de terceros: MySQL/MariaDB, SQL Server, Progress y SQLite. - Dispositivos: relojes de personal, centrales telefónicas, controladores PLC, sensores. - Servicios web: cotizaciones, listas de precios, organismos públicos. ## Interfaces de acceso Histrix funciona en el navegador y no requiere instalar software en las terminales. Además de la interfaz web, expone una **API REST** que publica los mismos XML como recursos, con autenticación OAuth 2.0 y OpenID Connect. Eso permite construir clientes alternativos —móviles o SPA— sobre la misma definición. Ver [Referencia de la API](https://docs.histrix.com.ar/es/api/) y [Autenticación y OIDC](https://docs.histrix.com.ar/es/autenticacion/). ## Formatos de salida Los datos de cualquier consulta pueden exportarse a XLS, CSV, PDF, XML y RSS, y los listados imprimirse en PDF o en impresoras térmicas. Ver [Exportación de datos](https://docs.histrix.com.ar/es/exportar/). ## Licenciamiento Histrix no impone límite de usuarios ni licencias por terminal, y está construido íntegramente sobre software libre: no requiere licencias de sistema operativo ni de motor de base de datos. ------------------------------------------------------------------------------ ## Arquitectura URL: https://docs.histrix.com.ar/es/arquitectura/ Estructura de una instalación, resolución de XML por base, overrides de módulo y ciclo de vida de una instancia. ------------------------------------------------------------------------------ Esta página describe cómo está organizada una instalación de Histrix y cómo el motor resuelve qué XML ejecutar. Es la base para entender por qué un mismo programa puede comportarse distinto en dos bases de la misma instalación. ## Estructura de directorios Una instalación tiene el motor en la raíz y los datos de cada cliente separados en `database/`: ``` histrix/ src/ Motor (namespace \Histrix\) admin/ Programas de administración y migraciones del core modules/ Módulos funcionales compartidos (erp-base, erp-full, ...) plugins/ Plugins del core lang/ Traducciones de la interfaz (es, en, fr, pt) js/ css/ Assets del cliente web database/ config.xml Configuración de conexiones y empresas {cliente}/ xml/ XML propios del cliente (sobrescriben los del módulo) files/ Archivos subidos log/{año}/{mes}/ Logs de SQL y errores plugins/ Plugins propios del cliente tests/ Tests de aceptación de la base vendor/ Dependencias de Composer ``` `database/` y `modules/` son repositorios independientes del motor. Un cambio en un módulo o en los XML de un cliente no se versiona junto con el core. ## Configuración de conexiones `database/config.xml` declara una entrada `` por cada base atendida. El atributo `xmlPath` define el directorio raíz de sus XML, es decir `database/{xmlPath}/xml/`: ```xml histrix_back.jpg es Cliente S.A. htx_cliente mysql usuario clave db Cliente S.A. Dirección 30-00000000-0 logo.jpg logo.png |clientes|proveedores|stock|iva|contabilidad ``` El atributo opcional `group` en `` filtra qué bases aparecen en el selector según el subdominio por el que se accede. ## Resolución de XML Cada base tiene además un parámetro `CONFIG::baseModule` en la tabla `HTXOPTIONS` (por ejemplo `erp-base` o `erp-full`) que define contra qué módulo hace fallback. Al pedir un XML, el motor prueba las rutas en este orden y toma la primera que existe: 1. `database/{xmlPath}/xml/{dir}/{archivo}` 2. `database/{xmlPath}/xml/{archivo}` 3. `modules/{baseModule}/{dir}/{archivo}` 4. `modules/{dir}/{archivo}` 5. `admin/{dir}/{archivo}` 6. `modules/erp-base/{dir}/{archivo}` Consecuencias prácticas: - Un XML colocado en la raíz del árbol del cliente (paso 2) satisface cualquier `dir=`, porque ese paso ignora el subdirectorio. - Si el `xmlPath` de una base apunta a un directorio vacío, todo se resuelve por fallback al módulo. - Dos bases con `baseModule` distinto pueden cargar versiones diferentes del mismo archivo. Si un programa se comporta distinto entre bases del mismo motor, comparar primero `CONFIG::baseModule` y el contenido de cada `xmlPath`. ## Overrides de módulo Un XML en `database/{cliente}/xml/` **reemplaza por completo** al del módulo: no hay merge parcial de campos ni de atributos. Por lo tanto: - Antes de modificar un override, compararlo con `diff` contra el original del módulo. Un override desactualizado se rompe en silencio cuando el archivo del módulo evoluciona. - Al crear un override, dejar registrado qué se cambió respecto del original. ## Ciclo de vida de una instancia Cuando se abre un programa, el motor parsea el XML y construye un **contenedor** (`\Histrix\Data\Container`) con las tablas, campos y condiciones declaradas. Ese contenedor se serializa en la sesión y queda identificado por un id de instancia, que es el que usan todas las operaciones siguientes: ``` GET /api/db/{db}/instance/xml/{ruta.xml} crea la instancia GET /api/db/{db}/instance/{instance} lee datos PUT /api/db/{db}/instance/{instance}/set/ actualiza un campo POST /api/db/{db}/instance/{instance}/process/ graba DELETE /api/db/{db}/instance/{instance} destruye la instancia ``` El estado vive en la sesión de PHP, no en el cliente: los campos calculados en el servidor, los valores de los filtros y las filas confirmadas de una grilla de ingreso se resuelven contra esa instancia. La interfaz web y cualquier cliente externo usan las mismas rutas. ## Stack - PHP 8 con Slim 3 para el enrutamiento HTTP y Composer para las dependencias. - Acceso a datos por PDO. El tag `` de cada base selecciona la implementación: `mysql` (valor por omisión), `mssql`, `dblib` o `sqlsrv` para SQL Server, `progress` y `sqlite`. - OAuth 2.0 y OpenID Connect para autenticación de la API. - Redis como caché de aplicación y almacenamiento de las filas temporales de los formularios de ingreso. - jQuery, jQuery UI y DataTables en el cliente web. El servidor Redis se resuelve, en este orden, desde los tags `` y `` de la base en `config.xml`, desde las variables de entorno `REDIS_SERVER_HOST` y `REDIS_SERVER_PASSWORD`, o por defecto `localhost`. :::note Las sesiones de PHP **no** se guardan en Redis: usan el manejador de archivos predeterminado. El bloqueo de sesión que eso implica es intencional, porque hay flujos —los popups de `` con `resume="true"`— que dependen de que las escrituras a la sesión estén serializadas. ::: ============================================================================== # Instalación y operación ============================================================================== ------------------------------------------------------------------------------ ## Instalación con Nginx y Docker URL: https://docs.histrix.com.ar/es/instalacion_nginx/ Instalación de Histrix con Nginx, PHP-FPM, MySQL y Redis usando Docker Compose. ------------------------------------------------------------------------------ Este documento describe la instalación de Histrix con Nginx y MySQL usando Docker y Docker Compose. Es el procedimiento recomendado para instalaciones nuevas. ## Primeros pasos ### Instalación de Docker Para instalar Docker puedes seguir los pasos de la [documentación oficial](https://docs.docker.com/engine/install/). En este caso, se instalará Docker en Ubuntu 24.04 usando apt. ```bash # Actualizar el índice de paquetes: sudo apt-get update # Instalar paquetes para permitir a apt usar un repositorio sobre HTTPS: sudo apt-get install ca-certificates curl # Agregar la clave GPG oficial de Docker: sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Agregar el repositorio de Docker a las fuentes de APT: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update # Instalar Docker: sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Verificar la instalación: sudo docker --version ``` ### Rotación de logs de los contenedores Sin límite de tamaño, los logs de los contenedores crecen hasta llenar el disco del servidor. El límite se declara **en el `docker-compose.yml`**, en cada servicio, y así queda versionado junto con el resto de la definición: ```yaml logging: driver: json-file options: max-size: "10m" max-file: "5" ``` Con eso cada contenedor guarda como máximo 5 archivos de 10 MB. El archivo completo del apartado [Docker Compose de Histrix](https://docs.histrix.com.ar/es/instalacion_nginx/#docker-compose-de-histrix) ya lo trae aplicado a los tres servicios mediante un bloque reutilizable. :::caution Poner `log-driver` y `log-opts` en `/etc/docker/daemon.json` no alcanza. Ese archivo fija únicamente el valor por omisión del daemon: solo afecta a los contenedores **creados después** del cambio —los que ya existen conservan su configuración aunque se reinicien— y cualquier bloque `logging` del compose lo sobrescribe. Declararlo en el compose es lo que efectivamente limita el tamaño. ::: :::tip Para más información sobre el driver de logs, consultar la [documentación oficial](https://docs.docker.com/engine/logging/drivers/json-file/). ::: ## Configurar usuario del servicio Como usario root, crear un usuario para el servicio de Histrix: ```bash sudo adduser automata ``` le damos permisos de sudo: ```bash sudo usermod -aG sudo automata ``` Le damos permisos de docker: ```bash sudo usermod -aG docker automata ``` ## Instalación de Histrix Para inicar tiene que entrar como usuario automata: ```bash su - automata ``` Dentro del home del usuario automata tienes que generar la siguiente estructura de carpetas: ```bash mkdir -p ~/[Nombre del cliente]/{modules,database} ``` Para continuar tienes que crear una api key de bitbucket con permisos de lectura y escritura de repositorios. En el siguiente [enlace](https://bitbucket.org/account/settings/app-passwords/) puedes crear una api key. Teniendo la api key te mueves a la carpeta modules y clonas los modulos de histrix: ```bash cd ~/[Nombre del cliente]/modules git clone --depth 4 https://[nombre-usuario]:[api-key]@bitbucket.org/mundo-it/erp-full.git erp-full git clone --depth 4 https://[nombre-usuario]:[api-key]@bitbucket.org/mundo-it/htxcore.git histrix ``` En la carpeta database tienes que clonar el repositorio de los xmls del cliente: ```bash cd ~/[Nombre del cliente]/database git clone --depth 4 https://[nombre-usuario]:[api-key]@bitbucket.org/mundo-it/[nombre-repositorio-xml].git ``` ## Configuración de Histrix Histrix su configuracion va en la carpeta database con un archivo llamado config.xml que tiene la siguiente estructura: ```xml histrix_back.jpg es [Nombre del ciente] [nombre de la base de dato] mysql [Usuario de la base de dato] [Contraseña de la base de dato] [url del servidor base de dato] [Nombre del ciente] [Direccion del ciente] [Cuit del cliente] logo.jpg logo.png |clientes|proveedores|stock|iva|contabilidad|packs|vendedores|transportistas ``` El atributo `xmlPath` de cada `` define el directorio de sus XML (`database/{xmlPath}/xml/`) y, junto con el parámetro `CONFIG::baseModule` de la tabla `HTXOPTIONS`, determina cómo se resuelve cada archivo. Ver [Arquitectura](https://docs.histrix.com.ar/es/arquitectura/). :::caution[Actualización de una instalación anterior a mayo de 2026] Migrar una instalación previa exige dos cambios de schema que no se pueden aplicar desde la interfaz: - `HTXPROFILES.realm` — sin esa columna el login devuelve 500 para todos los usuarios, incluido el administrador. - `HTXMENU.web_version = 1` — sin ese valor el menú aparece vacío y sin ningún error. Con el sistema de migraciones instalado, ambos cambios se aplican con `php histrix migrate --all-databases`. Ver [Migraciones de base](https://docs.histrix.com.ar/es/migraciones/). ::: ## Docker Compose de Histrix Se crea un archivo `docker-compose.yml` en la raíz del usuario `automata` con el siguiente contenido: ```yaml # Política de logs compartida por los tres servicios x-logging: &default-logging driver: json-file options: max-size: "10m" max-file: "5" services: redis: image: redis:6.0.3-buster restart: unless-stopped container_name: redis logging: *default-logging expose: - "6379" command: "redis-server --appendonly yes" networks: - backend db: image: mysql:8.3.0 command: --default-authentication-plugin=mysql_native_password --sql-mode="NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" container_name: db volumes: - mysql-data:/var/lib/mysql restart: unless-stopped logging: *default-logging networks: - backend expose: - "3306" environment: MYSQL_ROOT_PASSWORD: [Contraseña de la base de dato] MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: [nombre de la base de dato] TZ: America/Argentina/Buenos_Aires php: image: mundoit/histrix-runtime:nginx-06 restart: unless-stopped container_name: histrix logging: *default-logging volumes: - "/home/automata/[nombre-cliente]/database:/var/www/html/database" - "/home/automata/[nombre-cliente]/modules:/var/www/html/modules" ports: - "80:80" # Solo si se va a usar el servidor de notificaciones: # - "8888:8888" depends_on: - redis - db environment: - REDIS_SERVER_HOST=redis - GIT_EMAIL=[Correo electronico del usuario de bitbucket] - GIT_NAME=[Nombre del usuario de bitbucket] - GIT_PERSONAL_TOKEN=[Api key de bitbucket] - GIT_USERNAME=[Nombre de usuario de bitbucket] - GIT_REPO=bitbucket.org/mundo-it/histrix.git - GIT_BRANCH=nginx-fpm - PGID=[ID del grupo de automata] - PUID=[ID del usuario de automata] - WEBROOT=/var/www/html - RUN_SCRIPTS=1 - PHP_MEM_LIMIT=1024M - PHP_POST_MAX_SIZE=1024M - PHP_UPLOAD_MAX_FILESIZE=1024M - PHP_ERRORS_STDERR=1 - SKIP_COMPOSER=1 - REMOVE_FILES=0 - ERRORS=0 networks: - backend - frontend links: - db volumes: mysql-data: # Donde se guarda la base de datos networks: backend: frontend: ``` :::note El compose necesita el ID del usuario y del grupo de `automata`: ```bash id automata # Salida # uid=1000(automata) gid=1000(automata) groups=1000(automata),27(sudo),100(users),987(docker) ``` ::: ### Puerto 8888 El 8888 es el puerto del servidor de notificaciones por WebSocket. **Solo hay que exponerlo si se va a levantar el push server**; en una instalación que no usa notificaciones en tiempo real, publicarlo no aporta nada y amplía la superficie expuesta. Ver [Servidor de notificaciones](https://docs.histrix.com.ar/es/pushserver/). ## Iniciar Histrix ```bash docker compose up -d ``` Histrix queda escuchando en el puerto 80 de la máquina. :::caution Los cambios de `logging` en el compose se aplican al **crear** el contenedor, no al reiniciarlo. En una instalación que ya está corriendo hay que recrear los contenedores: ```bash docker compose up -d --force-recreate ``` Para verificar que quedó aplicado: ```bash docker inspect -f '{{.HostConfig.LogConfig}}' histrix ``` ::: :::tip Para más información sobre Docker Compose, consultar la [documentación oficial](https://docs.docker.com/compose/). ::: ## Comandos útiles ### Pull de cambios de Histrix Para hacer un pull de los cambios de Histrix, se debe ejecutar el siguiente comando: ```bash sudo docker exec -t -i histrix /usr/bin/pull ``` ### Pull de cambios de los modulos Para hacer un pull de los cambios de los modulos de Histrix, se debe ejecutar el siguiente comando: ```bash cd ~/[Nombre del cliente]/modules/erp-full git pull cd ~/[Nombre del cliente]/modules/histrix git pull ``` ### Pull de cambios de los xmls Para hacer un pull de los cambios de los xmls del cliente, se debe ejecutar el siguiente comando: ```bash cd ~/[Nombre del cliente]/database/[nombre-repositorio-xml] git pull ``` ### Ver logs de Histrix Los logs se organizan por año y mes dentro del directorio de la base: ```bash cd ~/[Nombre del cliente]/database/[nombre-repositorio-xml]/log/[año]/[mes] # Consultas tail -f sql_select.log # Inserciones y actualizaciones tail -f sql_update.log ``` El directorio del mes se crea al vuelo, así que necesita permiso de escritura para el proceso de PHP. Ver [Problemas frecuentes](https://docs.histrix.com.ar/es/problemasfrecuentes/). ### Regenerar el mapa de clases Necesario después de crear, mover o renombrar una clase de `dataSource`: ```bash docker exec -it histrix composer dumpautoload ``` ### Aplicar migraciones ```bash docker exec -it histrix php histrix migrate:status --all-databases docker exec -it histrix php histrix migrate --all-databases ``` ### Limpiar el caché de assets Cuando los bundles de JavaScript o CSS quedan con contenido inválido: ```bash docker exec histrix sh -c 'rm -rf /tmp/histrix/*' ``` Los cambios en los XML no requieren limpiar nada: el motor los reparsea en cada request y se ven recargando la página. ### Correr los tests ```bash docker exec -it histrix vendor/bin/phpunit ``` ------------------------------------------------------------------------------ ## Instalación con Apache URL: https://docs.histrix.com.ar/es/instalacion/ Instalación de Histrix con Apache y MySQL sobre un servidor Ubuntu físico o virtual. Estado: Histórico. ------------------------------------------------------------------------------ :::caution[Documento histórico] Este procedimiento corresponde a instalaciones sobre Apache sin contenedores. Se conserva como referencia para las instalaciones existentes. Para una instalación nueva, seguir [Instalación con Nginx y Docker](https://docs.histrix.com.ar/es/instalacion_nginx/). ::: ### Instalación automática ~~~bash sudo apt-get install git git clone https://bitbucket.org/mundo-it/histrix_installer.git cd histrix_installer sudo ./setup.sh ~~~ ### Paquetes necesarios #### Ubuntu Paquetes indispensables para el funcionamiento de Histrix. #### MySQL ~~~bash sudo apt-get install mysql-server ~~~ #### PHP ~~~bash sudo apt-get install php php-common php-mysql php-gd php-imagick php-xmlrpc ~~~ #### Redis ~~~bash sudo apt-get install redis-server php-redis ~~~ ### Recomendados Optimiza el rendimiento de PHP al precompilar los programas ~~~bash sudo apt-get install php-xcache ~~~ ### Opcionales Ldap, permite sincronizar tablas del sistema con servidores ldap. ~~~bash sudo apt-get install php-ldap ~~~ Imap permite que histrix pueda ser configurado para chequear casillas de correo externas. ~~~bash sudo apt-get install php-imap ~~~ Para soporte con bases de datos MS sql server ~~~bash sudo apt-get install php-sybase ~~~ Soporte para visualizar PDF con Flash on line Estos paquetes permiten visualizar archivos pdf con el visualizador interno en flash ~~~bash sudo add-apt-repository ppa:guilhem-fr/swftools sudo apt-get update sudo apt-get install swftools ~~~ ### Clonado de un repositorio Por defecto el path de instalación de histrix es en /usr/share por tal motivo haremos los siguientes pasos ~~~bash cd /usr/share sudo git clone https://bitbucket.org/mundo-it/histrix.git ~~~ ### Archivo de Configuración **Ejemplo de Archivo de Configuración Apache** ~~~xml ServerAdmin info@tld.com DocumentRoot [path_histrix] Options -Indexes FollowSymLinks -MultiViews IndexIgnore * AllowOverride All Order allow,deny Allow from all ErrorLog /var/log/apache2/error.log LogLevel error CustomLog /var/log/apache2/access.log combined #SSLEngine On #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI \.(?:exe|t?gz|jpg|zip|bz2|sit|rar)$ no-gzip dont-vary # Keep a log of compression ratio on each request DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate CustomLog /var/log/apache2/htxdeflate.log deflate BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html ~~~ Si Se quiere forzar la utilización de SSL, se puede introducir la siguiente configuración para que todas las peticiones http se traduzcan en https ~~~bash RewriteEngine on RewriteCond %{SERVER_PORT} ^80$ RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R] ~~~ Histrix utiliza un archivo de configuración config.xml, el mismo debe colocarse en la carpeta config de la instalación local **Ejemplo de Archivo de Configuración** ~~~xml NOMBRE DE LA EMPRESA S.R.L. es database/empresa/img/logo_inicio.jpg ../database/empresa/img/fondo_empresa.jpg empresadb mysql database_user Database_password localhost EMPRESA EMPRESA Calle Nro xxx 9999999 clientes proveedores stock vendedores custom.css logo_empresa.jpg logo2.jpg logo_empresa.jpg fondo_empresa.jpg clientes proveedores stock vendedores transportistas es http://www.estudiogenus.com imap.gmail.com info@domain.com.ar smtp.gmail.com mail@domain.com.ar password_email ~~~ **Sistema de Archivos** Histrix soporta montar sistemas de archivos locales o remotos tanto para los modulos XML como para los archivos adjuntos, dentro del tag \: ~~~xml id="files" Para arhivos Adjuntos id="xml" Para modulos Xml ~~~ Ejemplos para diversos adaptadores: **Local** ~~~xml [PATH] ~~~ **AWS** ~~~xml [ACESS_KEY] [SECRET] [REGION] [AWS_OPTIONAL_PATH] [AWS_BUCKET] ~~~ **Dropbox** Para configurar Dropbox: . ~~~xml [ACESS_KEY] [ACCESS_TOKEN] [SECRET] [OPTIONAL_PATH] ~~~ **Rackspace** ~~~xml [USERNAME] [PASSWORD] [CONTAINER] [OPTIONAL_PATH] ~~~ ------------------------------------------------------------------------------ ## Comandos del CLI URL: https://docs.histrix.com.ar/es/cli/ Script de administración y mantenimiento de una instalación de Histrix. ------------------------------------------------------------------------------ El script `histrix` en la raíz de la instalación agrupa las tareas de administración: alta de bases, instalación y actualización de módulos, migraciones, servidor de notificaciones, tareas programadas y ejecución de tests. ```bash cd /usr/share/histrix php histrix ``` Sin argumentos imprime la ayuda con todos los comandos disponibles. :::note En una instalación con Docker el script se ejecuta dentro del contenedor: ```bash docker exec -it histrix php histrix migrate:status --all-databases ``` ::: ## Bases y módulos | Comando | Descripción | | --- | --- | | `histrix new [base] [usuario] [clave] [host]` | Crea una base nueva con su estructura de directorios, sus tablas de sistema y su entrada en `config.xml` | | `histrix list` | Lista los módulos disponibles | | `histrix install [módulo] [usuario]` | Instala un módulo desde su repositorio | | `histrix update` | Actualiza el motor y las dependencias de Composer | | `histrix update [módulo]` | Actualiza un módulo desde su repositorio | | `histrix update --all-modules` | Actualiza todos los módulos | `histrix new` deja creado el árbol `database/{base}/` con sus subdirectorios (`xml`, `files`, `log`, `tests`), crea las tablas de sistema, el menú por omisión y el usuario inicial de Histrix. ## Migraciones | Comando | Descripción | | --- | --- | | `histrix migrate` | Aplica las migraciones pendientes | | `histrix migrate:status` | Muestra el estado por módulo | | `histrix migrate:rollback` | Revierte el último lote | | `histrix migrate:diff` | Compara el schema real contra el SQL del módulo | | `histrix migrate:generate` | Crea una migración nueva | | `histrix migrate:export` | Exporta al módulo tablas y rutinas que solo existen en la base | Detalle de opciones en [Migraciones de base](https://docs.histrix.com.ar/es/migraciones/). ## Servicios | Comando | Descripción | | --- | --- | | `histrix scheduler [base]` | Dispara el planificador de tareas de una base | | `histrix push-server [host:puerto] [public.pem] [private.pem]` | Levanta el servidor de notificaciones | `scheduler` es el comando que se engancha al cron del sistema para ejecutar las tareas programadas de cada base. Ver [Servidor de notificaciones](https://docs.histrix.com.ar/es/pushserver/). ## Tests | Comando | Descripción | | --- | --- | | `histrix test [base] [ArchivoCest.php] [entorno]` | Corre los tests de aceptación de una base | | `histrix xmltest [archivo] [base]` | Corre el test de un XML puntual | Ver [Testing](https://docs.histrix.com.ar/es/testing/). ------------------------------------------------------------------------------ ## Migraciones de base URL: https://docs.histrix.com.ar/es/migraciones/ Sistema de migraciones versionadas para el schema del core y de los módulos. ------------------------------------------------------------------------------ Los cambios de schema del core y de los módulos se aplican con migraciones versionadas. No se editan a mano en cada base ni se distribuyen como scripts SQL sueltos: se escriben una vez, quedan versionadas en el repositorio del módulo y se aplican en todas las bases con el mismo comando. ## Módulos y ubicaciones Cada conjunto de migraciones pertenece a un módulo, y el motor los descubre solo: | Módulo | Directorio de migraciones | | --- | --- | | `core` | `admin/migrations/` | | `erp` | `modules/erp-migrations/` | | Cualquier otro | `modules/{módulo}/migrations/` | ## Formato de una migración El nombre del archivo es una marca de tiempo de 14 dígitos, un guion bajo y el nombre en *snake_case*: `20260611103000_add_realm_to_profiles.php`. También se aceptan archivos `.sql` con el mismo patrón. Una migración PHP extiende `AbstractMigration` y define `up()` y `down()`: ```php addColumn('HTXPROFILES', 'realm', "VARCHAR(255) NOT NULL DEFAULT 'web'"); } public function down() { $this->dropColumn('HTXPROFILES', 'realm'); } } ``` `AbstractMigration` provee ayudas idempotentes para no romper en bases donde el cambio ya existe: | Método | Uso | | --- | --- | | `execute($sql)` | Ejecuta SQL literal | | `query($sql)` | Ejecuta y devuelve el resultado | | `tableExists($tabla)` | Verifica la existencia de una tabla | | `columnExists($tabla, $columna)` | Verifica la existencia de una columna | | `createTable($nombre, $columnas, $opciones)` | `CREATE TABLE IF NOT EXISTS` (InnoDB y utf8mb4 por defecto) | | `dropTable($nombre)` | Elimina la tabla | | `addColumn($tabla, $columna, $tipo, $after)` | Agrega la columna solo si falta | | `dropColumn($tabla, $columna)` | Elimina la columna | | `renameColumn($tabla, $viejo, $nuevo, $tipo)` | Renombra la columna | | `addIndex($tabla, $columnas, $nombre, $unique)` | Crea un índice | | `dropIndex($tabla, $nombre)` | Elimina un índice | ## Comandos Todos aceptan `--db={base}` para una base puntual o `--all-databases` para recorrer todas las declaradas en `config.xml`, y `--module={módulo}` para limitar el alcance. ```bash # Estado de las migraciones php histrix migrate:status --all-databases # Aplicar las pendientes (--dry-run muestra sin ejecutar) php histrix migrate --all-databases php histrix migrate --db=cliente --module=erp-full --dry-run # Revertir el último lote (o N lotes con --steps) php histrix migrate:rollback --db=cliente php histrix migrate:rollback --db=cliente --steps=3 # Crear una migración vacía php histrix migrate:generate --module=erp-full "add realm to profiles" # Comparar el schema real contra el SQL del módulo php histrix migrate:diff --db=cliente --module=erp-full php histrix migrate:diff --db=cliente --module=erp-full --generate # Exportar al módulo las tablas y rutinas que existen en la base pero no en su SQL php histrix migrate:export --module=erp-full --dry-run ``` Opciones específicas: | Comando | Opción | Efecto | | --- | --- | --- | | `migrate` | `--dry-run` | Muestra lo que haría sin tocar la base | | `migrate:rollback` | `--steps=N` | Cantidad de lotes a revertir (1 por defecto) | | `migrate:diff` | `--generate` | Genera una migración con las diferencias encontradas | | `migrate:diff` | `--force` | Continúa ante diferencias que normalmente abortan | | `migrate:generate` | `--baseline` | Genera la migración base a partir del schema existente | | `migrate:generate` | `--mark-executed` | Marca la baseline como ya aplicada | ## Registro de ejecución Cada base lleva su propia tabla `HTX_MIGRATIONS` con la versión, el módulo, el nombre, el lote (*batch*) y las marcas de inicio y fin. El rollback usa el lote para saber qué revertir en conjunto. ## Panel web El panel de migraciones está en `admin/migrations/index.php`. Es un PHP independiente, no un XML de Histrix: permite ver el estado, aplicar pendientes, revertir y crear migraciones desde el navegador. :::note Ante una columna faltante en una base de test, la corrección va en la base —con la migración correspondiente— y no en el código que la consume. Adaptar una consulta o un test al schema viejo esconde el problema y lo traslada a producción. ::: ------------------------------------------------------------------------------ ## Procesos asíncronos URL: https://docs.histrix.com.ar/es/gearman/ Worker de Gearman para trabajos en segundo plano y planificador de tareas por base. ------------------------------------------------------------------------------ Histrix resuelve el trabajo que no puede correr dentro del request por dos vías distintas: un *worker* de Gearman para trabajos disparados por el usuario, y un planificador propio para tareas recurrentes. ## Worker de Gearman El motor encola en Gearman dos tipos de trabajo: | Trabajo | Origen | | --- | --- | | `processContainer` | Grabación de un contenedor en segundo plano | | `send_email` | Envío de correo | Los trabajos se encolan con `doBackground` contra el servidor local, de modo que el request devuelve la respuesta sin esperar a que terminen. ### Instalación ```bash sudo apt-get install gearman php-gearman ``` ### Servicio El worker es `cgi-bin/gearman_worker.php` y se ejecuta como servicio de systemd. La unidad viene incluida en la instalación: ```bash sudo cp /usr/share/histrix/cgi-bin/histrix_worker.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable histrix_worker.service sudo systemctl start histrix_worker.service ``` Verificación: ```bash systemctl status histrix_worker.service ``` El servicio está configurado con `Restart=always`, así que se levanta de nuevo si el worker termina. :::note Si Gearman no está instalado, las operaciones que lo usan no se encolan. Conviene verificar el estado del servicio cuando se reporta que "no llegan los correos" o que una grabación larga quedó sin efecto. ::: ## Planificador de tareas Las tareas recurrentes de cada base se definen en la tabla `HTX_CRONTAB` y se administran desde la interfaz o por API (`/api/db/{db}/crontab/`). Cada fila tiene una expresión cron estándar, el comando a ejecutar y el usuario con cuya sesión debe correr. El planificador evalúa qué tareas corresponden en el momento de la invocación y las ejecuta: ```bash php histrix scheduler {base} ``` Ese comando es el que se engancha al cron del sistema, una vez por base: ``` * * * * * cd /usr/share/histrix && php histrix scheduler cliente >> /var/log/histrix-cron.log 2>&1 ``` Cada tarea se ejecuta con la sesión del usuario declarado en la fila, de modo que los permisos y los datos de contexto sean los de ese usuario y no los del proceso del cron. ------------------------------------------------------------------------------ ## Servidor de notificaciones URL: https://docs.histrix.com.ar/es/pushserver/ Servidor WAMP para notificaciones en tiempo real: publicación desde PHP y suscripción desde el navegador. ------------------------------------------------------------------------------ Histrix incluye un servidor de notificaciones en tiempo real construido sobre [Thruway](https://github.com/voryx/Thruway) y Ratchet. Implementa WAMP: el servidor actúa como router de mensajes y los clientes publican o se suscriben a canales. ## Inicio ```bash php histrix push-server [0.0.0.0:8888] ``` Sin argumentos escucha en `0.0.0.0:8888`. El router usa el realm `realm1` y autentica a los clientes con WAMP-CRA contra los usuarios de la base. :::note En una instalación con Docker, el puerto 8888 solo hace falta publicarlo en el `docker-compose.yml` si se va a levantar este servidor. Una instalación que no usa notificaciones en tiempo real no necesita exponerlo. Ver [Instalación con Nginx y Docker](https://docs.histrix.com.ar/es/instalacion_nginx/). ::: ## Publicación desde PHP ```php \Histrix\Push\Event::publish($canal, (array) $contenido); ``` ```php \Histrix\Push\Event::publish( 'nueva_oferta', ['xml' => 'oferta_crud.xml', 'user' => 'user_id'] ); ``` El canal se prefija automáticamente con el id de la base, de modo que `nueva_oferta` se publica como `{base}.nueva_oferta` y las bases quedan aisladas entre sí. Al mensaje se le agregan el usuario que lo emitió y la marca de tiempo. La publicación se hace por ZMQ hacia `tcp://localhost:5555`, así que el proceso web necesita la extensión ZMQ de PHP. Si no está cargada, `publish` no hace nada y no interrumpe la operación en curso. ### Publicación desde un XML Dentro de un `` de un XML de tipo `nosql`: ```xml Oferta
'oferta_crud.xml', 'user' => 'user_id'] ); loger('notifico oferta'); ]]>
``` ## Suscripción desde el navegador El cliente usa [Autobahn](https://github.com/crossbario/autobahn-js). La conexión la abre el propio motor al iniciar la sesión: se conecta a la ruta `/wss/` del mismo host —que el servidor web enruta al puerto del push server—, con el realm `realm1` y autenticación `wampcra`, y queda suscripto al canal personal del usuario (`{base}.{user_id}`). ```js var protocol = (window.location.protocol == 'https:') ? 'wss' : 'ws'; var connection = new autobahn.Connection({ url: protocol + '://' + Histrix.host + '/wss/', realm: 'realm1', authid: Histrix.user, authmethods: ['wampcra'], onchallenge: onchallenge }); connection.onopen = function (session) { session.subscribe(Histrix.db + '.' + Histrix.user_id, function (args) { Histrix.showMsg(args[0] + ' - ' + args[1]); }); Histrix.wsConnection = session; }; connection.open(); ``` Para suscribirse a un canal adicional desde código propio, con la conexión ya abierta: ```js if (Histrix.wsConnection && Histrix.wsConnection.isOpen) { Histrix.wsConnection.subscribe(Histrix.db + '.mi_canal', function (args) { Histrix.showMsg(args[0]); }); } ``` Y para publicar desde el navegador: ```js Histrix.wsConnection.publish(Histrix.db + '.mi_canal', ['Hola']); ``` :::note El namespace es `\Histrix\Push\Event`. Documentación anterior lo mencionaba como `\Histrix\Pusher\Event`, que ya no existe. ::: ------------------------------------------------------------------------------ ## Plugins URL: https://docs.histrix.com.ar/es/plugins/ Sistema de plugins: estructura, hooks de PHP y de JavaScript, y configuración. ------------------------------------------------------------------------------ Un plugin agrega funcionalidad al escritorio de Histrix sin modificar el motor. Define funciones internas y las registra en uno o más *hooks*; el motor las ejecuta en el momento y lugar correspondientes. ## Ubicación El cargador de plugins busca en tres lugares, en este orden: | Ruta | Alcance | | --- | --- | | `database/{base}/plugins/` | Solo esa base | | `plugins/` | Toda la instalación | | `modules/{módulo}/plugins/` | Las bases que usan ese módulo | Cada plugin vive en su propio directorio y contiene un archivo de clase con el mismo nombre que el directorio: - histrix/ - plugins/ - test/ - test.php ## Estructura de un plugin La clase extiende `\Histrix\Plugin\Plugin` y registra sus funciones en `init()`: ```php registerFunction('trayInit', 'display'); $this->registerFunction('statusBarInit', 'status'); } public function display() { echo 'TEST PLUGIN'; } public function status() { echo '
Test Status Bar Plugin
'; } } ``` ## Hooks de PHP Las funciones registradas con `registerFunction($hook, $función)` se ejecutan desde PHP. | Hook | Momento de ejecución | | --- | --- | | `preSessionInit` | Antes de inicializar la sesión | | `desktopInit` | Al iniciar el escritorio de Histrix | | `statusBarInit` | Al iniciar la barra de estado inferior | | `trayInit` | Al iniciar el área de notificación del panel superior | | `javascriptLoad` | Al inicio; debe devolver un arreglo de archivos JavaScript a cargar | | `javascriptInit` | Al inicio; debe devolver código JavaScript válido | | `cssLoad` | Al inicio; debe devolver un arreglo de archivos CSS a cargar | | `afterSysmon` | Al final del monitor de sistema, que corre periódicamente | | `afterSysmonScripts` | Igual que el anterior; debe devolver un arreglo de sentencias JavaScript | ## Hooks de JavaScript Se registran desde `init()` con `registerJavascriptFunction($hook, $función)` y se ejecutan en el navegador: ```php class test extends \Histrix\Plugin\Plugin { public function init() { $this->registerJavascriptFunction('afterLoadXml', 'myFunction'); } } ``` | Hook | Momento de ejecución | | --- | --- | | `beforeLoadXml` | Antes de `Histrix.LoadXML` | | `afterLoadXml` | Después de `Histrix.LoadXML` | Ambos reciben los mismos parámetros: ```js function miFuncion(contenido, { programTitle: title, container: xmldatos }) {} // contenido: variables GET enviadas — xml (nombre del XML) y dir (directorio) ``` ## Configuración Cada plugin puede declarar opciones en `setDefaultOptions()`. El motor las persiste en la tabla `HTXOPTIONS` con la clave `PLUGIN::{Clase}::{opción}` y las expone en el panel de configuración, agrupadas por plugin. Todo plugin recibe automáticamente una opción `enable`, que arranca en `false`: hay que habilitarlo explícitamente desde la configuración de la base. ```php class weather extends \Histrix\Plugin\Plugin { public function setDefaultOptions() { $this->addOption('ciudad', [ 'name' => 'Ciudad', 'description' => 'Ciudad para el pronóstico', 'value' => 'Rosario', ]); } } ``` El valor se lee con `$this->getParameter('ciudad')`. ## Plugins incluidos La instalación trae, entre otros: `autoInit` (autoarranque de programas), `directLink` (enlaces directos a programas), `htxchat`, `htxconfig`, `htxHud` y `htxHudCmd` (panel de estado y comandos), `htxusermenu`, `lastPrograms`, `localNews`, `screenSaverLed`, `ShowProfile`, `statusMessage` y `userStatus`. ------------------------------------------------------------------------------ ## Localización URL: https://docs.histrix.com.ar/es/localizacion/ Traducción de la interfaz, del menú y de los contenidos de los XML. ------------------------------------------------------------------------------ Histrix admite la localización de todos sus componentes. El idioma de una instalación se define con el tag `` en la sección `` de `database/config.xml`. ## Elementos de la interfaz Las traducciones de los elementos propios de Histrix —botones, mensajes, títulos de diálogos— están en el directorio `lang/`, un archivo PHP por idioma: - histrix/ - lang/ - es.php - en.php - fr.php - pt.php ## Menú y contenidos de los módulos Para traducir los ítems del menú, los módulos y los contenidos de los XML, Histrix usa archivos `.tmx` (*Translation Memory eXchange*) ubicados en el directorio base de cada módulo. El nombre del archivo coincide con el del módulo: - histrix/ - modules/ - histrix/ - histrix.tmx - proveedores/ - proveedores.tmx Así, `proveedores.tmx` contiene las traducciones de los programas del módulo de proveedores. ## Edición de los archivos TMX Los `.tmx` son XML estándar, editables con cualquier editor de texto o con herramientas específicas de traducción como [Virtaal](http://virtaal.translatehouse.org/?id=virtaal/index&redirect=1). ============================================================================== # Desarrollo ============================================================================== ------------------------------------------------------------------------------ ## Tutorial: primera consulta URL: https://docs.histrix.com.ar/es/tutorial/ Recorrido completo: alta en el menú, XML de consulta, joins, etiquetas, filtros y helpers. ------------------------------------------------------------------------------ Este tutorial construye una consulta desde cero: se da de alta el ítem en el menú, se escribe el XML, se agregan joins para traer datos de otras tablas y se termina con filtros y un desplegable de selección. ## Alta del ítem en el menú El menú del sistema es el de la imagen: [imagen: Tutorial1] La primera opción de la tuerquita(engranaje) que esta a la derecha de este menú es “Menus del sistema” cuando la abrimos aparece el árbol de menus: [imagen: Tutorial2] En esta parte del sistema se pueden ver editar y agregar nuevos elementos al menú. Lo más sencillo es ver como están ordenados, como están dados de alta y en nuestro caso, que vamos a hacer una consulta en la parte de bancos, copiar parte de lo que ya esta hecho. El nuevo elemento ya está en la foto es “Consulta de gastos” vamos a ver como lo dimos de alta. [imagen: Tutorial3] **Orden:** número que ordena el ítem entre los que comparten el mismo nivel. **Menú:** el ítem padre. Se copia de otro ítem que esté en el mismo nivel y submenú. Para agregar el nuevo ítem dentro de "Bancos" → "Consultas", se usa el mismo valor que tienen los ítems que ya están ahí. **Título:** el texto que se muestra en el menú. **Parámetros:** configuraciones del ítem. Para una consulta interesan dos: - `xml=` nombre del archivo que se ejecuta al elegir el ítem. - `dir=` directorio donde está ese archivo. ## Organización de archivos y directorios Los archivos de cada cliente viven bajo el directorio de su base: - usr/ - share/ - histrix/ - database/ - ElClienteX/ ~~~bash /usr/share/histrix/database// ~~~ Dentro de esta carpeta se genera un árbol de directorios parecido a este: - ElClienteX/ - ayudas/ - bancos/ - ing/ - man/ - qry/ - test/ - acceptance/ - _support/ - caja/ - ing/ - accesorios/ - class/ - pedidos/ - ruta/ - man/ - proc/ - del/ - qry/ - test/ - acceptance/ - _support/ - calidad/ - ambiente/ - ing/ - man/ - qry/ - clientes/ - inputacion/ - ing/ - mos/ - obleas/ - pre/ - man/ - tests/ - qry/ - tests/ - acceptance/ - _support/ - dasbuard/ Cada directorio dentro de la base representa un módulo, y dentro de cada módulo están los archivos que invocan los ítems del menú. Para este ejemplo se crea `gastos_qry.xml` en el directorio `bancos` y se asocia el ítem "Consulta de gastos" a ese archivo: [imagen: Tutorial5] ## Contenido del archivo XML El XML describe una o varias tablas de la base. Este ejemplo trabaja sobre `REG_MOVIMIENTOS`, que contiene los movimientos —entre ellos los bancarios. Estos son algunos de sus campos: [imagen: Tutorial6] Un primer borrador del archivo: ~~~xml Consulta de gastos
~~~ La declaración XML y el tag `` son obligatorios. En el `` van los atributos del programa: `tipo="consulta"` define que es una consulta y `paginar="50"` que se muestren 50 filas por página. `` y `
` también son obligatorios; dentro de `` va `` con el nombre de la tabla base, y dentro de la tabla los `` con los campos a mostrar. Así se ve la consulta al abrir el ítem "Consulta de gastos": [imagen: Tutorial8] ## Joins Es habitual que los datos a mostrar estén repartidos en varias tablas. El join las une. `REG_MOVIMIENTOS` tiene un campo `cajmovimiento_id` y existe la tabla `CAJ_MOVIMIENTOS` con el campo `id_cajmovimiento`: cada valor del primero se corresponde con una fila de la segunda. En SQL sería: ~~~sql SELECT * FROM REG_MOVIMIENTOS RM JOIN CAJ_MOVIMIENTOS CM ON RM.cajmovimiento_id = CM.id_cajmovimiento ~~~ El equivalente en `gastos_qry.xml`: ~~~xml Consulta de gastos
REG_MOVIMIENTOS.cajmovimiento_id
~~~ El `` se abre después de cerrar el `` de la tabla base y contiene su propio `
`. Además del join se agregaron los campos `cajmovimiento_id`, `cajconcepto_id` y `nro_movimiento`. Los dos últimos pertenecen a `CAJ_MOVIMIENTOS`, así que el `` necesita el atributo `tabla` indicando de qué tabla se toman. ## Etiquetas El tag `
REG_MOVIMIENTOS.cajmovimiento_id
CAJ_MOVIMIENTOS.cajconcepto_id
~~~ Con eso ya se pueden usar los campos de `CAJ_CONCEPTOS`: ~~~xml ~~~ El filtro se declara en un bloque `` con el campo por el que se quiere filtrar: ~~~xml
= ~~~ El `` va dentro del `
`, antes de los campos. Cada campo del filtro se declara como cualquier otro, más un `` que define cómo se compara. El resultado es una barra de filtros: [imagen: Tutorial15] La lista queda restringida a los registros cuya descripción de concepto coincida con lo ingresado: escribiendo "Depósitos" y presionando "Buscar" se ven solo los depósitos. Con el campo numérico `cajconcepto_id` el comportamiento sería el mismo pero comparando códigos, lo que obliga al usuario a conocerlos de memoria. ## Helpers Es preferible que el usuario elija de una lista desplegable: [imagen: Tutorial16] La definición del filtro no cambia: ~~~xml = ~~~ Lo que cambia es la declaración del campo, después del cierre de `` y dentro del `
`: ~~~xml id_cajconcepto ~~~ El atributo `noshow="true"` es opcional: evita que el campo aparezca como columna del listado. El `` apunta a un XML del directorio `ayudas`, que es el que provee los id y las descripciones de los conceptos para armar el desplegable. Este es su contenido: ~~~xml Conceptos
~~~ En un combo el orden de los campos importa: el **primero** (`id_cajconcepto`) es el valor que se transfiere al formulario, y el **segundo** (`descripcion_concepto`) es el texto que ve el usuario. ------------------------------------------------------------------------------ ## Nombres de los XML URL: https://docs.histrix.com.ar/es/nombresxml/ Convención de nombres de archivo según el tipo de programa. ------------------------------------------------------------------------------ El nombre de un XML se compone del nombre de la tabla, opcionalmente su funcionalidad, y un sufijo que identifica el tipo de programa: ``` movimientos_balance_gral_qry.xml │ │ └── tipo: consulta │ └── funcionalidad └── tabla ``` ## Sufijos por tipo | Sufijo | Tipo de programa | Ejemplo | | --- | --- | --- | | `_qry` | Consulta | `cuentas_qry.xml` | | `_crud` | Alta, baja y modificación | `cuentas_crud.xml` | | `_help` | Ayuda (popup de selección) | `cuentas_help.xml` | | `_tree` | Estructura de árbol | `cuentas_tree.xml` | | `_chart` | Gráfico | `cuentas_chart.xml` | | `_ing` | Ingreso de datos | `cuentas_ing.xml` | | `_header` | Cabecera de datos | `cuentas_header.xml` | | `_grid` | Grilla de datos | `cuentas_grid.xml` | ## Consultas encadenadas Cuando una consulta invoca a otra para reutilizar su definición, el nombre lleva las dos tablas involucradas: ``` tabla1_tabla2_qry.xml movimientos_detalle_qry.xml ``` ## Movimientos Los XML que ejecutan la grabación de un formulario de ingreso se nombran según la operación que realizan: | Sufijo | Operación | Ejemplo | | --- | --- | --- | | `_ins` | Inserción | `movimientos_detalles_ins.xml` | | `_upd` | Actualización | `movimientos_detalles_upd.xml` | | `_del` | Borrado | `movimientos_detalles_del.xml` | ------------------------------------------------------------------------------ ## Guía de estilos URL: https://docs.histrix.com.ar/es/guiaestilos/ Convenciones de nomenclatura para tablas, campos, menús y archivos XML. ------------------------------------------------------------------------------ ## Nomenclatura de la base ### Nombres de campo En minúsculas, con guión bajo como separador de palabras. ### Claves primarias Se nombran con el prefijo `id_` y se declaran como autoincrementales: ``` id_clave ``` ### Claves foráneas Llevan el mismo nombre que la clave primaria a la que referencian, pero con el `id` al final: ``` clave_id ``` ### Campos comunes entre tablas Los campos que se repiten en varias tablas —`nombre`, `abreviacion`, etc.— llevan el nombre del campo seguido del nombre de la tabla: ``` campo_nombretabla ``` ## Estructura del menú Cada subsistema organiza sus ítems en cuatro subcategorías: | Subcategoría | Contenido | | --- | --- | | Ingresos de datos | Ítems que permiten al usuario ingresar datos | | Informes | Reportes y consultas | | Procesos | Procesos especiales del subsistema | | Mantenimiento | Funciones para mantener los datos del subsistema | La estructura de directorios del módulo replica esa misma organización. - modulo/ - ing/ - tabla_ing.xml - tabla_ins.xml - qry/ - tabla_qry.xml - proc/ - tabla_proc.xml -man/ - tabla_crud.xml ## Formato de los XML ### Codificación Se usa UTF-8, declarado en la primera línea del archivo: ```xml ``` :::caution La declaración debe escribirse `encoding="UTF-8"`, con guión. La variante `UTF8` la aceptan libxml2 y el motor, pero rompe el tooling escrito en Python: los scripts saltean el archivo y el error que reportan apunta a la primera vocal acentuada, no a la declaración. ::: ### Ejemplo de XML básico ~~~xml titulo
Ayuda contextual
~~~ ### Tags del ejemplo | Tag | Función | | --- | --- | | `` | Primer tag del contenido; su atributo `tipo` determina de qué clase de programa se trata | | `` | Título del programa | | `<obs>` | Observaciones sobre el programa | | `<form>` | Abre el bloque que define los datos a utilizar | | `<table>` | Define la tabla base y contiene los campos de la consulta | | `<field>` | Un campo de la consulta | | `<label>` | Etiqueta del campo | | `<help>` | Ayuda contextual del campo | | `<tipo>` | Tipo de dato del campo | La referencia completa de tags y atributos está en la [Referencia del schema](https://docs.histrix.com.ar/es/schema/): el [índice de elementos](https://docs.histrix.com.ar/es/schema/elementos/) lista los 116 tags con su jerarquía, y el [índice de atributos](https://docs.histrix.com.ar/es/schema/atributos/) los 444 atributos en orden alfabético. ------------------------------------------------------------------------------ ## DataSource en PHP URL: https://docs.histrix.com.ar/es/datasource/ Reemplazar la generación automática de SQL por una clase PHP propia. ------------------------------------------------------------------------------ El atributo `dataSource` en `<histrix>` delega en una clase PHP la obtención o la grabación de los datos, en lugar de dejar que el motor arme el SQL a partir del XML. Se usa cuando la consulta no se puede expresar en el XML: agregaciones complejas, columnas dinámicas, datos de un servicio externo o lógica de grabación propia. ```xml <histrix tipo="consulta" dataSource="MiClase"> ``` ## Métodos La clase expone métodos estáticos. El motor llama al que corresponde según la operación: ```php <?php class MiClase { public static function Select($dataContainer) { // debe devolver un arreglo de filas (arreglos campo => valor) } public static function Insert($dataContainer) { } public static function Update($dataContainer, $rowData) { } public static function Delete($dataContainer, $row) { } } ``` | Método | Firma | Cuándo se llama | | --- | --- | --- | | `Select` | `($dataContainer)` | Al consultar datos | | `Insert` | `($dataContainer)` | Al insertar | | `Update` | `($dataContainer, $rowData)` | Al modificar, una vez por fila | | `Delete` | `($dataContainer, $row)` | Al borrar | | `create` | `($dataContainer)` | Al construir el contenedor, antes de leer datos | | `import` | `($dataContainer, $file)` | Al importar un archivo | Solo hay que implementar los que se usan: si falta `Insert`, la inserción sigue el camino normal del motor. ### Varias vistas en una misma clase Con la sintaxis `Clase::Método` se elige explícitamente qué método invocar para el `Select`, lo que permite agrupar consultas relacionadas: ```xml <histrix tipo="consulta" dataSource="Reportes::VentasPorMes"> ``` Sin `::`, el método por omisión es `Select`. ## Los filtros no se aplican solos Cuando hay `dataSource`, el motor no genera SQL y por lo tanto **no aplica los `<filters>`**. El filtrado corre por cuenta de la clase, leyendo los valores del contenedor: ```php $desde = $dataContainer->getField('fecha_desde')->valor; ``` ## El contenedor `$dataContainer` es una instancia de `\Histrix\Data\Container`. Métodos de uso frecuente: | Método | Devuelve | | --- | --- | | `getField($nombre, $tabla)` | El objeto campo; su valor está en `->valor` | | `getSelect()` | El SQL que el motor habría ejecutado, como string | | `getData($fila)` | Los datos cargados en el contenedor | | `setFieldValue($campo, $valor)` | Asigna un valor a un campo | | `getHttpRequest()` | La request PSR-7 | | `getFilters()` | Los filtros declarados | | `getConditions()` | Las condiciones acumuladas | | `getTitle()` | El título del programa | Parámetros de la request: ```php $request = $dataContainer->getHttpRequest(); $postVars = $request->getParsedBody(); // cuerpo $params = $request->getQueryParams(); // query string ``` :::caution `setFieldValue` no evalúa funciones SQL. Pasar `'now()'` como string a un campo de tipo entero graba `0000-00-00` sin emitir error y sin que se note en las lecturas posteriores. Los valores hay que calcularlos en PHP. ::: ## Construir un contenedor propio Dentro de un `dataSource` se puede armar otro contenedor para reutilizar la definición de un XML existente. A partir de un XML en disco: ```php $file = 'example_ing.xml'; $dir = 'example/other/'; $reader = \Histrix\Parser\XmlParser::getReader('', $dir . $file); $dataContainer = $reader->getContainer(); ``` A partir de una definición en memoria: ```php $string = '<histrix tipo="consulta"> <form> <table id="HTXUSERS"> <fieldGroup> <field id="field_1" local="true" order="2"/> <field id="field_2" local="true" order="1"/> </fieldGroup> </table> </form> </histrix>'; $xml = simplexml_load_string($string); $parser = new \Histrix\Parser\XmlParser(); $parser->xml = 'test.xml'; $dataContainer = $parser->createDataContainer($xml); ``` ## Registro de la clase Las clases se cargan por *classmap* de Composer. Después de crear, mover o renombrar una, hay que regenerar el mapa: ```bash composer dumpautoload ``` En una instalación con Docker, el comando corre dentro del contenedor: ```bash docker exec -it histrix composer dumpautoload ``` Si el XML se ejecuta pero no hace nada de lo que define el `dataSource`, o la request falla con `Class 'NombreDeLaClase' not found`, el mapa está desactualizado. ------------------------------------------------------------------------------ ## Exportación de datos URL: https://docs.histrix.com.ar/es/exportar/ Formatos de exportación soportados, configuración por XML y exportación asíncrona. ------------------------------------------------------------------------------ [imagen: Formulario de exportación] Cualquier consulta puede exportarse sin escribir código adicional. Los formatos disponibles en el formulario son: | Formato | Contenido | | --- | --- | | XLS | Planilla de cálculo (Excel, LibreOffice); el archivo se genera como `.xlsx` | | PDF | El mismo diseño que la impresión | | CSV | Texto delimitado, con separador y extensión configurables | | XML | Formato propio de Histrix, reimportable por el sistema | Según la definición del XML se habilitan dos formatos más: `Ldif` cuando el contenedor declara `ldifExport`, y `Wordpress` cuando hay algún campo con `wp_title="true"`. El motor también puede generar RSS a partir de una consulta. ## Configuración desde el XML El formato por omisión es XLS y se cambia con `exportFormat`: ```xml <histrix tipo="consulta" exportFormat="Csv"> ``` Al exportar a CSV se pueden elegir el delimitador y la extensión del archivo: [imagen: Opciones de CSV] Ambos se pueden predefinir en el XML: ```xml <histrix tipo="consulta" delimiter=";"> ``` ```xml <histrix tipo="consulta" extension="txt"> ``` Para ocultar el botón de exportar en un programa: ```xml <histrix tipo="consulta" export="false"> ``` :::note Un campo con `noshow="true"` no se exporta. Cuando hay que ocultar una columna de la grilla pero conservarla en la exportación, usar `colstyle="display:none;"` en lugar de `noshow`. ::: ## Exportación por API | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/export/{formato}/{xml}` | Exporta un XML directamente | | GET | `/api/db/{db}/instance/{instance}/export/{formato}/` | Exporta lo que muestra una instancia | ```bash curl --header "Authorization: Bearer $TOKEN" -o ventas.xlsx \ "https://servidor/api/db/cliente/export/xls/ventas/qry/ventas_qry.xml" ``` Los parámetros de query `separator`, `extension`, `range` y `title` afectan el archivo generado. ## Exportación asíncrona Una exportación de muchas filas puede exceder el tiempo de respuesta del servidor. Para esos casos existe el circuito por trabajos: se encola la exportación, se consulta el estado y se descarga el archivo cuando está listo. ```bash # 1. Encolar: devuelve el identificador del trabajo curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/instance/$INSTANCE/export/start/xls/" # {"jobId":"a1b2c3d4","status":"processing"} # 2. Consultar el estado curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/export-job/status/a1b2c3d4" # 3. Descargar el resultado curl --header "Authorization: Bearer $TOKEN" -o ventas.xlsx \ "https://servidor/api/db/cliente/export-job/download/a1b2c3d4" ``` El servidor responde el `jobId` de inmediato, cierra la conexión y sigue generando el archivo en segundo plano con un límite de 10 minutos. Cuando el entorno no permite cerrar la conexión antes de terminar, la generación se hace en el mismo request y el `jobId` queda disponible igual. ------------------------------------------------------------------------------ ## Facturación electrónica URL: https://docs.histrix.com.ar/es/facturaelectronica/ Regímenes, servicios web, certificados digitales y CAE en la facturación electrónica argentina. ------------------------------------------------------------------------------ :::note Esta página describe la operatoria del régimen argentino de comprobantes electrónicos y los pasos administrativos para habilitarla. Los nombres de organismos y de servicios son los vigentes al momento de escribirla; conviene verificarlos contra la documentación oficial antes de un trámite. ::: ### ¿Qué es la factura electrónica? Las facturas electrónicas son comprobantes originales respaldatorios de las operaciones comerciales. Contienen los mismos datos y tienen la misma validez que los comprobantes tradicionales (talonarios "físicos" en papel), pero su confección, autorización, transmisión y almacenamiento es totalmente electrónico (por computadora, internet, etc; aunque también pueden ser impresos). Esta regulado por la AFIP (Administración Federal de Ingresos Públicos, organismo recaudador a nivel nacional de Argentina), y en principio alcanza obligatoriamente a ciertas actividades: Servicios de planes de salud, transmisión de televisión, acceso a Internet, telefonía móvil, transporte de caudales, seguridad, limpieza, publicidad, Medios de comunicación, Encuestadoras, construcción, informática y desarrolladores de software, profesionales -abogados, contadores, escribanos, licenciados, ingenieros, arquitectos, etc; Industrias de Bienes de Capital, Informática y Telecomunicaciones; Aseguradoras - pólizas de seguros de Caución; etc. (con determinadas excepciones). ### ¿Qué regímenes de facturación electrónica estan disponibles? Por el momento existen dos opciones: - R.E.C.E. (Régimen de Emisión de Comprobantes Electrónicos): Permite autorizar Facturas A,B, M y C para Responsables Inscriptos y Monotributistas mediante Web Services, aplicativo AFIP SIAP RECE o servicio por clave fiscal "Comprobantes en linea" (máximo 100 comprobantes) - R.C.E.L. (Régimen de Emisión de Comprobantes Electrónicos en Línea): Permite autorizar Facturas A, B, M para Responsables Inscriptos (máximo 100 comprobantes) y Facturas C para monotributitas, solo por el servicio por clave fiscal "Comprobantes en linea" En general todas las soluciones de factura electrónica solo funciona mediante web services (RECE), por disposiciones normativas no es posible adaptarlos al RCEL. ### ¿Que servicios web están disponibles para factura electrónica? Por el momento, están habilitados: - WSFE: Web Service Factura Electrónica (original, sin detallar artículos) - WSFEv1: Web Service Factura Electrónica (versión 1, sin detallar artículos) - WSMTXCA: Web Service Factura Electrónica (con detalle de artículos) ### ¿Como pruebo la generación de facturas electrónicas? La AFIP dispone de dos ambientes: - Homologación: servidores de prueba - Producción: servidores definitivos En homologación no es necesario activar el servicio de factura electrónica (régimen RECE), declarar los puntos de venta, etc. Las facturas autorizadas en homologación no tienen validez fiscal (los CAE obtenidos no pueden utilizarse). Para cambiar de un servidor a otro se debe modificar la URL, el resto de la operatoria es idéntico. ### ¿Como genero un certificado electrónico para firma digital? - Homologación: se envia el pedido por email a <webservices@afip.gov.ar> - Producción: subir el pedido por clave fiscal y bajarse el certificado Nota: Cualquier persona que posea CUIT puede generar un certificado para homologación. **Generación** Para poder utilizar la interfase webservice se deben tramitar y asociar los certificados de homologación/producción en la AFIP. **Pasos para crear el certificado** En windows: - Bajar e instalar OpenSSL para windows (en caso de inconvenientes, instalar Redistribuible de Visual C++) - Ingresar por línea de comando al directorio de OpenSSL C:\OpenSSL\bin> **Generar la clave privada (KEY)** ~~~bash openssl genrsa -out empresa.key 2048 ~~~ **Generar el pedido (CSR)** ~~~bash openssl req -new -key empresa.key -subj "/C=AR/O=[empresa]/CN=[nombre]/serialNumber=CUIT [nro_cuit]" -out empresa.csr ~~~ - [empresa] el nombre de la empresa. Ej. Nombre de la empresa tal cual figura en la consulta de inscripción, ej.: Empresa S A - [nombre] nombre del servidor o del personal a cargo. Nombre del servicio, aplicación u unidad operativa, ej: Interfaz FEhistrix - [nro_cuit] la CUIT sin guiones de la empresa o programador. Ej. CUIT xxxxxxxxxxx **Firma del Certificado (CRT)** Enviar el empresa.csr a la AFIP para que lo firmen y devuelvan el certificado empresa.crt. Homologación: - Enviarlo por email a la AFIP el archivo CSR ( webservices@afip...). Producción: - Ingresar por clave fiscal al servicio online - "Administración de Certificados Digitales", - Ir a "Agregar Alias", escribir el alias (nombre relacionado al certificado), - Subir el archivo .CSR presionar "Agregar", - Buscar y descargar el archivo certificado CRT. Con esta interfase no es necesario convertir el certificado en formato pkcs12 ni importarlo al repositorio de Windows **Ejemplo concreto** ~~~bash openssl req -new -key empresa.key -subj "/C=AR/O=Diego Coppari/CN=HistrixAfipWS/serialNumber=CUIT 20272117129" -out empresa.csr ~~~ **Asociación** Para poder usar los servicios web se debe asociar el certificado al webservice y CUIT (empresa) que lo utilizará: - Homologación: solicitando acceso a <webservices@afip.gov.ar> (indicando CUIT y nombre del servicio) - Producción: Ingresar por clave fiscal al servicio online - "Administrador de Relaciones de Clave Fiscal", - "Nueva Relación", - "BUSCAR" para seleccionar el webservice de AFIP, por ej "ws - Facturación Electrónica", - "BUSCAR" para seleccionar el Representante, - seleccionar el nombre del alias del "Computador Fiscal" (ver sección anterior), - "Confirmar". **Renovación** Los certificados tienen fechas de vencimiento, cuando la llamada al webservice nos indique ns1:cms.cert.expired (Certificado expirado) debera subirse el archivo CSR (pedido de certificado) y descargar un nuevo CRT. Los certificados tienen una vigencia de 2 años en producción, y 1 año en homologación. **Pre-requisitos para pasar a Producción (RECE)** Para poder usar Factura Electrónica en Producción (modo definitivo), además de los puntos anteriores, dentro de - Clave Fiscal - Servicio online - "Regimenes de facturación y registración (REAR/RECE/RFI)" - Adherirse al régimen Este tramite debe realizarse con anterioridad, ya que puede demorar varias semanas. **Importante**: en el "Rubro I. C) RECE / RCEL (Factura Electrónica y Factura Electrónica en Linea)" especificar RECE (no RCEL que es para "Comprobantes en linea" y Facturador Plus" no contemplados por los webservices). Dar de alta los nuevos puntos de ventas (uno por cada webservice a utilizar: factura nacional, exportación, bono fiscal, etc.) ### ¿Que es el CAE? El C.A.E. (Código de Autorización Electrónico) es un número (formato similar al C.A.I.) que otorga la AFIP al autorizar la emisión de un comprobante por web service, aplicativo RECE o por el servicio por clave fiscal "Comprobantes en linea" ("facturas electrónicas"). Sin CAE, la factura no tiene validez fiscal. Este código debe informarse en la factura electrónica, consignando también su vencimiento (plazo a ser informado al cliente), código de comprobante, y demás datos de las facturas tradicionales. Incluir el código de barras que representa estos datos es opcional. El CAE es único por facturas A, pero puede ser el mismo para un lote de facturas B consecutivas de el mismo día y menor a $1000 cada una.- (en este último caso, se autorizan las facturas B en una sola operación por el monto total). ### ¿Como consulto la validez de un CAE de un comprobante electrónico? Hay tres opciones: - Consulta interactiva CAE: <http://www.afip.gov.ar/genericos/consultacae/> - Por Clave Fiscal, servicio Verificación de validez de comprobantes emitidos - Por Servicio Web, Para Facturas de Exportación o Bienes de Capital, método GetCmp del webservice WSBFE y WSFEX Adicionalmente, los servicios web WSBFE y WSSEG poseen métodos para que el emisor pueda recuperar los datos de un comprobante individual ya emitido, pero no es posible listar todas las facturas electrónicas realizadas. ## ¿Que es el CAE Anticipado (CAEA)? El régimen de CAE Anticipado (CAEA) consiste en consignar en los comprobantes respaldatorios de las operaciones, el Código de Autorización Electrónico Anticipado "CAEA", en reemplazo del "CAE" Los sujetos comprendidos deben reunir las siguientes condiciones: - "Autoimpresores" comprendidos en el Registro Fiscal de Imprentas, dispuesto por la RG 100 - Incluidos en el régimen de factura electrónica (RG 2485), o nominados (RG 2904) - Dada la magnitud de sus sistemas tengan dificultades con la modalidad de CAE - Emitir un mínimo de 1800 comprobantes por mes La operatoria es similar a la modalidad CAE, con la salvedad que se debe solicitar un único código CAEA para todas las facturas de la quincena, informando posteriormente cada factura emitida de manera individual con el CAEA. Cada quincena se identifica por un período (año mes, ej: "201102") y orden (1: primer quincena, 2: segunda quincena). El CAEA debe solicitarse unos días antes de que comienze la quincena, y los comprobantes deben informarse dentro de los 30 días corridos contados desde el día inmediato siguiente al de finalización de cada período, pudiendo enviarse a partir del día inmediato siguiente al de comienzo de cada período. Si no se han emitido comprobantes con CAEA en dicho período, debe informarse sin movimiento. ### ¿Que es el ID? El ID es el Identificador del requerimiento, un número interno de secuencia controlado por el emisor, que permite identificar de manera única cada operación de autorización (solicitud de CAE). Este dato es de vital importancia para poder recuperar un CAE frente a problemas de comunicación o fallas del hardware/software. Sin el, és imposible recuperar un CAE y se puede llegar a bloquear todo el circuito de facturación electrónica en los servidores de AFIP. Por ello es recomendable que sea un dato propio del sistema de facturación, almacenado en un soporte permanente (base de datos en el disco rígido o similares). En el caso de fallas, los webservices poseen métodos para recuperar el último ID informado. ### ¿Las facturas electrónicas se pueden anular o borrar? **NO**, los comprobantes para los cuales se haya obtenido CAE no pueden ser eliminados o borrados, el proceso de autorización es definitivo y permanente. A su vez, no puede haber saltos en la numeración (las autorizaciones deben ser correlativas) y las fechas deben ser siempre crecientes. En el caso de rechazos (si la AFIP no otorga CAE) el comprobante no es válido, por lo que no debe ser anulado pero si debe ser descartado. Si por algún motivo se pierde la correlatividad con los datos informados a la AFIP, los webservices poseen métodos para recuperar el último número de comprobante emitido. ### ¿Como se deben almacenar los duplicados electrónicos? Mas allá del sistema de gestión o base de datos, los emisores de facturas electronicas por web service (RECE) deben cumplir con la normativa "Almacenamiento de duplicados de comprobantes electrónicos" (RG 1361/02). Para ello podemos adaptar un conversor de formato ya desarrollado que genera los archivos para el aplicativo SIAP SIRED. ### Datos Especiales **FEParamGetTiposTributos()** ~~~php [TributoTipo] => Array ( [0] => stdClass Object ( [Id] => 1 [Desc] => Impuestos nacionales [FchDesde] => 20100917 [FchHasta] => NULL ) [1] => stdClass Object ( [Id] => 2 [Desc] => Impuestos provinciales [FchDesde] => 20100917 [FchHasta] => NULL ) [2] => stdClass Object ( [Id] => 3 [Desc] => Impuestos municipales [FchDesde] => 20100917 [FchHasta] => NULL ) [3] => stdClass Object ( [Id] => 4 [Desc] => Impuestos Internos [FchDesde] => 20100917 [FchHasta] => NULL ) [4] => stdClass Object ( [Id] => 99 [Desc] => Otro [FchDesde] => 20100917 [FchHasta] => NULL ) ) ~~~ **FEParamGetTiposIva** ~~~php [IvaTipo] => Array ( [0] => stdClass Object ( [Id] => 3 [Desc] => 0% [FchDesde] => 20090220 [FchHasta] => NULL ) [1] => stdClass Object ( [Id] => 4 [Desc] => 10.5% [FchDesde] => 20090220 [FchHasta] => NULL ) [2] => stdClass Object ( [Id] => 5 [Desc] => 21% [FchDesde] => 20090220 [FchHasta] => NULL ) [3] => stdClass Object ( [Id] => 6 [Desc] => 27% [FchDesde] => 20090220 [FchHasta] => NULL ) [4] => stdClass Object ( [Id] => 8 [Desc] => 5% [FchDesde] => 20141020 [FchHasta] => NULL ) [5] => stdClass Object ( [Id] => 9 [Desc] => 2.5% [FchDesde] => 20141020 [FchHasta] => NULL ) ) ~~~ ============================================================================== # Referencia del schema ============================================================================== ------------------------------------------------------------------------------ ## Cómo usar esta referencia URL: https://docs.histrix.com.ar/es/schema/ Todos los tags y atributos que acepta un XML de Histrix, generados desde el XSD. ------------------------------------------------------------------------------ Esta sección documenta **todo lo que puede contener un XML de Histrix**: los 120 elementos que declara el schema y sus 452 atributos, cada uno con su descripción. La fuente es [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd), el schema que valida los XML del sistema. Sus descripciones están verificadas contra el código del motor, así que dicen lo que el motor hace y no lo que el nombre del atributo sugiere. Cuando las dos cosas difieren —y difieren seguido— la descripción lo aclara. ## Por dónde empezar | Página | Para qué sirve | | --- | --- | | [Índice de atributos](https://docs.histrix.com.ar/es/schema/atributos/) | Buscar un atributo por nombre. Es la entrada más rápida cuando aparece uno desconocido en un XML. | | [Índice de elementos](https://docs.histrix.com.ar/es/schema/elementos/) | Ver qué va dentro de qué, con el árbol completo de anidamiento. | | [Tipos de valor](https://docs.histrix.com.ar/es/schema/tipos/) | Qué valores acepta un atributo y, en los booleanos, **qué hace exactamente `="false"`**. | ### Referencia por área | Página | Contenido | | --- | --- | | [Raíz: <histrix>](https://docs.histrix.com.ar/es/schema/raiz/) | El tag raíz de todo XML de Histrix, sus 168 atributos y los elementos de nivel superior. | | [Consulta: <form>, <table> y SQL](https://docs.histrix.com.ar/es/schema/consulta/) | Los elementos que definen de dónde salen los datos: tabla base, joins, agrupamiento, orden y filtros. | | [Campos: <field> y <fieldGroup>](https://docs.histrix.com.ar/es/schema/campos/) | El elemento con más atributos del schema: definición, presentación y comportamiento de cada campo. | | [Helpers y combos](https://docs.histrix.com.ar/es/schema/helpers/) | Ayudas, combos, enlaces a otros XML y contenedores embebidos. | | [Interacción: cálculos, condiciones y validaciones](https://docs.histrix.com.ar/es/schema/interaccion/) | JavaScript en el campo, evaluación condicional server-side, propagación de valores y validaciones. | | [Grabación: movimientos e importación](https://docs.histrix.com.ar/es/schema/grabacion/) | Cómo se persisten los datos de un formulario: movimientos, procesos encadenados e importación desde otros XML. | | [Gráficos y widgets](https://docs.histrix.com.ar/es/schema/visualizaciones/) | Series de gráficos, etiquetas de eje y widgets del escritorio. | | [Grupos de atributos compartidos](https://docs.histrix.com.ar/es/schema/grupos/) | Los conjuntos de atributos que varios elementos comparten: identificación, UI, PDF, imagen y calendario. | ## Cómo leer estas páginas Cada elemento tiene una ficha con cuatro datos antes del detalle: - **Va dentro de** — los elementos que lo pueden contener. - **Contenido** — si acepta texto y de qué tipo, y qué elementos hijos admite. - **Veces que puede aparecer** — la cardinalidad: `1` es obligatorio y único, `0..1` opcional, `0..n` cualquier cantidad. - **Atributos** — cuántos declara y cuántos hereda de un grupo compartido. Un mismo nombre puede tener más de una forma. `<field>` acepta 217 atributos dentro de `<table>` y cinco dentro de `<orden>`, porque son cosas distintas: en el primer caso define una columna de la pantalla, en el segundo sólo nombra por qué campo ordenar. Esas formas secundarias se documentan como `<field> en <orden>`, en la página del elemento que las contiene. ## Validar un XML contra el schema La validación encuentra atributos mal escritos, valores fuera de la lista permitida y elementos en el lugar equivocado, antes de abrir la pantalla: ```bash xmllint --noout --schema histrix-1.0.xsd mi_programa.xml ``` Para todo un módulo o toda una base: ```bash find modules/ database/ -name '*.xml' -print0 \ | xargs -0 -P8 -n40 xmllint --noout --schema histrix-1.0.xsd ``` Declarando el schema en el propio XML, el editor valida y autocompleta mientras se escribe: ```xml <?xml version="1.0" encoding="UTF-8"?> <histrix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://docs.histrix.com.ar/histrix-1.0.xsd" tipo="consulta"> ``` :::caution La codificación se declara `encoding="UTF-8"`, con guión. La variante `UTF8` la aceptan el motor y `xmllint`, pero rompe las herramientas escritas en Python: saltean el archivo y reportan el error en la primera vocal acentuada, no en la declaración. ::: ## Cuatro reglas del motor que explican el resto Sin estas cuatro reglas, buena parte de las advertencias de estas páginas no se entiende. **1. El parser copia los atributos en crudo.** No hay lista blanca ni normalización: todos los atributos de `<histrix>` pasan al contenedor de la pantalla, y todos los de `<field>` al campo. Los de `<label>` y `<fieldGroup>` **también van al campo** —no hay un objeto aparte para ellos—, así que un atributo escrito en el `<label>` termina en el mismo lugar que si se hubiera escrito en el `<field>`, y los de un `<fieldGroup>` se copian a cada campo que contiene. **2. La lectura de un atributo distingue mayúsculas de minúsculas.** `PDFancho` y `pdfancho` son dos atributos distintos, no dos formas del mismo. Cuando el schema declara las dos grafías es porque el motor lee cada una en un lugar diferente, no porque sean intercambiables. **3. Que un atributo llegue al objeto no significa que algo lo lea.** El schema declara los que el motor efectivamente usa: los que se copiaban sin que nadie los leyera se fueron sacando a medida que se verificaron contra el código. **4. `<table>` y `<form>` sólo transfieren un conjunto acotado de atributos.** Lo que se escriba ahí fuera de ese conjunto se descarta en silencio. Por eso un mismo atributo puede tener efecto en `<histrix>` y ninguno en `<table>`. ## Desactivar un atributo Se borra. Un atributo que no hace falta no va en el archivo: el schema sólo admite los que están en esta referencia, así que cualquier otro nombre —incluido el mismo con algún prefijo— falla la validación. ------------------------------------------------------------------------------ ## Índice de atributos URL: https://docs.histrix.com.ar/es/schema/atributos/ Todos los atributos del schema en orden alfabético, con su tipo, dónde valen y qué hacen. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Los 452 atributos del schema en orden alfabético. **Dónde** dice en qué elemento están declarados, o en qué grupo compartido; el enlace lleva a la descripción completa. Un mismo nombre puede aparecer varias veces: cuando eso pasa, cada declaración tiene su propia descripción, porque el atributo hace cosas distintas según dónde se escriba. :::tip Si un atributo que aparece en un XML no está en esta lista, el motor no lo lee. Validar el archivo lo detecta de una: `xmllint --noout --schema histrix-1.0.xsd archivo.xml` ::: | Atributo | Tipo | Dónde | Qué hace | | --- | --- | --- | --- | | `accesskey` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Tecla de acceso rápido del botón de importación (una letra). | | `accordion` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Convierte las **solapas internas** (los campos con contenedor embebido) en un acordeón de paneles colapsables. | | `activa` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Marca el campo como **controlador**: habilita o deshabilita en el browser los campos que lo referencian con `activador`. | | `activador` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | `id` del campo del que depende **este** campo: nace deshabilitado mientras el campo referenciado no valga exactamente `1` (con `"S"`, `"true"` o `"X"` queda deshabilitado). | | `actxml` | [`ActXmlValor`](https://docs.histrix.com.ar/es/schema/tipos/#actxmlvalor) | [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) | Default "true": envía request al server por cada cambio. "false": el JS se resuelve en el browser sin request (preferido para aritmética pura). | | `acumula` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | La celda **muestra el acumulado** de la columna hasta esa fila en lugar del valor propio de la fila (y recibe la clase de celda sumada). | | `ajax` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | El combo no viene con las opciones adentro del HTML: se piden al servidor a medida que el usuario escribe. | | `ajusteDebe` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | `id` del campo donde se imputa el ajuste al Debe. El valor se transfiere al contenedor, pero **hoy ningún consumidor del motor lo lee**: escribirlo no cambia nada. | | `ajusteHaber` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | `id` del campo donde se imputa el ajuste al Haber. El valor se transfiere al contenedor, pero **hoy ningún consumidor del motor lo lee**: escribirlo no cambia nada. | | `aletras` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | Imprime el importe en letras. **El motor lo evalúa por presencia y con comparación laxa: `aletras="false"` ENCIENDE la conversión igual** — cualquier valor no vacío la prende. | | `alias` | texto | [`<field> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery), [`<campo> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-subquery) | Alias SQL del campo. | | `alias` | texto | [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup) | Alias SQL de la columna. **No es sólo un nombre alternativo: reemplaza el prefijo de tabla con el que se califica la columna**, pisando la tabla base del `<histrix>` y lo que diga `tabla`. | | `align` | texto | [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) | — | | `ancho` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Misma cosa que `width`: se leen juntos y gana el que esté presente. | | `Arbol` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Rol del campo en una estructura jerárquica. Valores reales: "padre" (columna que apunta al nodo padre), "hijo" (clave del nodo, la que se usa para recursionar), y para árboles nested-set "left" \|… | | `arbol` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Grafía recomendada** para el rol del campo en el árbol (mismos valores que `Arbol`). | | `as` | texto | [`<tabla> en <join>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla-en-join), [`<table> en <join>`](https://docs.histrix.com.ar/es/schema/consulta/#table-en-join) | Alias SQL de la tabla en el JOIN. | | `as` | texto | [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) | Alias SQL obligatorio del subquery. | | `as` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | Alias SQL de la tabla base. Necesario cuando la misma tabla entra más de una vez en la consulta (por ejemplo un JOIN a sí misma) para poder calificar las columnas sin ambigüedad. | | `attach` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Al generar el PDF adjunta un archivo por cada renglón, usando **el valor del campo** como nombre. | | `auto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters), [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) | Con `auto="true"` los filtros se aplican solos al cambiar cualquier valor, sin botón "filtrar". | | `autocompletar` | [`ModoAutocompletado`](https://docs.histrix.com.ar/es/schema/tipos/#modoautocompletado) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Alias español de `autocomplete`, y **no es el atributo HTML del input**: es el modo del helper de ayuda del campo. | | `autocomplete` | [`ModoAutocompletado`](https://docs.histrix.com.ar/es/schema/tipos/#modoautocompletado) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es el `autocomplete` de HTML: es el modo del helper de ayuda del campo.** Valores con efecto: `"true"` (autocompletar mientras se tipea) y `"full"` (autocompletar más botón que abre el popup de… | | `autoinc` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Marca el campo como autoincremental (PK con `AUTO_INCREMENT`): el motor lo excluye del INSERT y después recupera el id generado para rellenarlo. | | `autoing` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Se emite como atributo del input para que el ingreso de la fila avance solo al completar el campo (grids `ing`). | | `automail` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Con "true" y junto a `autoprint`, además de imprimir dispara el envío del PDF por mail. | | `autominchars` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Cantidad mínima de caracteres antes de disparar el autocompletado (default 3). | | `autoprint` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Imprime automáticamente al abrir el documento (sin click del usuario). | | `autoupdate` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Refresco automático periódico de la vista. **No es un booleano sino el intervalo**: el valor se compara contra cero, así que `autoupdate="true"` no hace nada — hay que poner un número. | | `avatar` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En campos de archivo o imagen: nombre de otro campo de la misma consulta que actúa de reemplazo cuando el archivo no existe. | | `average` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) | Agrega la línea de promedio de la serie sobre el gráfico. No confundirlo con el `average` de un `<field>`, que es otra cosa (promedia una columna de la grilla). | | `before` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Selector de **fase** del movimiento: con `"true"` ese contenedor se graba en la pasada previa; con cualquier otro valor, o ausente, en la pasada posterior. | | `bloqueafila` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Con el literal "true", las filas en las que **el valor de este campo sea `1` o `true`** quedan bloqueadas: se marcan como no editables y se pintan grisadas. | | `borra` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Permiso de borrado a nivel ABM. **No es alias de `deleteRow`** y la precedencia es asimétrica: en el permiso de borrado que expone el schema de la API gana `deleteRow`, y `borra="false"` **no** apaga… | | `boton` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Texto del botón que abre la importación, en lugar del texto por defecto. | | `bottomMargin` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es un margen sino la coordenada Y del pie del PDF** (mm): positiva se mide desde el borde superior, negativa desde el borde inferior. | | `break` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es un salto de línea, es un corte de control.** `break="true"` convierte el campo en campo de corte del listado: cada vez que su valor cambia entre filas se cierra el grupo y se emiten los… | | `btnconfirma` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Texto custom del botón de confirmación. | | `buildTree` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Construye una estructura jerárquica a partir de los resultados. | | `buttonStyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | CSS inline aplicado al botón generado por el campo (usado en `tipo="button"` o helpers tipo link). | | `cabecera` | texto | [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) | Nombre del XML cabecera (padre lógico del movimiento). | | `calculateButton` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Agrega un botón de recálculo a la barra de acciones. **No es un booleano**: el valor es la etiqueta visible del botón. | | `calendarAllDay` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Marca el campo que indica si el evento ocupa todo el día. Como el resto de los `calendar*` de campo, se evalúa por presencia: cualquier valor lo marca. | | `calendarAspectRatio` | `número` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Relación ancho/alto con la que se dibuja el calendario. | | `calendarCheck` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | En vistas de calendario marca el campo que se muestra como casilla de tildar al lado de cada evento en el panel de listado. | | `calendarColor` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo cuyo valor pinta el fondo del evento. **Se evalúa por presencia**: cualquier valor lo activa, incluido `"false"`; para desactivarlo hay que omitir el atributo. | | `calendarDefaultView` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Vista inicial del calendario; omitido equivale a `"month"`. El valor se inyecta **crudo** en la configuración del calendario, así que un nombre inexistente no lo rechaza el schema pero rompe el… | | `calendarDescription` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo cuyo valor es la descripción del evento. **Se evalúa por presencia**, como todo el grupo `calendar*`: `"false"` lo marca igual; para que no participe hay que omitir el atributo. | | `calendarEditable` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que habilita la edición del evento desde el calendario. | | `calendarEndDate` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que aporta la fecha de fin del evento. **Se evalúa por presencia**: `"false"` lo marca igual; para que no participe hay que omitir el atributo. | | `calendarEndTime` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que aporta la hora de fin del evento. **Escribe la misma propiedad que `calendarStopTime`**: son dos nombres para el mismo dato, y declarar uno en un campo y el otro en otro deja la… | | `calendarId` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que aporta el identificador del evento. **Se evalúa por presencia**, como todo el grupo `calendar*`: `calendarId="false"` lo marca igual; para que no participe hay que omitir el… | | `calendarOptions` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Opciones extra del calendario: el contenido se concatena **como JavaScript crudo** dentro de su configuración. | | `calendarRecurringRule` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que lleva la regla de repetición del evento. **Se evalúa por presencia**: `"false"` lo marca igual y el `default="false"` declarado no equivale a omitirlo. | | `calendarStartDate` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que aporta la fecha de inicio del evento. **Se evalúa por presencia**: `"false"` lo marca igual; para que no participe hay que omitir el atributo. | | `calendarStartTime` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que aporta la hora de inicio del evento. **Se evalúa por presencia**, como todo el grupo `calendar*`: `"false"` lo marca igual; para que no participe hay que omitir el atributo. | | `calendarStopDate` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | En vistas de calendario marca el campo que tiene la fecha de fin del evento, y con eso el evento se dibuja abarcando hasta esa fecha; al arrastrar o estirar el evento, la fecha nueva se escribe en… | | `calendarStopTime` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo como hora de fin del evento. **Es el mismo dato que `calendarEndTime`** (los dos escriben la misma propiedad): declarar uno en un campo y el otro en otro deja la hora de fin indefinida. | | `calendarSubject` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo cuyo valor es el título del evento en el calendario. | | `calendarSum` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | No produce ningún efecto. El motor lo reconoce y se acuerda de qué campo quedó marcado, pero después nadie usa ese dato: no totaliza nada ni muestra nada en el calendario. | | `calendarTasks` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Fuente de tareas del panel lateral del calendario. **No puede ser un campo**: el valor se usa crudo como **nombre de un XML** (se busca en el directorio del XML actual) y sus filas son las tareas. | | `calendarTextColor` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup) | Marca el campo que aporta el color del texto del evento. Se evalúa por presencia, igual que `calendarColor`: cualquier valor lo activa, incluido `"false"`; para desactivarlo hay que omitir el… | | `campo` | texto | [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam), [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param) | `id` del campo del XML hijo al que se le aplica el pre-filtro. | | `campodestino` | texto | [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) | `id` del campo destino donde se asigna el resultado del JS. | | `cancel` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra el botón que **limpia el formulario** (no cancela ninguna transacción). | | `cellMaxLength` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Corta el texto de la celda a N caracteres en la grilla (el valor completo se sigue guardando y viaja al formulario). | | `checkDupOnUpdate` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No valida duplicados**: el valor se pasa a un parámetro que nadie consume. | | `checkType` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | **No valida tipos, y viene activo.** Sólo aplica a campos `tipo="date"`: prendido — que es lo que pasa cuando el atributo falta — convierte un valor de 8 dígitos `ddmmyyyy` en fecha. | | `clase` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Igual que `class` (es la propiedad interna a la que `class` se mapea; escribir cualquiera de las dos llega al mismo lugar). | | `clase` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Clase CSS del **input** del campo, y de la celda en columnas editables. | | `clasefila` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | El **valor del campo en cada fila** se agrega como clase CSS del `<tr>`; si hay varios campos marcados, se concatenan. | | `Class` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Clase CSS del `<td>` de la celda en la grilla. **No es alias de `clase`**, que va a la `class` del input: cambiar uno por el otro no produce el mismo HTML. | | `class` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Clase CSS del contenedor de la vista. **No es "adicional": reemplaza** la clase por defecto (`consulta`, `ParentingClass`, el `defaultClass` de la vista…) — todos los lectores la toman como… | | `clear` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Con clear="false" el campo conserva el valor que tiene cuando se limpia el formulario (después de grabar, o al pedir uno nuevo), en vez de volver a vacío o a su valor por defecto. | | `close` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Si "true", el popup se cierra automáticamente tras procesar. | | `close` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Sólo en `type="link"`: nombre de la función JavaScript que se ejecuta cuando el popup se cierra. | | `color` | texto | [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) | Color del texto del pie. | | `color` | texto | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | Color CSS de la columna: pinta la línea superior del encabezado y el borde izquierdo de sus tarjetas. | | `color` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No dibuja un swatch**: toma el valor del campo como color y lo aplica de `background-color` al input y a la celda, con el texto encima. | | `cols` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Atributo HTML `cols` para `<textarea>`. | | `colspan` | `entero` | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `colspan` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Atributo HTML `colspan` del `<td>` contenedor. | | `colstyle` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `colstyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | CSS inline de la columna en grillas. `colstyle="display:none;"` oculta la columna pero conserva el campo en el form vertical de entrada y **sí lo exporta a XLS/CSV**: es la forma de tener una columna… | | `conBusqueda` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es una búsqueda global y no tiene relación con los campos `fullSearch`.** Es la barra Buscar/Limpiar de una **ficha**: marca el formulario como formulario de búsqueda, lo arranca vacío y hace… | | `CondExp` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | Condición de grabación por expresión, **complemento de `idCampoCond`** y no un reemplazo: el motor toma el último valor grabado del campo nombrado en `idCampoCond` (o `0` si viene vacío), le pega… | | `condition` | texto | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | Condición PHP que decide si el cierraproceso se ejecuta. | | `confirma` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **Es la leyenda del botón de procesar, no un mensaje de confirmación**: el valor se usa como texto del botón (el mismo lugar que `btnconfirma`). | | `confirmDir` | texto | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | Directorio de `confirmXml`. **Obligatorio cuando hay `confirmXml`**: sin él el path no resuelve en varios contextos y el popup abre con "file not found" (la misma regla que el `dir` de los includes). | | `confirmTitle` | texto | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | Título del modal de confirmación. Si no está, se usa el `label` de la columna. | | `confirmXml` | texto | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | XML que hay que completar para entrar a esta columna. **Sin este atributo el movimiento se graba directo**, como en el resto de las columnas. | | `copia` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **La dirección es la inversa de lo que sugiere el nombre.** El valor es el `id` del campo **destino**: al cambiar este campo, su valor se copia **hacia** el campo nombrado. | | `copies` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Cantidad de copias del PDF a generar (multiplicar la salida). | | `createButtonLabel` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Texto del botón "Nuevo" del listado. | | `cuit` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Se copia tal cual al campo del formulario, pero nada en la interfaz lo mira: no valida ni formatea nada, así que escribirlo no cambia el comportamiento. | | `customTotal` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Con el literal "true" la celda de total del pie **no suma la columna**: el número sale de evaluar el `<if>` del campo sobre la fila de totales. | | `dataSource` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre de una clase PHP propia con un método estático `Select()` que recibe el contenedor de datos y provee las filas (o `Clase::MetodoCustom`, para varias vistas en una misma clase), bypaseando la… | | `dataTable_info` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Controla el pie informativo de la grilla ("Mostrando X de Y registros"). | | `dataTablePaginate` | [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Enciende el paginador de la grilla: aparecen los botones de página y el selector de cuántos renglones mostrar (arranca en 10, con opciones 10/25/50/100). | | `dataTableReorder` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Habilita el reordenamiento de filas de la grilla por drag-and-drop ("true"/"false"). | | `dataTableScrollCollapse` | [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Cuando la grilla tiene menos renglones de los que entran en su alto, el marco con scroll se encoge hasta la altura real de los datos en vez de dejar el hueco vacío abajo. | | `dataTableScroller` | [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Cambia la paginación por scroll virtual: la grilla mantiene el alto fijo y va pidiendo y dibujando sólo los renglones que caen en la ventana visible mientras se scrollea, lo que la vuelve usable con… | | `default` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) | Si "true", se aplica sólo como default (no pisa valor existente al editar). | | `defaultPrinter` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Impresora que queda preseleccionada en el combo de impresoras del panel de opciones de impresión del programa. | | `defaultValue` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Escrito con V mayúscula actúa sobre el encabezado de la columna, no sobre el campo: el valor se publica en el encabezado y, en columnas de tipo check que muestran el tilde de "marcar todos"… | | `defaultvalue` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Valor por defecto que se emite al input y que el formulario usa al limpiarse. | | `deleteRow` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Habilita el botón eliminar en cada fila. **No es alias de `borra`**: `deleteRow` es el que decide el permiso de borrado que expone la API, y `borra="false"` no apaga el botón por fila de las grillas. | | `delimitador` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Separador de columnas **efectivo** de la exportación CSV (default ","). | | `delimiter` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **Sólo precarga** el separador en el input del diálogo de exportación; no es el separador efectivo del CSV. | | `desactiva` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Inverso de `activa` sobre el campo **controlador**: en vez de habilitar, deshabilita en el browser los campos que lo referencian con `activador`. | | `deshabilitado` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Campo de sólo lectura. Los campos con `<expression>` lo asumen automáticamente; `deshabilitado="false"` los fuerza editables — y en los checkbox es además el escape para poder editarlos cuando la… | | `destino` | texto | [`<paring> en <cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring-en-cierraproceso) | `id` del campo destino en el XML cierraproceso. | | `destino` | texto | [`<field> en <actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-actualiza) | Si el destino es un combo/grid: nombre del subcampo dentro del helper (matchea con `<detalle>`). | | `destino` | texto | [`<campo> en <actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#campo-en-actualiza) | Nombre del subcampo dentro del helper destino. | | `destino` | texto | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) | `id` del campo del contenedor embebido sobre el que se arma la condición. | | `detailDir` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Directorio donde vive el XML de detalle: el que se abre al expandir una fila, y también el detalle de las vistas de calendario y de gantt. | | `detailText` | texto | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Texto que ocupa el panel de detalle **mientras no se eligió ninguna fila** (el "Seleccione una fila…"). | | `detalle` | texto | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Nombre del XML hijo que se abre como popup al hacer click en una fila (vista de detalle). | | `dir` | texto | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Directorio del XML referenciado por `detalle` (relativo al módulo). | | `dir` | texto | [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) | Directorio donde buscar el XML de `cabecera`. **Sólo afecta a `cabecera`**: las `<relacion>` hijas resuelven su propio XML por su cuenta y no heredan este valor. | | `dir` | texto | [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) | Directorio del XML relacionado. | | `dir` | texto | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | Directorio del XML cierraproceso. | | `dir` | texto | [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) | Directorio del XML helper. | | `dir` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Directorio del XML del helper. **Se concatena al directorio del XML que lo declara**, no lo reemplaza: `dir="ing"` desde un XML que vive en `caja/` busca en `caja/ing/`. | | `dir` | texto | [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) | Directorio del XML de valores. | | `dir` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Directorio del XML hijo. | | `dir` | texto | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | Directorio del XML externo. | | `directprint` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre de la impresora configurada a la que se manda, sin pasar por el visor de PDF, el comprobante que el programa imprime automáticamente después de grabar. | | `dirImpresion` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Directorio del XML de impresión (combinado con `xmlImpresion`). | | `dirimpresion` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Alias lowercase de `dirImpresion`. | | `disabled` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Otra grafía de `deshabilitado`: **no se emite al HTML**, el motor la normaliza al mismo flag interno. | | `display` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Mueve el campo de lugar en la pantalla de consulta.** Los únicos valores que el motor reconoce son `toolbar` y `filter` (los busca como substring): el campo se renderiza en la barra de herramientas… | | `displayFilterButton` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Con false esconde el renglón de la barra de filtros donde viven el botón Buscar, el de limpiar filtros y los botones de toolbar declarados para la barra de filtros. | | `download` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Es un booleano, no un nombre de archivo.** Con `download="true"` la celda de un campo `file` muestra un botón de descarga en lugar de la miniatura. | | `drag` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Permite mover tarjetas entre columnas. **Apagado por defecto.** Sólo se concede si además el XML permite escribir: `sololectura` y `modifica="false"` lo desactivan, y el servidor lo vuelve a evaluar… | | `dsn` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre del DSN alternativo (definido en `custom_dsn` de config.xml). | | `editable` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **Está invertido respecto del nombre**: `editable="true"` convierte la grilla en editable inline y por eso **oculta el botón Modificar**. | | `editable` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Permite escribir un valor que no esté en la lista: el combo deja de ser cerrado y acepta texto libre además de las opciones. | | `editable` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Es opt-**in** de la edición inline: `editable="true"` hace editable esta columna dentro de la grilla. | | `editableSelect` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En combos: permite tipear texto libre además de elegir de la lista. | | `email` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Al grabar, además de disparar la impresión declarada en `impresion`, abre el envío de ese PDF por mail. | | `email` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Dirección de email asociada al campo (para botón "enviar mail"). | | `empty` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Opción vacía del combo (`type="combo"`/`"comboex"`). No es booleano: si el valor no es `''`, `'true'` ni `'false'`, se usa como **texto del placeholder** de esa opción, así que `empty="Seleccione…"`… | | `enablecopy` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No agrega ningún botón de copiar.** En campos con `<expression>` o deshabilitados evita el atributo HTML `disabled` y deja el input en `readonly`, que es lo que permite seleccionar el texto con el… | | `encode` | texto | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | Algoritmo con el que se encripta el valor, y **sólo se consulta cuando el `<tipo>` lleva `Type="password"`**. | | `encode` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Simbología del código de barras cuando el campo dibuja un código: el valor se pasa tal cual al generador. | | `errorMessage` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Mensaje que aparece si la validación del campo falla. | | `esClave` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Marca el campo como clave primaria: entra al `WHERE` y al UPDATE, y su input queda obligatorio. | | `esclave` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Forma legacy **en minúscula**, y no es lo mismo que `esClave`: funciona como su **negador**. | | `eval` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) | — | | `eval` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) | Si "true", el contenido se evalúa como expresión PHP en el server. | | `event` | texto | [`<jsfunction>`](https://docs.histrix.com.ar/es/schema/interaccion/#jsfunction) | Nombre del evento DOM (sin "on": "focus", "blur", "change"...). | | `evento` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es un evento JS**: se resuelve server-side y filtra **qué evento de grabación dispara este movimiento**. | | `exp` | texto | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | Expresión PHP a evaluar. Los `<field>` declarados son referenciables por nombre sin comillas. | | `expand` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Arranca el helper desplegado en lugar de cerrado. | | `export` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra el botón exportar (XLS/CSV). "false" lo oculta. | | `export` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Sólo puede excluir, nunca incluir.** `export="false"` saca el campo del XLS/CSV; `export="true"` no agrega nada, porque el ocultamiento se chequea después y por separado: un campo con… | | `exportasuma` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No interviene en la exportación.** Aplica a los XMLs que devuelven datos al contenedor referente (`llenoReferente` / `<importar>`): con "true" se devuelve **una sola fila** que acumula los campos… | | `exportFormat` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Formato con el que sale el botón exportar: "Xls" (default) \| "Csv" \| "Xml". | | `exportHeader` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Controla si la primera fila del XLS exportado lleva los nombres de columnas. | | `extension` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Extensión que se propone en el diálogo de exportación (default "csv"). | | `field` | texto | [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam), [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param) | Alias inglés de `campo`. | | `fielddestino` | texto | [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) | Alias inglés de `campodestino`. | | `filter` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Controla el **buscador general de la grilla** (el input de búsqueda que trae la tabla), **no la barra de `<filters>`**. | | `filterStyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | CSS inline del campo en la barra de filtros. Útil para angostar (`width:0em;`) o resaltar un filtro, pero **no queda contenido ahí**: al armar la barra el motor pisa con este valor el `style` del… | | `fixed` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion), [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | Hace la condición **inmune al botón de limpiar filtros**: cuando el usuario resetea la barra de filtros, las condiciones normales se van y ésta queda. | | `fontSize` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Tamaño de fuente de la **planilla exportada** (default 10). No toca el HTML del formulario ni el PDF. | | `forceCellValue` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Escape de `suma`: en un campo con `suma="true"` que se pasa como `<parameter>` a otro XML, lo que viaja es el total acumulado de la columna; con `forceCellValue="true"` viaja el valor de la fila. | | `forceReload` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Después de grabar o de borrar, vuelve a consultar la base (y a recargar la tabla temporal) en lugar de reusar los datos que ya tenía en memoria. | | `forceSize` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Levanta el recorte automático del ancho del input en el formulario de carga de una grilla de ingreso. | | `forceUpdate` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Si "true", incluye el campo en el UPDATE aunque su valor no haya cambiado respecto al original. | | `form` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No suprime el render del formulario.** Sólo tiene efecto real en las vistas de árbol (`arbol`/`treeView`); en `tipo="consulta"` lo único que hace `form="false"` es desactivar el llenado del… | | `Formstyle` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `Formstyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | CSS inline del campo. **No es "el del input" en contraposición al `<td>` de `style`**: los dos se aplican al input y al `<td>`, y se concatenan sin `;` de separación. | | `formStyle` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `formStyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Tercera grafía del CSS inline del campo. **No reemplaza a `Formstyle`**: si están los dos, los valores se suman, y sin `;` de separación entre ellos. | | `fullSearch` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Cambia cómo se arma la condición **de este campo**: parte el texto buscado por espacios o comas y ANDea un `like '%palabra%'` por cada token sobre la misma columna, así que "juan perez" matchea… | | `ganttItemsPerPage` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Cuántas filas muestra cada página del diagrama de Gantt; el resto se llega con los botones de página. | | `ganttMaxScale` | [`GanttEscala`](https://docs.histrix.com.ar/es/schema/tipos/#ganttescala) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Escala más gruesa a la que el usuario puede alejar el zoom del diagrama de Gantt. | | `ganttMinScale` | [`GanttEscala`](https://docs.histrix.com.ar/es/schema/tipos/#ganttescala) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Escala más fina a la que el usuario puede acercar el zoom del diagrama de Gantt. | | `ganttScale` | [`GanttEscala`](https://docs.histrix.com.ar/es/schema/tipos/#ganttescala) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Escala de tiempo con la que abre el diagrama de Gantt: horas, días, semanas o meses. | | `getStyle` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `getStyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Nombre de un campo del row cuyo valor se usa como CSS inline del campo actual (ej. `getStyle="color_celda"` aplica `style` desde la columna `color_celda` de la fila). | | `graba` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Opt-**in** del contenedor de **cabecera** para que la cabecera haga su propio INSERT: sólo `"true"` hace algo. | | `grabaFinal` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **Va en el `<histrix>` del XML de movimiento/relación**, no en un `<table>`. | | `grabafinal` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Alias lowercase de `grabaFinal`. | | `grafico` | texto | [`ImagenGrup`](https://docs.histrix.com.ar/es/schema/grupos/#imagengrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | — | | `grid` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es un modo de render: es la geometría del contenedor.** El valor son dos medidas separadas por coma — `"ancho,alto"` — que se vuelcan al CSS del contenedor; en `tipo="card"` es lo que dimensiona… | | `grupo` | texto | [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) | Grupo lógico del join (usado para identificar conjuntos de joins relacionados). | | `grupo` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No agrupa radios ni arma fieldsets.** Tiene dos usos: en un campo de la tabla, cuando el campo aporta una condición **activa el `<join grupo="…">` del mismo nombre** (JOIN condicional: la tabla se… | | `habilita` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **La dirección es la inversa de lo que sugiere el nombre.** El valor es el `id` del campo **controlador**, y el que se deshabilita es **este** campo: con `habilita="pagado"`, este campo queda… | | `hasDetail` | texto | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Campo cuyo valor determina si la fila tiene detalle disponible (icono "+"). | | `hasFieldset` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Envuelve los campos en un `<fieldset>` HTML (agrupado visual). | | `having` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression), [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) | — | | `having` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es una condición: es un flag de ruteo.** Decide si la `<condicion>` de este campo va al `HAVING` o al `WHERE`. | | `height` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Alto del popup del helper. Lo leen `type="link"`, `type="media"` y `type="import"`; en combo/external/parameter no tiene efecto. | | `height` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Alto del popup. | | `height` | texto | [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) | Alto del widget (CSS). Ojo: en la práctica el alto lo termina fijando `style`. | | `height` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alto del control. Usado en tipo `file` (image upload), `qr` (alto del código QR, default 240) y campos similares. | | `helpButton` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Al revés de lo que sugiere el nombre: oculta el input del campo** y convierte el botón del helper de ayuda en un botón etiquetado que abre el popup. | | `hidden` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Renderiza el input como `type="hidden"`: **el valor se sigue posteando** y la celda y la etiqueta se dibujan igual, así que no sirve para ocultar el campo. | | `hideForm` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | En `tipo="ing"`, deja la grilla sola y esconde el formulario de entrada detrás de un botón. | | `htmlspecialchars` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Con "true" escapa el valor del campo al mostrarlo, de modo que el HTML que venga en el dato se vea como texto en vez de interpretarse. | | `htmlTemplate` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Template HTML alternativo para fichas con layout custom. | | `icon` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Icono mostrado en el botón del helper, con los nombres del set de iconos de la UI (ej. `ui-icon-wrench`). | | `icon` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Nombre de la clase de icono a mostrar en el botón (ej. `ui-icon-search`, `ui-icon-plus`). | | `icon` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Sólo en `<tipo>button</tipo>`: clase de icono del botón (ej. `ui-icon-search`). | | `id` | texto | [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event), [`<events> en <events>`](https://docs.histrix.com.ar/es/schema/raiz/#events-en-events), [`<field> en <validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-validations), [`<value> en <values>`](https://docs.histrix.com.ar/es/schema/campos/#value-en-values) | — | | `id` | texto | [`<tabla> en <join>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla-en-join), [`<table> en <join>`](https://docs.histrix.com.ar/es/schema/consulta/#table-en-join) | Nombre de la tabla joineada. | | `id` | texto | [`<field> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery), [`<campo> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-subquery) | Nombre de la columna en la tabla del JOIN. | | `id` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | Nombre de la tabla SQL base. | | `id` | texto | [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) | Nombre del XML relacionado. | | `id` | texto | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | Nombre del XML cierraproceso (sin .xml). | | `id` | texto | [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) | ID del XML helper al que se le pasan los parámetros. | | `id` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | **No es un id de debug: es funcional y sensible.** En `type="parameter"` es la clave con la que el parámetro se guarda en `HTXOPTIONS`, así que renombrarlo pierde el valor ya configurado (y si no hay… | | `id` | texto | [`<field> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden), [`<campo> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-orden) | `id` del campo por el que ordenar. | | `id` | texto | [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) | Nombre de la propiedad a setear en el contenedor del helper. | | `id` | texto | [`<attribute>`](https://docs.histrix.com.ar/es/schema/campos/#attribute) | Nombre del atributo HTML (ej. "data-tooltip", "aria-label"). | | `id` | texto | [`<field> en <importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar) | `id` del campo del padre que recibe. | | `id` | texto | [`<field> en <actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-actualiza), [`<campo> en <actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#campo-en-actualiza) | `id` del campo o helper destino. | | `id` | texto | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | Identificador del grupo (sirve para targeting CSS y referencias). | | `id` | texto | [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) | Identificador del gráfico. | | `id` | texto | [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) | Nombre de la tabla temporal. | | `id` | texto | [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) | Identificador del widget. | | `id` | texto | [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup) | Identificador del campo. Coincide con el nombre de columna en la tabla SQL (salvo `local="true"` o `<expression>`). | | `id_cab` | texto | [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup) | Referencia al `id` del campo cabecera del que depende este detalle. | | `id_cont` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Contenedor interno asociado. | | `id_int` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Campo interno asociado. | | `id_padre` | texto | [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup) | En INSERT de grid embebido: toma el valor del campo del formulario padre. | | `id_temp` | texto | [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup) | En INSERT: toma el valor del campo temporal (de la tabla base del grid) en lugar del campo de la fila actual. | | `idCampoCant` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | `id` de un campo cuyo valor es la **cantidad de veces que se repite la grabación** de la fila: con `idCampoCant="cant"` y `cant=3`, el movimiento inserta tres registros iguales en lugar de uno. | | `idCampoCond` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | `id` del campo que habilita la grabación de la fila: si su valor es falsy, el INSERT/UPDATE de esa fila no se ejecuta. | | `idName` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Hace que la columna destino se resuelva en tiempo de ejecución: en vez de grabar en la columna que corresponde al id del campo, graba en la columna cuyo nombre sale del valor de otro campo del… | | `ignoreOption` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No ignora la opción vacía del combo: hace lo contrario de descartar el valor.** Cuando el valor guardado no figura entre las opciones, con `"true"` se muestra ese valor crudo en la celda en vez de… | | `imageHeight` | `entero` | [`ImagenGrup`](https://docs.histrix.com.ar/es/schema/grupos/#imagengrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | — | | `imageScale` | `número` | [`ImagenGrup`](https://docs.histrix.com.ar/es/schema/grupos/#imagengrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | — | | `imageStyle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En campos de archivo que se muestran como miniatura, se inyecta tal cual como estilo inline de la imagen (por ejemplo para redondear una foto de perfil). | | `imageWidth` | `entero` | [`ImagenGrup`](https://docs.histrix.com.ar/es/schema/grupos/#imagengrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Ancho de la imagen del campo, en píxeles. **El `default="100"` vale sólo donde el atributo se respeta**: campos `<tipo>grafico</tipo>` y dos ramas de la impresión. | | `import` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Es un opt-out booleano, no un modo de importación.** El único valor con efecto es `import="false"`, que deja el campo afuera de la importación desde archivo; cualquier otro valor, y la ausencia, lo… | | `importFile` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Activa el botón para importar datos desde archivo XLS/CSV. **El motor sólo mira si el atributo está presente, no su valor**: `importFile="false"` muestra el botón igual. | | `importTempTable` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre de la tabla temporal de importación que alimenta el grid. | | `impresion` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Alias lowercase de `xmlImpresion`: XML de impresión asociado. | | `imprime` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra el botón imprimir/exportar a PDF. "false" lo oculta. | | `imprimetanda` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Agrega un botón que imprime **en tanda**: un solo PDF con una copia por cada fila de la tabla temporal, respetando el campo de condición de cada fila y el `pageBreak`. | | `inline` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Muestra el detalle expandido bajo la fila en lugar de en un popup. | | `innerForms` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Modo de render de formularios internos en ABMs. Ej. "list" muestra los hijos como lista en lugar de tabs. | | `inputType` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Fuerza el control con el que se dibuja el campo sin cambiarle el tipo de dato. | | `inserta` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Permite el alta de registros en ABM/consulta. Default true. Equivalente al botón "+". | | `insertaABM` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es independiente de `inserta`**: los dos escriben el mismo interruptor de alta y, si están los dos, **gana `inserta`** porque se aplica después. | | `invalid` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Motivo que se muestra cuando el campo no valida. Trabaja junto a `validar="true"`: si el valor del campo (o su último valor grabado) no es `true` ni `1`, el botón de procesar queda deshabilitado y… | | `kanban` | [`KanbanRol`](https://docs.histrix.com.ar/es/schema/tipos/#kanbanrol) | [`KanbanGrup`](https://docs.histrix.com.ar/es/schema/grupos/#kanbangrup) | Papel del campo dentro de la tarjeta: `title`, `body`, `tag`, `person`, `age`, `color` o `action`. | | `label` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | Etiqueta legible de la tabla. **En la práctica no se ve en ninguna parte**: el motor la toma como título inicial del contenedor y unas líneas después la pisa siempre con el título declarado en el… | | `label` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Texto del botón que abre el popup, **sólo en `type="import"`**. | | `label` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Texto del botón que abre el popup. | | `label` | texto | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | Etiqueta del grupo (header del fieldset). | | `label` | texto | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | Título de la columna. Si no está, se muestra el `value`. | | `labelColspan` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Atributo HTML `colspan` de la celda de la **etiqueta**, no la del input — para esa está `colspan`. | | `labelStyle` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | CSS de la etiqueta. El motor lo lee junto con `Formstyle` al armar el `<label>` y su celda, y también lo aplica a la etiqueta de un checkbox. | | `labelStyle` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | CSS inline de la etiqueta del campo, incluida la del checkbox. | | `lastId` | texto | [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup) | Trae a este campo el id autogenerado por otro movimiento. **El valor no es un booleano ni "el INSERT anterior": es el nombre del XML de movimiento** del que se toma el id, así que hay que nombrarlo… | | `lazyLoad` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En una columna que muestra una grilla embebida, evita ejecutar la consulta interna mientras se dibuja el listado: deja un lugar reservado y recién trae el contenido cuando ese renglón se acerca a la… | | `lblsize` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Ancho de la celda de la etiqueta en el PDF** de una ficha, no tamaño de fuente, y sin ningún efecto en HTML. | | `limit` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | `LIMIT` aplicado a la query principal. Tres cosas que no son obvias: `limit="0"` significa **sin límite** (está excluido explícitamente); la forma `"offset,count"` es válida y es la que usa la… | | `limit` | `entero` | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | Límite de trabajo en curso (WIP). Es **sólo visual**: el contador pasa a mostrar `usadas/limit` y se pinta en alerta al pasarse, pero no impide mover tarjetas a la columna. | | `linkdes` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Texto descriptivo del link cuando el campo es renderizado como enlace. | | `linkdir` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Directorio del XML al que apunta `linkint`. Si falta, se usa el directorio del XML del contenedor. | | `linkHeight` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alto de la ventana que abre el `linkint` de este campo. Mismo mecanismo y misma excepción que `linkWidth`: con `linktab="true"` no se aplica. | | `linkint` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Nombre del XML interno al que linkea el campo (genera link clickable). | | `linkmodal` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Si "true", el link del campo abre en modal en vez de nueva pestaña. | | `linktab` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Si "true", el link del campo abre en nueva tab del navegador. | | `linkWidth` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Ancho de la ventana que abre el `linkint` de este campo. Hay dos formas de setear lo mismo y al motor le da igual cuál se use: `linkWidth` en el `<field>`, o `width` dentro de un `<helper… | | `liveSum` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Le agrega una marca a la celda de esa columna, pero hoy esa marca no la usa nadie: no hay estilo asociado ni cálculo que la lea, así que el atributo no produce ningún efecto visible. | | `llenoReferente` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Si "true", al recibir un parámetro referente precarga sus datos en el form. | | `llenoreferente` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Es la misma propiedad que `llenoReferente`: escribir cualquiera de las dos grafías llega al mismo lugar. | | `llenoTemporal` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre de la tabla temporal usada para alimentar grillas de importación. | | `llenotemporal` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Alias lowercase de `llenoTemporal`. | | `local` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Campo local: existe en el formulario pero NO se mapea a una columna SQL. | | `log` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Registra las operaciones en HTXLOG (auditoría). **Requiere el literal "true"**: todos los lectores lo comparan exacto, y **no** existe la variante de pasarle el nombre de un logger custom (el puente… | | `log` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Decide si los cambios de **este campo** entran a la auditoría. | | `logic` | texto | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion), [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | Cómo se encadena esta condición con las anteriores del mismo campo. | | `logReference` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Lista CSV de campos cuyo valor se incluye como observación en el log de auditoría. | | `mandatory` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Vuelve obligatoria la condición de ese campo: si el campo no llegó a tener ninguna condición armada (por ejemplo, un filtro que el usuario dejó vacío), la consulta no se ejecuta —ni la de datos ni la… | | `mapPolyline` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Polyline que conecta los puntos del mapa. **Viene dibujada aunque no se declare el atributo**: el único valor con efecto es `"false"`, que la saca. | | `mask` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Máscara de entrada (formato `9999-9999-X`, etc.). | | `max` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Valor numérico máximo permitido. | | `maxlength` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Atributo HTML `maxlength` del input. | | `maxshowresult` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Tope de filas que la consulta acepta mostrar. **No pagina ni recorta**: si el total supera el número **no se renderiza ninguna fila** y el cuerpo de la tabla se reemplaza por una línea con "N… | | `maxsize` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Es alias de `maxlength`, no del `size` del input**: limita la cantidad de caracteres que se pueden tipear. | | `min` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Valor numérico mínimo permitido. | | `modal` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Si "true", el popup es modal (bloquea la interacción con el padre hasta cerrarlo). | | `modifica` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra el botón de modificar registros. Con la variante legacy `modifica="no"` pasa lo mismo que con `inserta="no"`: algunas ramas del ABM la toleran, pero la vista que dibuja el botón lee el… | | `modificador` | texto | [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador), [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) | Modificador del operador: transforma el valor antes de comparar (ej. `UPPER`, `LOWER`, `DATE`). | | `modificar` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Tercera grafía viva junto a `modifica`: con "true" habilita el botón de modificar. | | `modpos` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | Modificador de posición. El valor que el motor entiende es `nobr`: con `modpos="nobr"` la etiqueta o el campo no pasa al renglón siguiente — vale en el ABM, en los `ing` con `subtipo="vertical"`, en… | | `modpos` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Modificador de posición de la celda. `"nobr"` evita el salto de línea (mantiene la siguiente celda en el mismo renglón en forms verticales de grids `ing`). | | `muestra` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En un `<field>` dentro de `<tabla_ex>` (la forma legacy del combo): con "true" el texto visible de la opción incluye también la clave, no sólo la descripción. | | `multiple` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Habilita la selección múltiple del combo (`type="combo"`/`"comboex"`). | | `multiple` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Permite múltiples valores (en selects o file inputs). | | `multipleSelection` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Agrega la columna de checkboxes para seleccionar varias filas; al procesar, el motor junta las marcadas y las manda juntas. | | `multipleSelection` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Agrega la columna de checkboxes para seleccionar varias filas. | | `name` | texto | [`<parameter> en <values>`](https://docs.histrix.com.ar/es/schema/campos/#parameter-en-values) | — | | `nodeTitle` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En un `tipo="arbol"`, usa este campo como título de cada nodo **en el gráfico** del árbol, no en el árbol HTML. | | `noEmpty` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Con `"true"` **oculta la columna entera** cuando ninguna fila del resultado tiene valor en ese campo — no suprime filas — y omite su total al pie si la suma da 0. | | `noForm` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | No dibuja la barra de botones de la toolbar y, en la vista mobile, tampoco la columna de borrar fila de los grids `ing`. | | `noform` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Alias lowercase de `noForm`. | | `noLimit` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Saca el tope de un solo registro que el motor le agrega por defecto a sus UPDATE y DELETE, de manera que la operación alcanza a todos los renglones que cumplan la condición. | | `norepeat` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En grillas y en el PDF, no vuelve a imprimir el valor de la columna en filas consecutivas que lo repiten: sólo se ve en el primer renglón de cada bloque. | | `noselect` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es UI, es SQL.** `noselect="true"` saca el campo de la lista del `SELECT` pero conserva sus `<condicion>` en el `WHERE`/`HAVING`: es la forma de filtrar por una columna sin traerla, el caso… | | `noshow` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery), [`<campo> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-subquery) | Alias inglés de `oculto`. | | `noshow` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Oculta el campo en la UI: el input se renderiza con `display:none` y **queda en el DOM**, así que conserva su valor, se postea y las `<validation>` (client-side) lo siguen encontrando. | | `noTabs` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Con "true" el contenedor se renderiza **inline en lugar de como pestaña**. | | `notificationDir` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Subdirectorio del XML vinculado al aviso de notificación; si no se pone, se usa el directorio del programa que generó el aviso. | | `notificationLink` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre del XML al que apunta el botón de lupa ("Ver") del aviso de notificación: al tocarlo se abre el historial de auditoría de ese evento para ese programa. | | `notificationText` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Reemplaza el texto del aviso que reciben los usuarios suscriptos al programa cuando alguien da de alta, modifica, borra o procesa. | | `noupdate` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es el inverso de `update` y no toca el SQL** (para dejar un campo afuera del UPDATE va `update="false"`). | | `noZero` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No valida nada: es presentación.** Con `noZero="true"` el valor 0 se muestra como celda vacía en lugar de "0". | | `numberPrecision` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Cantidad de decimales para campos numéricos. | | `obj` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Nombre del XML referenciado como objeto embebido (grid hijo o ficha link). | | `objdir` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Directorio del XML referenciado por `obj`. Con barra inicial (`/carpeta`) **reemplaza** el subdirectorio vigente; sin barra se concatena a él. | | `oculto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery), [`<campo> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-subquery) | Si "true", oculta el campo en pantalla. | | `oculto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es alias de `noshow`: son dos mecanismos distintos.** Con `oculto="true"` el campo no se renderiza — no llega al HTML —, se excluye del UPDATE y sale del export. | | `offsetX` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Desplazamiento horizontal **en mm** que se suma siempre a la posición de la celda. | | `offsetY` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Desplazamiento vertical **en mm** que se suma siempre a la posición de la celda. | | `onClearForm` | [`OnClearFormValor`](https://docs.histrix.com.ar/es/schema/tipos/#onclearformvalor) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Con onClearForm="uniqid", cada vez que se limpia el formulario el campo se rellena con un identificador único nuevo (13 caracteres hexadecimales) en lugar de quedar vacío. | | `onDuplicateKey` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Activa `ON DUPLICATE KEY UPDATE` en el INSERT. | | `onRefresh` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Comportamiento al refrescar la fila/form. Ej: "focus" devuelve el foco al campo después del refresco. | | `open` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En campos `<tipo>file</tipo>`: con "true" la celda muestra un botón para **abrir** el archivo en vez de la miniatura. | | `operador` | [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion), [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | Operador SQL: =, !=, <, >, <=, >=, like, in, between, is null, etc. Opcional: si se omite, el motor asume `=` (normaliza el operador vacío), por lo que omitirlo y escribir `operador="="` son… | | `operador` | [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | Alias español de `operator`. | | `operador` | [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) | [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam), [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param) | Operador SQL del pre-filtro. | | `operador` | texto | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) | Operador **SQL** de la condición (`=`, `!=`, `like`, `in`…), no un operador de asignación: `+=` y `-=` no significan nada acá. | | `operator` | [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | Operador SQL aplicado al pasar el valor. Default "=". | | `oplogico` | texto | [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador), [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) | Operador lógico para concatenar con el siguiente filtro: "and" (default) \| "or". | | `oplogico` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Operador lógico con el que la condición de este campo se une a la **anterior**: `"and"` (default) \| `"or"`. | | `optional` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) | — | | `ordenaTemporal` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order), [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) | Aplica el orden sobre la tabla temporal del grid en lugar de sobre la consulta original. | | `orderName` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Nombre de columna o expresión que se usa en el `ORDER BY` en lugar del campo. | | `orderType` | [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) | [`<field> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden) | Dirección de orden (inglés). Coexiste con `tipoOrden`; el motor lee ambos. | | `orderType` | [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) | [`<campo> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-orden) | Dirección de orden (inglés). | | `orderType` | [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Dirección de orden por defecto del campo: `"ASC"` \| `"DESC"`. | | `orphanLabel` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Título de la columna de huérfanos. Default "Sin clasificar". | | `pageBreak` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es lo mismo que `PDFpageBreak`**: `pageBreak` sólo existe en la impresión en tanda (`imprimetanda`) y decide si cada **fila** arranca en una página nueva. | | `pageNumber` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | `id` del campo que aporta el número de página del PDF. **No es un booleano ni un número**: el motor toma el valor de ese campo (o el último valor, si hay varias filas) como número de la primera… | | `paginar` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Activa paginación con N filas por página. | | `pareto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) | Dibuja el gráfico como Pareto: las columnas ordenadas de mayor a menor más la curva de porcentaje acumulado. | | `path` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No tiene nada que ver con la resolución de XMLs** (de eso se ocupan `dir=` y el orden de búsqueda del motor, que no miran `path`): es el **directorio de subida y lectura** de los campos `file`… | | `path` | texto | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Directorio de lectura/subida de los archivos de este campo (`file`, `files`, `dir`), que se concatena al del contenedor. | | `PDFaddPage` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Si "true", fuerza salto de página antes de renderizar este elemento. | | `PDFalign` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alineación de la celda: `L` (izquierda), `R` (derecha), `C` (centro), `J` (justificada). | | `PDFancho` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | Ancho de la celda del **valor** en la ficha impresa. Es el único lugar donde esta grafía funciona: el renombre que la habilita se aplica **sólo** al tag `<label>`. | | `pdfancho` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | Ancho de la celda del valor en la ficha impresa. Misma propiedad que `PDFancho` acá y que el `<pdfancho>` del campo — ver la doc de `pdfancho` en `UiFlags`. | | `pdfancho` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Ancho de la celda del **valor** en el layout vertical del PDF de una ficha. | | `PDFbackgroundColor` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Color de fondo de la celda. **Hex de 6 dígitos y sin `#`** (`RRGGBB`): si el valor no mide exactamente 6 caracteres se resuelve como blanco y sin ningún aviso, así que `#RRGGBB` (7 caracteres) no… | | `PDFbold` | [`PdfFontStyle`](https://docs.histrix.com.ar/es/schema/tipos/#pdffontstyle) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Negrita. No es un booleano: selecciona a qué parte de la celda aplica (ver `PdfFontStyle`). | | `PDFborder` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Borde de la celda. **`PDFborder="true"` no dibuja ningún borde**: el valor viaja crudo al generador de PDF, que entiende `1` (recuadro completo) o las letras **en mayúscula** `L`, `T`, `R`, `B` —… | | `PDFbox` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Envuelve el contenido en un box. Útil para destacar zonas. | | `PDFcardBottomMargin` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | En PDFs tipo etiqueta/tarjeta: **pese al nombre se usa como offset superior** del contenido de la tarjeta y como separación entre filas de tarjetas (mm). | | `PDFcellHeight` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alto mínimo de fila en número de líneas. Aplicarlo en una columna uniformiza el alto de toda la fila (alto = mayor de las columnas × 1,3 × tamaño de fuente). | | `PDFcolor` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Color del texto de la celda. Mismo formato que `PDFbackgroundColor`: **hex de 6 dígitos y sin `#`**. | | `PDFcolWidth` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Ancho de **columna** de la tabla PDF. Número SIN unidad (ej. "20"): agregar "px" rompe el layout. | | `PDFconpie` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Renderiza el pie de página del PDF (toma el contenido del `<pie>` del XML). | | `PDFfill` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No fija ningún color.** Su único efecto es la *presencia*: declararlo con cualquier valor **suprime el gris claro por defecto** (240,240,240) y la celda queda con el color que hubiera quedado… | | `pdffill` | `entero` | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Nivel de gris del fondo de la celda, 0 (negro) a 255 (blanco). | | `PDFfont` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Fuente del PDF (helvetica, times, courier...). | | `PDFfontSize` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Tamaño de fuente global del PDF (en puntos). Es la única grafía que se lee a nivel `<histrix>`; a nivel `<field>`/`<label>` la grafía viva es `PDFfontsize` (con `s` minúscula), que es otro atributo. | | `PDFfontsize` | `entero` | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Segunda grafía aceptada para el tamaño de fuente del campo, **con `s` minúscula**: el motor toma `PDFsize` y, si no está, ésta. | | `PDFfooter` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Indica que el campo es parte del footer del PDF. | | `PDFheader` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Indica que el campo/label es parte del header del PDF (se repite en cada página). | | `PDFheaderBorder` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Recuadro redondeado de la **cabecera del documento** (logo, título, fecha) más el separador de la fecha. | | `PDFheaderMargin` | `número` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Distancia en milímetros, medida desde el borde superior de la hoja, a la que vuelve el contenido cada vez que la impresión PDF abre una hoja nueva por corte de página. | | `PDFheaderTotals` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Si "true", repite la fila de totales en el header de cada página del PDF. | | `PDFheigthRel` | `número` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Divisor del interlineado de las celdas del PDF: cuanto más alto, más comprimidas quedan las filas. | | `PDFimg` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En la impresión PDF de fichas, tarjetas y etiquetas hace que el contenido del campo se dibuje como imagen dentro de la celda en lugar de imprimirse como texto (el texto de la celda pasa a ser la… | | `PDFitalic` | [`PdfFontStyle`](https://docs.histrix.com.ar/es/schema/tipos/#pdffontstyle) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Itálica. Mismo mecanismo que `PDFbold`: no es un booleano, elige a qué parte de la celda aplica (ver `PdfFontStyle`). | | `pdflineas` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Recuadro de las celdas de una grilla **embebida** en un campo (`helper type="object"`). | | `PDFlineColor` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Color de las líneas/recuadros del PDF. **No es hexadecimal**: son los tres componentes RGB en decimal separados por coma, y el default es `220,220,220`. | | `PDFlineHeight` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alto de celda **absoluto en mm**, no un multiplicador: pisa el alto calculado. | | `PDFlines` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **Ya vienen prendidas: el atributo sirve sólo para apagarlas con "false".** Y no son líneas separadoras entre filas: es el recuadro de cada celda (un rectángulo por columna), y en la vista de… | | `PDFnoborder` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Suprime el borde de la celda de la **etiqueta** al imprimir ficha o etiqueta, y de paso apaga su relleno. | | `PDFnolabel` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Omite el label del campo en el PDF — útil en etiquetas térmicas y planillas compactas. | | `PDForientacion` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es un alias equivalente de `PDForientation`.** La generación del PDF lee `PDForientation`; `PDForientacion` sólo preselecciona el valor en el selector de impresión de la UI, así que por sí solo… | | `PDForientation` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Orientación del PDF: "P" (Portrait, default) \| "L" (Landscape — rota contenido 90°). | | `PDFpageBreak` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Permite/desactiva el salto de página automático del PDF; "false" lo desactiva. | | `PDFpageBreak` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Controla el salto de página automático. "false" lo desactiva. | | `PDFpageSize` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Tamaño de página PDF: "A4", "Letter", "Legal", o personalizado. | | `PDFpageSizeX` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Ancho custom de página PDF (mm). **Sólo se aplica si además está declarado `PDFpageSizeY`**: solo, no hace nada. | | `PDFpageSizeY` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Alto custom de página PDF (mm). **Va siempre en pareja con `PDFpageSizeX`**: si falta el otro, el tamaño custom no se aplica. | | `PDFprintPageTotals` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Totales por página del PDF. **Trampa:** vienen activos por defecto y la comparación es estricta contra un booleano, así que **declarar el atributo con cualquier valor —incluido "true"— los… | | `PDFrestorePosition` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Restaura la posición X/Y del cursor antes de renderizar (para componer cajas superpuestas). | | `PDFrotate` | `entero` | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Rota el texto N grados. | | `PDFscaleX` | `entero` | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Escala horizontal del texto (en %). | | `PDFsincabecera` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Omite la cabecera del PDF (la primera página arranca sin header global). | | `PDFsize` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Tamaño de fuente en puntos de esta celda. Es **la** grafía de nivel campo; el motor acepta además `PDFfontsize` (con `s` minúscula) como segunda forma. | | `PDFtitle` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Texto que se imprime como renglón de título, con fondo, arriba de la grilla embebida de un campo cuando el comprobante sale en PDF; además se reserva un renglón extra de alto para ese título. | | `pdftitulo` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Fila de títulos de una grilla **embebida** en un campo. Viene activa: sólo `pdftitulo="false"` la saca. | | `PDFtopMargin` | `entero` | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es un margen en mm**: suma N **líneas** al alto de la fila, y sólo en campos que embeben otro contenedor (una grilla o una ficha hija). | | `PDFwidth` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Ancho de la grilla embebida de un campo, y en la vista card el ancho de la tarjeta. | | `pintado` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Hace que, cada vez que Histrix llena el formulario con los datos de un renglón de la grilla, el contenido de ese campo quede seleccionado (pintado), de modo que la primera tecla que toque el usuario… | | `postGrabacion` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | En `<histrix tipo="nosql">`: ejecuta el PHP DESPUÉS de la grabación, no antes. | | `postGridData` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **Va en el `<histrix>` del XML embebido**: con "true" ese contenedor interno postea sus datos junto con el formulario padre, como si fuera una grilla. | | `posX` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alias camelCase de `posx`. | | `posx` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Posición X de la celda, en mm desde el borde izquierdo de la página. | | `posY` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Alias camelCase de `posy`. | | `posy` | texto | [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup), [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Posición Y de la celda en mm, con **tres formas mágicas** además de la coordenada absoluta: `posy="-1"` la ubica debajo de todo lo ya impreso; `posy="0"` o el atributo ausente la deja en la misma… | | `preFetch` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | En ficha/fichaing, precarga los datos existentes del registro. | | `prefijo` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Texto antepuesto al valor del campo en render. También aceptado como elemento `<prefijo>`. | | `preloadData` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Si "true", ejecuta la query y precarga los datos al renderizar; "false" en grillas embebidas con `lazyLoad` difiere la carga. | | `preventDuplication` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No bloquea el doble submit del botón grabar.** Lo que evita es que se duplique la solapa de un grid `ing` embebido en un `fichaing`, y para lograrlo descarta los scripts de recarga de los… | | `preventLoop` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Va en el campo **destino** de un `<jseval>`: cuando el cálculo le escribe un valor nuevo no se dispara su evento `change`, así que los `<jseval>` que dependen de él no se recalculan y la cascada se… | | `print` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | `print="false"` excluye el campo del PDF. **`print="true"` no puede forzar lo contrario**: las exclusiones son independientes y se suman, así que un campo con `noshow`, `oculto` o… | | `printCondition` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre de un campo del propio programa que decide si se hace o no la impresión automática posterior a la grabación. | | `printer` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Dirige la impresión a una impresora concreta. **El valor no es el nombre del dispositivo sino un `idPrinter` de la tabla `HTXPRINTERS`**: el motor busca esa fila y de ahí saca `printerClass`… | | `printViewer` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre del conversor con el que se previsualiza la impresión en el navegador, para formatos que no son PDF. | | `privacy` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Activa la **seguridad por registro**: al insertar se guarda quién es el dueño de la fila, y después las consultas de esa pantalla filtran por eso. | | `procesa` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es alias de `process` ni de `procesar`**: son tres atributos con lectores disjuntos. | | `procesar` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es una variante de `procesa` ni hace lo mismo.** `procesar="true"` dispara la grabación de los contenedores internos y marca el contenedor como procesable en el schema que expone la API. | | `process` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Habilita el procesamiento de `<movimientos>`/relaciones al grabar. | | `processFirst` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | En `<cierraproceso>`: si "true", ejecuta los movimientos del HIJO antes que los del padre. | | `public` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Si "true", expone el valor del campo del form padre al grid hijo embebido (vía sesión PHP). | | `redirect` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | El motor lo publica tal cual en el esquema que devuelve la API del programa, junto con el título, el tipo, los permisos y la paginación, para que un cliente propio decida a dónde llevar al usuario. | | `reemplazo` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) | **Está invertido**: con el atributo ausente la condición ya **reemplaza** la que tuviera ese campo. | | `refresh` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Sólo actúa en campos de un contenedor embebido, y sólo con el literal "true": al cambiar el valor recarga la cabecera del formulario y dispara la grabación del contenedor de origen. | | `reloadForm` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Sólo aplica a los **detalles inline** (el XML embebido, distinto del padre) y sólo cuando `llenoReferente` no está en `"true"`. | | `rememberValue` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Conserva el valor del campo entre sesiones del mismo usuario (persistencia en perfil). | | `repeat` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Son dos atributos distintos con el mismo nombre, según el tag donde se escriba.** Este `attributeGroup` lo comparten `<field>` y `<fieldGroup>`, así que la declaración es una sola pero la semántica… | | `replace` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | En vez de agregar una condición sobre el campo destino, **reemplaza el valor** del campo destino por el que viene del padre. | | `replace` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No reemplaza texto en el valor mostrado.** Es un flag (`replace="true"`) que marca al campo destino de un `<detalle>` como **clave de matching** cuando los datos vuelven de un `<importar>`: es el… | | `replaceInto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Genera `REPLACE INTO` en lugar de `INSERT INTO` (MySQL). | | `reposition` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Reposiciona el popup del helper respecto del control que lo abre. | | `required` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Campo obligatorio. El form no graba si está vacío. **Sin `default` declarado a propósito**: el motor lo evalúa con dos criterios a la vez — hay lecturas que tratan la **ausencia** como obligatorio… | | `required` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Para `type="parameter"`: marca el parámetro como obligatorio en el panel nativo. | | `resume` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | En `<importar>` con popup hijo. **No "mantiene el contexto": en su ámbito hace lo contrario** — antes de volver a subir la celda al padre **descarta el SQL que esa celda ya había generado**… | | `resume` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Se acepta por compatibilidad, pero **acá no hace nada**: `readImportTag` no lee este atributo y `Relationship/ImportRelationship` no lo conoce. | | `retorna` | texto | [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) | Lista CSV de campos cuyo valor debe regresar al padre cuando el helper se cierra. | | `retroalimenta` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | **No tiene nada que ver con popups ni con devolverle valores al padre.** Convierte el resultado del `<if>` del campo en un **acumulado fila a fila** (un running total que arranca de nuevo en la fila… | | `retval` | texto | [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) | **Sólo tiene sentido junto a `eval="true"`.** Sin `retval`, el contenido tiene que ser una expresión PHP que devuelva el valor. | | `rowspan` | `entero` | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `rowspan` | `entero` | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Atributo HTML `rowspan` del `<td>` que contiene el campo. | | `rss` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es una URL: es el nombre del elemento del `<item>` que este campo alimenta** cuando el contenedor se exporta como feed RSS. | | `saveRowButton` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra botón "guardar" por fila en grids editables. | | `search` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Si "true", el campo participa de la búsqueda aunque tenga opciones cargadas (se lo consulta al re-aplicar las condiciones de la consulta). | | `seconds` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En campos de hora, incluye los segundos en el formato visible. | | `selectExpand` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Renderiza el combo como listbox de 5 filas visibles (`size="5"` en el `<select>`), **siempre, no al hacer foco**: la lista queda desplegada todo el tiempo y ocupa el alto de 5 opciones. | | `selectModifier` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Texto que se inyecta **entre `SELECT` y la lista de campos**, para forzar el plan del optimizador: típicamente `STRAIGHT_JOIN` o un hint entre comentarios. | | `serverSide` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Activa el modo server-side de la grilla: paginación, búsqueda y orden se resuelven en el servidor vía AJAX en vez de traer todas las filas al navegador. | | `setOriginalValue` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Con el literal "true", al restaurar el campo se vuelve al **valor original del registro** aun cuando `valauto="true"` mandaría a conservar el `<valor>` declarado. | | `showCab` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Muestra arriba del detalle la cabecera de lo consultado (el form en modo lectura). | | `showCantidad` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Imprime al pie del PDF la línea `Registros: N` con la cantidad de filas. | | `showCantidad` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | Muestra la cantidad de renglones de la grilla. Ojo con la grafía: es exactamente `showCantidad` — `showCant` y `showcantidad` no se leen. | | `showcantidad` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Variante en minúsculas de `showCantidad`, que **acá sí funciona**: la búsqueda de atributos del `<histrix>` ignora mayúsculas. | | `showInForm` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Con showInForm="false" el campo desaparece del formulario de carga (el renglón de inputs de la grilla), pero la columna sigue existiendo en la grilla y el campo sigue formando parte de la grabación y… | | `showLink` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Agrega en el ABM un botón que abre la URL de la vista en otra pestaña. | | `showObjTabla` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Muestra dentro de la celda la grilla del contenedor embebido del campo (el que trae `obj`). | | `showOrphans` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra la columna con las tarjetas cuyo estado no coincide con ninguna `<status>` declarada. | | `showProcessButton` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Fuerza el botón de procesar en un contenedor embebido. **Va en el `<histrix>` del XML embebido**, no en el del padre. | | `showValor` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **Nada que ver con combos.** Aplica a campos que embeben otro contenedor (los de `showObjTabla` / helper `type="object"`) y decide si, además de la grilla hija, se muestra el valor propio del campo. | | `sidePanel` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Panel lateral de las vistas `calendar`. **Está al revés**: viene activo por default y la comparación es estricta contra un booleano, así que **cualquier valor explícito lo apaga**, incluido… | | `sincelda` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `sincelda` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Si "true", el campo se renderiza SIN su `<td>` contenedor. Útil para juntar inputs en la misma celda. | | `sinFecha` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Suprime la fecha en la cabecera del PDF. | | `single` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | Con `"true"`, y sólo cuando hay `detalle` + `inline`, agrega la clase CSS `single` a la celda del detalle inline. | | `sinNumero` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Suprime el número de comprobante en la cabecera del PDF. | | `size` | texto | [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) | — | | `size` | `número` | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `size` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es el `size` del input** — ése sale del elemento `<size>`. | | `sololectura` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Si "true", el formulario es de sólo lectura (no permite alta/modificación/baja). | | `sort` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Si "false", desactiva el ordenamiento por esta columna en la grilla. | | `source` | texto | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | `id` del campo origen (en el XML padre). | | `sql` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression), [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) | — | | `sqlClausule` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Texto que se inserta tal cual inmediatamente después del SELECT y antes de la lista de campos; el uso típico es meter DISTINCT. | | `sqlhardcoded` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No afecta la consulta sino la grabación**: el INSERT se arma con los valores crudos y sin lista de columnas, se deshabilitan los prepared statements y cambia el contexto en que se resuelve el… | | `sqlKillable` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Hoy no produce ningún efecto: el motor tiene la lectura del atributo, pero el bloque que la usaba está desactivado, así que declararlo o no genera exactamente el mismo SQL. | | `statusField` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Sólo para `tipo="kanban"`, donde es **obligatorio**: nombra el campo cuyo valor decide en qué columna cae cada tarjeta. | | `style` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | CSS inline del contenedor. | | `style` | texto | [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie), [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | — | | `style` | texto | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | CSS inline que se emite como atributo `style` de la `<table>` HTML de la grilla, tanto en la vista web como en la mobile. | | `style` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | CSS inline del **botón** del helper de `type="link"`/`"media"`, no del contenedor del campo: se concatena después de los `style`, `colstyle` e `inputstyle` del propio campo, así que por venir último… | | `style` | texto | [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) | CSS inline del div del widget. **Es lo único que efectivamente le da alto**: sin `style` el widget se dimensiona por su contenido, y un widget que carga por AJAX arranca en cero. | | `style` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | CSS inline del campo. **No separa el `<td>` del input**: `style`, `Formstyle` y `formStyle` terminan los tres aplicados al input **y** al `<td>`, y **se concatenan sin `;` de separación** —… | | `styleTable` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Estilo CSS inline que se aplica a la tabla HTML de la grilla. | | `subtipo` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Subtipo del modo. Ej. `tipo="ing" subtipo="vertical"` renderiza el form de entrada como columna en lugar de fila. | | `suma` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Totaliza la columna al pie en grillas, consultas y PDF. **Efecto lateral**: si el campo se pasa como `<parameter>` a otro XML, lo que viaja es el total acumulado y no el valor de la fila; para mandar… | | `svg` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En campos de archivo cambia la forma de insertar la imagen en la grilla o el formulario: la marca como contenido SVG y la pide sin el parámetro de ancho, así que sale en su tamaño natural en lugar de… | | `swap` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Agrega una columna angosta a la izquierda de la grilla con una manija para arrastrar renglones y cambiarles el orden; al soltar, el cambio se graba solo, sin apretar Grabar. | | `tabindex` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Tabindex base del formulario para navegación por teclado. | | `tabla` | texto | [`<field> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery), [`<campo> en <subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-subquery) | Tabla a la que pertenece el campo (cuando ambiguo). | | `tabla` | texto | [`<field> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden), [`<campo> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-orden) | Tabla del campo (cuando ambiguo en JOINs). | | `tabla` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Nombre de la tabla SQL a la que pertenece la columna. Requerido cuando varias tablas del JOIN tienen una columna con el mismo nombre (evita SQL ambiguo). | | `table` | texto | [`<field> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden), [`<campo> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-orden) | Alias inglés de `tabla`. | | `tableBorder` | `entero` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Se pasa tal cual al atributo border de la tabla HTML de la grilla, así que con "1" te dibuja el borde de la tabla y de las celdas. | | `tableClass` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Clases CSS que se **agregan** a la tabla de la grilla. Es el complemento de `class`/`clase`, que en cambio **reemplazan** la clase por defecto de la vista. | | `tableHeight` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Altura fija del contenedor de la tabla (`px`, `vh`, etc.). Va en `<histrix>`, NO en `<table>`. | | `tag` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Tag HTML con el que se dibuja el botón del helper (por defecto `a`). | | `tagGroup` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En un campo `<tipo>tags</tipo>`: nombre del grupo de tags del que sale la lista de sugerencias y donde se guardan los nuevos. | | `target` | texto | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | `id` del campo destino (en el XML hijo/helper). | | `tdWidth` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Ancho de la celda del campo. **No es CSS**: se emite como el atributo HTML `width` del `<td>` y como ancho de la columna en la grilla, así que sólo acepta píxeles o porcentaje — `tdWidth="10em"` lo… | | `template` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre/ruta de un template alternativo de impresión/render para este `<histrix>`. | | `text` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Si "false", suprime el texto del botón del helper y deja sólo el icono. | | `text` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Sólo en `<tipo>button</tipo>`: con "false" el botón muestra únicamente el icono, sin texto. | | `tipo` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Modo del documento. **El valor es el nombre de la vista que lo renderiza**, así que la lista no es cerrada y un valor mal escrito no resuelve ninguna vista. | | `tipo` | [`JoinTipo`](https://docs.histrix.com.ar/es/schema/tipos/#jointipo) | [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) | Tipo de JOIN: left \| right \| inner \| full (case-insensitive). | | `tipoInsert` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Modificador que se inyecta en el `INSERT` generado — y también en los `UPDATE`. | | `tipoOrden` | [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Dirección de orden del campo. `orderType` es el nombre inglés pero **no son alias simétricos**: el motor toma el primero que esté seteado, así que con los dos declarados gana `tipoOrden`. | | `tipoOrden` | [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) | [`<field> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden) | Dirección de orden. Alias inglés: `orderType`. | | `tipoOrden` | [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) | [`<campo> en <orden>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-orden) | Dirección de orden. | | `title` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Título del popup del helper. | | `title` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Título del popup. | | `titleColor` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Sirve únicamente en la vista de árbol cuando se la pide dibujada como imagen. | | `titulo` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Título del popup, pero **no es un alias universal de `title`**: en `type="link"` y `type="media"` el motor lee sólo `title` y acá `titulo` es inerte. | | `titulo` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Alias español de `title`. | | `titulo_div` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Título alternativo del contenedor: reemplaza al título declarado a la hora de nombrar el PDF que se imprime, de titular ese PDF y de describir la operación en la auditoría. | | `tooltip` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Tooltip del campo. Dos caminos, los dos a nivel `<field>`: en `tipo="button"` se pasa al botón (junto con `icon`, `text`, `style` y `name`), y en la grilla sale como el `title` de la celda — o sea… | | `topMargin` | `número` | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Se declara como margen superior de la impresión PDF y el motor lo lee y lo guarda (si no se pone, vale 0), pero ninguna rutina de armado del PDF llega a usarlo: hoy no produce ningún efecto visible. | | `total` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) | Si "true", el JS calcula el total de columna (footer del grid). | | `transaccional` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Envuelve la grabación en una transacción SQL explícita (BEGIN/COMMIT/ROLLBACK). | | `transparent` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Acompaña a color="true" (o a un campo de tipo color): además de pintar el fondo de la celda y del input con el color que trae el valor, pinta el texto de ese mismo color, así que el código… | | `treeGrid` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Muestra el árbol como grilla: una primera columna con los nodos y, a la derecha, una columna por cada campo visible del XML (con su etiqueta y su ancho). | | `treeSum` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | No produce ningún efecto en el motor actual. Era el atributo con el que el árbol viejo acumulaba los importes de los hijos hacia los nodos padre; ese renderizador se reescribió y hoy la suma hacia… | | `Type` | texto | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | El único valor con efecto es `password`: hace que el campo se trate como contraseña y habilita la encriptación del valor (ver `encode`). | | `type` | [`HelperTipo`](https://docs.histrix.com.ar/es/schema/tipos/#helpertipo) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Tipo de helper: combo \| comboex \| link \| external \| parameter \| object \| inline \| tags \| media \| import. | | `type` | texto | [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) | Tipo de esta serie en particular, con los mismos valores que `<tipo>`. | | `unserializeParent` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Al volver de un popup, deserializa los datos del padre desde la sesión (sincroniza estado). | | `update` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | `update="false"` excluye el campo del UPDATE generado. **No lo pone read-only**: el input se sigue editando y lo que se tipea simplemente no se graba; para bloquear la edición va `deshabilitado`. | | `updateTempTable` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | **No es el nombre de una tabla: es un booleano y viene activo.** Con el atributo ausente los datos del grid se copian a las tablas temporales; el único valor con efecto es `"false"`, que desactiva… | | `url` | texto | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | Prefijo de ruta/URL de los archivos del campo (`file`/`files`): se antepone al `path` del contenedor para leer el archivo y para armar el link de descarga. | | `vacio` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Opción vacía del combo. **Sólo se lee en `<tabla_ex>`**, que es la forma legacy del combo y comparte este complexType con `<helper>`. | | `valauto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Si "true", al renderizar nuevo registro el `<valor>` se aplica como valor (vs sólo como default). | | `valauto` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | Aplica `valauto` a todos los campos del grupo. | | `validar` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Activa la validación obligatoria del campo (similar a `required`). | | `validRow` | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Convierte al campo en validador de la fila: si su valor es `0`, la fila se descarta y no graba. | | `valop` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Nada que ver con filtros opcionales, y sólo hace algo con el literal "true": las `<options>` del campo **dejan de aplicarse al armar el input** (el combo sale sin opciones) y el valor de cada fila se… | | `valor` | texto | [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option), [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) | — | | `valorde` | texto | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion), [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | Toma el valor de otro campo del mismo form (`id`). Útil en JOINs y filtros dinámicos. | | `valoropcion` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | Si "true", al grabar usa el VALUE de la opción seleccionada del combo, no el texto visible. | | `value` | texto | [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option), [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion), [`<parameter> en <values>`](https://docs.histrix.com.ar/es/schema/campos/#parameter-en-values) | — | | `value` | texto | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | Valor del campo `statusField` que cae en esta columna. **Obligatorio**, y no puede repetirse entre columnas: las dos cosas se reportan como error de configuración en pantalla. | | `ventint` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Se acepta por compatibilidad, pero **el motor no lo lee**: no hay ninguna lectura de este atributo (verificado en 2026-07). | | `ventint` | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Se acepta por compatibilidad, pero **el motor no lo lee** — igual que en el `<helper>`. | | `viewer` | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En campos `<tipo>file</tipo>`: con "true" la celda muestra un botón que abre el archivo en el **visor embebido** en vez de la miniatura. | | `watermark` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | **No es el placeholder del input: es exclusivo del PDF.** Estampa el texto como marca de agua sobre la imagen de un campo `file` al imprimir; en HTML no hace nada. | | `width` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Ancho del contenedor, pero **sólo lo leen cuatro vistas, y con unidades distintas**: en `arbol`, `map` y `calendar` es un número sin unidad (el porcentaje del split), y en `chart` un entero en px al… | | `width` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | Ancho del popup del helper (px o vw). Lo leen `type="link"`, `type="media"` y `type="import"`; en combo/external/parameter no tiene efecto. | | `width` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Ancho del popup. | | `width` | texto | [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) | Ancho del widget (CSS). | | `xlsFormat` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Formato de celda aplicado al exportar a planilla, en el format string de la planilla (ej. `"#.##0,00"`). | | `xlsHeader` | [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Decide si la exportación a Excel arranca con un bloque de cabecera: logo, nombre de la empresa, CUIT/teléfono/web, línea separadora y el título del reporte con la fecha, y los datos empiezan más… | | `xml` | texto | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | Convierte la etiqueta en un link que abre otro XML: el valor es el XML destino. | | `xml` | texto | [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) | Nombre del XML helper destino. | | `xml` | texto | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex), [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | XML que alimenta el helper. Lo usan todos los tipos que construyen un contenedor (combo, comboex, external, parameter, object, tags, inline, import) y también `type="link"`, donde es el XML que se… | | `xml` | texto | [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) | XML que provee los valores. Si está, se ignoran los `<value>` fijos. | | `xml` | texto | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | Nombre del XML hijo que se abre como popup. | | `xml` | texto | [`<field> en <actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-actualiza), [`<campo> en <actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#campo-en-actualiza) | XML del helper destino (cuando ambiguo). | | `xml` | texto | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | Nombre del XML externo a incluir como fieldGroup (resuelto server-side). | | `xmlCdata` | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | En la exportación a XML, `xmlCdata="false"` emite el valor del campo **crudo**, sin envolverlo en `<![CDATA[…]]>`. | | `xmldir` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Directorio del XML, usado para armar la clave de programa de las notificaciones. | | `xmlField` | texto | [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags) | Nombre del tag XML usado al exportar este campo con `tipo="exportXML"`. | | `xmlImpresion` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre del XML usado para la impresión (separado de la consulta). | | `XMLroot` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre del tag raíz cuando se exporta a XML (`tipo="exportXML"` o similar). | | `XMLrow` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Nombre del tag por fila al exportar a XML. Default: "row". | | `zoom` | texto | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | Zoom inicial (mapa/gráfico). Alias corto de `mapZoom`. | ------------------------------------------------------------------------------ ## Índice de elementos URL: https://docs.histrix.com.ar/es/schema/elementos/ Todos los elementos del schema, con su jerarquía, sus variantes y su descripción. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: El schema declara 120 elementos. Esta página los presenta de dos formas: el árbol de anidamiento, para ver dónde va cada uno, y la tabla completa en orden alfabético. ## Árbol de anidamiento Cada elemento se desarrolla en el nivel más alto donde puede aparecer, y una sola vez: donde vuelve a estar admitido queda como enlace a ese desarrollo. Los tags que el schema declara como equivalentes —`<field>` y `<campo>`, `<table>` y `<tabla>`— aparecen los dos, porque los dos son válidos. - [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) - [`<confirmacion>`](https://docs.histrix.com.ar/es/schema/raiz/#confirmacion) - [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) - [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) - [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) — desarrollado más arriba - [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) - [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) - [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) - [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) - [`<customScript>`](https://docs.histrix.com.ar/es/schema/raiz/#customscript) - [`<eventos>`](https://docs.histrix.com.ar/es/schema/raiz/#eventos) - [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) - [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) - [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) - [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) — desarrollado más arriba - [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) - [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) - [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) — desarrollado más arriba - [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) - [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) - [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) - [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) - [`<obs>`](https://docs.histrix.com.ar/es/schema/raiz/#obs) - [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) - [`<prompt>`](https://docs.histrix.com.ar/es/schema/raiz/#prompt) - [`<scriptSrc>`](https://docs.histrix.com.ar/es/schema/raiz/#scriptsrc) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<txtresultados>`](https://docs.histrix.com.ar/es/schema/raiz/#txtresultados) - [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) - [`<sufijo>`](https://docs.histrix.com.ar/es/schema/raiz/#sufijo) - [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) - [`<iframe>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#iframe) - [`<text>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#text) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<url>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#url) - [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) - [`<confirmacion>`](https://docs.histrix.com.ar/es/schema/raiz/#confirmacion) - [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) - [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) - [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) — desarrollado más arriba - [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) - [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) - [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) - [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) - [`<customScript>`](https://docs.histrix.com.ar/es/schema/raiz/#customscript) - [`<eventos>`](https://docs.histrix.com.ar/es/schema/raiz/#eventos) - [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) - [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) - [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) - [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) — desarrollado más arriba - [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) - [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) - [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) — desarrollado más arriba - [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) - [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) - [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) - [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) - [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) — desarrollado más arriba - [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) - [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) - [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) - [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) - [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) - [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) — desarrollado más arriba - [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) - [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) - [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) - [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) - [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) - [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) - [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) - [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) - [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) - [`<obs>`](https://docs.histrix.com.ar/es/schema/raiz/#obs) - [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) - [`<prompt>`](https://docs.histrix.com.ar/es/schema/raiz/#prompt) - [`<scriptSrc>`](https://docs.histrix.com.ar/es/schema/raiz/#scriptsrc) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) - [`<txtresultados>`](https://docs.histrix.com.ar/es/schema/raiz/#txtresultados) - [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) - [`<sufijo>`](https://docs.histrix.com.ar/es/schema/raiz/#sufijo) - [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) - [`<iframe>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#iframe) - [`<text>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#text) - [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) - [`<url>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#url) - [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) - [`<actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#actualiza) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<attribute>`](https://docs.histrix.com.ar/es/schema/campos/#attribute) - [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) — desarrollado más arriba - [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) — desarrollado más arriba - [`<checklabel>`](https://docs.histrix.com.ar/es/schema/campos/#checklabel) - [`<complete>`](https://docs.histrix.com.ar/es/schema/campos/#complete) - [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion) - [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) - [`<conditionalDisplay>`](https://docs.histrix.com.ar/es/schema/campos/#conditionaldisplay) - [`<detalle>`](https://docs.histrix.com.ar/es/schema/campos/#detalle) - [`<enabledWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#enabledwhen) - [`<eval>`](https://docs.histrix.com.ar/es/schema/interaccion/#eval) - [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) - [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression) - [`<format>`](https://docs.histrix.com.ar/es/schema/campos/#format) - [`<formato>`](https://docs.histrix.com.ar/es/schema/campos/#formato) - [`<habilita>`](https://docs.histrix.com.ar/es/schema/campos/#habilita) - [`<help>`](https://docs.histrix.com.ar/es/schema/campos/#help) - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<htmllabel>`](https://docs.histrix.com.ar/es/schema/campos/#htmllabel) - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) - [`<jsfunction>`](https://docs.histrix.com.ar/es/schema/interaccion/#jsfunction) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<maxsize>`](https://docs.histrix.com.ar/es/schema/campos/#maxsize) - [`<onformchange>`](https://docs.histrix.com.ar/es/schema/campos/#onformchange) - [`<opciones>`](https://docs.histrix.com.ar/es/schema/helpers/#opciones) - [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador) - [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) - [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) - [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) - [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) - [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) - [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) - [`<pdfancho>`](https://docs.histrix.com.ar/es/schema/campos/#pdfancho) - [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) - [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam) - [`<requiredWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#requiredwhen) - [`<setvar>`](https://docs.histrix.com.ar/es/schema/campos/#setvar) - [`<size>`](https://docs.histrix.com.ar/es/schema/campos/#size) - [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) — desarrollado más arriba - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) - [`<visibleWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#visiblewhen) - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) - [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) - [`<actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#actualiza) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<attribute>`](https://docs.histrix.com.ar/es/schema/campos/#attribute) - [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) — desarrollado más arriba - [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) — desarrollado más arriba - [`<checklabel>`](https://docs.histrix.com.ar/es/schema/campos/#checklabel) - [`<complete>`](https://docs.histrix.com.ar/es/schema/campos/#complete) - [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion) - [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) - [`<conditionalDisplay>`](https://docs.histrix.com.ar/es/schema/campos/#conditionaldisplay) - [`<detalle>`](https://docs.histrix.com.ar/es/schema/campos/#detalle) - [`<enabledWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#enabledwhen) - [`<eval>`](https://docs.histrix.com.ar/es/schema/interaccion/#eval) - [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) - [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression) - [`<format>`](https://docs.histrix.com.ar/es/schema/campos/#format) - [`<formato>`](https://docs.histrix.com.ar/es/schema/campos/#formato) - [`<habilita>`](https://docs.histrix.com.ar/es/schema/campos/#habilita) - [`<help>`](https://docs.histrix.com.ar/es/schema/campos/#help) - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) — desarrollado más arriba - [`<htmllabel>`](https://docs.histrix.com.ar/es/schema/campos/#htmllabel) - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) — desarrollado más arriba - [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) - [`<jsfunction>`](https://docs.histrix.com.ar/es/schema/interaccion/#jsfunction) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<maxsize>`](https://docs.histrix.com.ar/es/schema/campos/#maxsize) - [`<message>`](https://docs.histrix.com.ar/es/schema/interaccion/#message) - [`<onformchange>`](https://docs.histrix.com.ar/es/schema/campos/#onformchange) - [`<opciones>`](https://docs.histrix.com.ar/es/schema/helpers/#opciones) - [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador) - [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) - [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) - [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) - [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) - [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) - [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) - [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) - [`<pdfancho>`](https://docs.histrix.com.ar/es/schema/campos/#pdfancho) - [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) - [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam) - [`<requiredWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#requiredwhen) - [`<setvar>`](https://docs.histrix.com.ar/es/schema/campos/#setvar) - [`<size>`](https://docs.histrix.com.ar/es/schema/campos/#size) - [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) — desarrollado más arriba - [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) - [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<visibleWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#visiblewhen) - [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) — desarrollado más arriba - [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) - [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) - [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) - [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) - [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) - [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) - [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) - [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) — desarrollado más arriba - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) — desarrollado más arriba - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) - [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) - [`<false>`](https://docs.histrix.com.ar/es/schema/interaccion/#false) - [`<falso>`](https://docs.histrix.com.ar/es/schema/interaccion/#falso) - [`<true>`](https://docs.histrix.com.ar/es/schema/interaccion/#true) - [`<verdadero>`](https://docs.histrix.com.ar/es/schema/interaccion/#verdadero) - [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) - [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) — desarrollado más arriba - [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param) - [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) - [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam) - [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) - [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) - [`<message>`](https://docs.histrix.com.ar/es/schema/interaccion/#message) ## Todos los elementos | Elemento | Va dentro de | Atributos | Qué es | | --- | --- | --- | --- | | [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) | raíz del documento | 172 | Raíz del documento. Atributo "tipo" identifica el modo del documento (p.ej., "consulta"). | | [`<actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#actualiza) | `<campo>`, `<field>` | — | Al cambiar el campo padre, propaga su valor a otros campos/combos/grilla/helpers. | | [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) | `<grafico>` | — | Alto del gráfico. A diferencia de `<ancho>`, este sí se aplica: es la única forma de que un gráfico no salga con el… | | [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) | `<grafico>` | — | **No hace nada: es código muerto.** Se lee del XML pero nadie lo usa para dimensionar el gráfico, que siempre toma el… | | [`<attribute>`](https://docs.histrix.com.ar/es/schema/campos/#attribute) | `<campo>`, `<field>` | 1 | **No inyecta HTML: hace condicional un atributo de Histrix según el valor de otra columna.** El `id` es el nombre del… | | [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) | `<campo>`, `<field>` | 24 | Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field =… | | [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | `<campo>`, `<field>` | 24 | Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field =… | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | `<ayuda>`, `<ayuda_ex>`, `<fieldGroup>` y 9 más | 218 | Campo de formulario o columna de grid/consulta. Es el bloque fundamental: representa una columna SQL, un campo local… | | [`<campo>`](https://docs.histrix.com.ar/es/schema/interaccion/#campo-en-actualiza) en `<actualiza>` | `<actualiza>` | 3 | Alias español de `<field>` como destino de la actualización. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-orden) en `<orden>` | `<orden>`, `<order>` | 5 | Alias español de `<field>`: el motor lo toma como fallback cuando el bloque de orden no tiene ningún `<field>`. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/consulta/#campo-en-subquery) en `<subquery>` | `<subquery>` | 5 | Campo que define una condición ON del JOIN. La `<condicion>` con `valorde="campo"` referencia un campo de la tabla… | | [`<checklabel>`](https://docs.histrix.com.ar/es/schema/campos/#checklabel) | `<campo>`, `<field>` | — | Etiqueta que acompaña al checkbox, a la derecha del control. | | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | `<fieldGroup>`, `<include>`, `<tabla>` y 1 más | 3 | Cierre de proceso: ejecuta otro XML como parte de la grabación del actual. | | [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Campo que aporta la clave de la ayuda. **Sólo se lee dentro de `<ayuda_ex>`**, una de las formas legacy que comparten… | | [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) | `<pdf>` | — | Código del cuerpo del PDF, se ejecuta una vez al imprimir el contenedor. | | [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) | `<serie>` | — | Columna que aporta datos a esta serie. | | [`<complete>`](https://docs.histrix.com.ar/es/schema/campos/#complete) | `<campo>`, `<field>` | — | Expresión que el motor evalúa al completarse el campo. Ej: `<complete>numero + 1</complete>`. | | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion) | `<campo>`, `<field>` | 4 | Condición SQL de un campo: operador + valor literal/expresión. | | [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | `<campo>`, `<field>`, `<validation>` | 4 | Condición SQL de un campo: operador + valor literal/expresión. | | [`<conditionalDisplay>`](https://docs.histrix.com.ar/es/schema/campos/#conditionaldisplay) | `<campo>`, `<field>` | — | **No es una expresión: es el `id` de otro campo.** Si el valor de ese campo es falsy, este campo no se renderiza. | | [`<confirmacion>`](https://docs.histrix.com.ar/es/schema/raiz/#confirmacion) | `<abm>`, `<histrix>` | — | Mensaje de confirmación. | | [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | `<abm>`, `<histrix>` | 8 | Contenedor del modelo de edición/visualización (`<form>` o alias español `<consulta>`). | | [`<customScript>`](https://docs.histrix.com.ar/es/schema/raiz/#customscript) | `<abm>`, `<histrix>` | — | Script personalizado para la pantalla. | | [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) | `<grafico>` | — | Fuente alternativa de datos (cuando no se infiere del form). | | [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Valor por defecto del **parámetro de configuración**, no del combo: se lee sólo en `type="parameter"` y es el valor que… | | [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Se acepta por compatibilidad, pero **el motor no lo lee**: sólo busca la forma en inglés. | | [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Descripción del parámetro, para `type="parameter"`: es el texto explicativo que se muestra en el **panel nativo de… | | [`<detalle>`](https://docs.histrix.com.ar/es/schema/campos/#detalle) | `<campo>`, `<field>` | — | Nombre lógico del campo destino al volver de un popup hijo (mecanismo `<importar resume>`). | | [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) | `<tabla>`, `<table>` | — | SQL/PHP arbitrario a ejecutar. En `tipo="nosql"` Histrix reemplaza `'nombre_campo'` (entre comillas) por el valor del… | | [`<enabledWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#enabledwhen) | `<campo>`, `<field>` | — | Habilita **este** campo mientras se cumpla la condición y lo deshabilita cuando deja de cumplirse. | | [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) | `<grafico>` | — | Campo cuyo valor se usa como eje X (etiquetas de cada punto). | | [`<eval>`](https://docs.histrix.com.ar/es/schema/interaccion/#eval) | `<campo>`, `<field>` | — | **No es JavaScript: es PHP que corre server-side al parsear el XML**, y decide si el campo existe. | | [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) | `<eventos>`, `<events>` | 1 | — | | [`<eventos>`](https://docs.histrix.com.ar/es/schema/raiz/#eventos) | `<abm>`, `<histrix>` | — | Grafía castellana de `<events>`: contenedor de `<event id="...">` con el JavaScript que se ejecuta en cada momento del… | | [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) | `<abm>`, `<histrix>` | — | Alias en inglés de "eventos". | | [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events-en-events) en `<events>` | `<events>` | 1 | — | | [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) | `<campo>`, `<field>` | 2 | Expresión (SQL) para valores calculados. | | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression) | `<campo>`, `<field>` | 2 | Expresión SQL para valores calculados. Va al SELECT (o HAVING si hay GROUP BY). | | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression-en-field) en `<field>` | `<field>` | — | SELECT cuyo resultado se compara con el valor del campo. Soporta `'[__campo__]'` para interpolar otros campos del form. | | [`<false>`](https://docs.histrix.com.ar/es/schema/interaccion/#false) | `<if>` | — | Valor/expresión devuelto si la condición es falsy. Opcional: sin esta rama, cuando la condición da falso el campo queda… | | [`<falso>`](https://docs.histrix.com.ar/es/schema/interaccion/#falso) | `<if>` | — | Alias español legacy de `<false>`. | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | `<ayuda>`, `<ayuda_ex>`, `<fieldGroup>` y 9 más | 218 | Campo de formulario o columna de grid/consulta. Es el bloque fundamental: representa una columna SQL, un campo local… | | [`<field>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-actualiza) en `<actualiza>` | `<actualiza>` | 3 | Destino de la actualización: campo, combo o grid embebido. | | [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar) en `<importar>` | `<importar>` | 1 | Mapeo origen→destino dentro de `<importar>`. **El `id` es el campo origen y el texto del tag es el campo destino**; con… | | [`<field>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden) en `<orden>` | `<orden>`, `<order>` | 5 | Campo por el que ordenar. Si tiene `<expression>`, se ordena por esa expresión SQL. | | [`<field>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery) en `<subquery>` | `<subquery>`, `<tabla>`, `<table>` | 5 | Campo que define una condición ON del JOIN. La `<condicion>` con `valorde="campo"` referencia un campo de la tabla… | | [`<field>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-validations) en `<validations>` | `<validations>` | 1 | Campo a validar. El `id` es el campo del form cuyo valor se compara. | | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | `<include>`, `<tabla>`, `<table>` | 169 | Agrupador visual/lógico de campos. Se renderiza en el orden de aparición. | | [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) | `<tabla>`, `<table>` | 1 | Filtros adicionales mostrados en la barra superior del listado. | | [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) | `<tabla>`, `<table>` | 1 | Filtros adicionales mostrados en la barra superior del listado. | | [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) | `<pdf>` | — | Código que se ejecuta al dibujar cada pie de página. | | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) | `<abm>`, `<histrix>` | 8 | Contenedor del modelo de edición/visualización (`<form>` o alias español `<consulta>`). | | [`<format>`](https://docs.histrix.com.ar/es/schema/campos/#format) | `<campo>`, `<field>` | — | Alias inglés de `<formato>`. | | [`<formato>`](https://docs.histrix.com.ar/es/schema/campos/#formato) | `<campo>`, `<field>` | — | Formato de visualización (ej. "dd/mm/yyyy" en fechas, "#.##0,00" en numéricos). | | [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) | `<tabla>`, `<table>` | 3 | Definición de un gráfico. Va dentro de la `<table>`/`<tabla>` de la consulta que le da los datos: suelto en la raíz del… | | [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 3 más | — | Campos por los cuales agrupar el SQL (`GROUP BY`). Los campos con `<expression>` que usan funciones de agregación… | | [`<habilita>`](https://docs.histrix.com.ar/es/schema/campos/#habilita) | `<campo>`, `<field>` | — | **Está al revés de lo que sugiere el nombre**: el texto del tag es el `id` del campo *controlador*, y el que se… | | [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) | `<pdf>` | — | Código que se ejecuta al dibujar cada cabecera de página. | | [`<help>`](https://docs.histrix.com.ar/es/schema/campos/#help) | `<campo>`, `<field>` | — | Texto de ayuda contextual del campo (tooltip). | | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) | `<campo>`, `<field>`, `<include>` y 2 más | 24 | Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field =… | | [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) | raíz del documento | 172 | Raíz del documento Histrix. Define un formulario, consulta, ficha, grid, gráfico u otra vista según el atributo `tipo`. | | [`<htmllabel>`](https://docs.histrix.com.ar/es/schema/campos/#htmllabel) | `<campo>`, `<field>` | — | Texto alternativo del encabezado de columna, y **sólo se usa cuando la etiqueta normal está vacía**. | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | `<campo>`, `<field>`, `<orden>` y 1 más | 1 | Estructura condicional de un `<field>`: `<if exp="..."><true>X</true><false>Y</false></if>`. | | [`<if>`](https://docs.histrix.com.ar/es/schema/campos/#if-en-fieldgroup) en `<fieldGroup>` | `<fieldGroup>`, `<filters>`, `<filtros>` y 2 más | — | Condición de procesamiento del bloque entero: es texto PHP que se evalúa antes de leer los filtros y, si da falso, el… | | [`<iframe>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#iframe) | `<widget>` | — | **Éste sí es un iframe de verdad**, y es la forma de mostrar algo externo a la aplicación (un tablero, un mapa, una… | | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | `<campo>`, `<field>`, `<include>` y 2 más | 12 | Configura un popup hijo que alimenta el grid/form actual con datos seleccionados. | | [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) | raíz del documento | — | Fragmento XML incluido por otro documento (típicamente vía `<fieldGroup xml="..." dir="...">`). | | [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) | `<consulta>`, `<form>` | 2 | Relación con otra tabla (JOIN SQL). Soporta también JOIN a `<subquery>` cuando la tabla joineada es derivada… | | [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) | `<campo>`, `<field>` | 4 | Evaluación de código JavaScript al cambiar el campo. El resultado se asigna al destino. | | [`<jsfunction>`](https://docs.histrix.com.ar/es/schema/interaccion/#jsfunction) | `<campo>`, `<field>` | 1 | Función JS asociada a un evento del campo (onfocus, onblur, onkeypress...). | | [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Campo que aporta la clave de la ayuda, **en un `<helper type="external">`**. | | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | `<campo>`, `<field>` | 47 | Etiqueta legible del campo (header de columna o label del input). | | [`<label>`](https://docs.histrix.com.ar/es/schema/helpers/#label-en-ayuda) en `<ayuda>` | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Etiqueta del **parámetro**: se lee sólo en `type="parameter"` y es el nombre con el que el parámetro aparece en el… | | [`<maxsize>`](https://docs.histrix.com.ar/es/schema/campos/#maxsize) | `<campo>`, `<field>` | — | Máximo de caracteres del input (atributo HTML `maxlength`). | | [`<message>`](https://docs.histrix.com.ar/es/schema/interaccion/#message) | `<field>`, `<validation>` | — | Mensaje de error si la validación falla. Default "Valor invalido". | | [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) | `<tabla>`, `<table>` | 2 | Lista de XMLs relacionados que el motor procesa en cascada al grabar el padre. | | [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) | `<grafico>` | — | Valor meta que se dibuja como referencia sobre el gráfico (la línea de objetivo). | | [`<obs>`](https://docs.histrix.com.ar/es/schema/raiz/#obs) | `<abm>`, `<histrix>` | — | Observaciones (puede estar vacío). | | [`<onformchange>`](https://docs.histrix.com.ar/es/schema/campos/#onformchange) | `<campo>`, `<field>` | — | Código a ejecutar cuando cambia cualquier campo del form. | | [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) | `<tabla>`, `<table>` | — | JS a ejecutar al hacer clic en una fila de la grilla. | | [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) | `<opciones>`, `<options>` | 2 | Alias español de `<option>`; el motor lee las dos grafías. | | [`<opciones>`](https://docs.histrix.com.ar/es/schema/helpers/#opciones) | `<campo>`, `<field>` | — | Contenedor de opciones de un campo. | | [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador) | `<campo>`, `<field>` | 2 | Operador de la condición de filtro/JOIN del campo (=, !=, like, in, between, etc.). | | [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) | `<campo>`, `<field>` | 2 | Elemento `<operador>` (o alias `<operator>`) dentro de `<field>`. | | [`<operator>`](https://docs.histrix.com.ar/es/schema/campos/#operator-en-field) en `<field>` | `<field>` | — | Operador de comparación (`==`, `!=`, ...). Default `==`. Suele ir en CDATA cuando lleva `<` o `>`. | | [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 3 más | 2 | Opción fija del combo (no proviene de SQL). | | [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) | `<campo>`, `<field>` | — | Lista de opciones fijas para radio/select (no dependen de SQL). | | [`<options>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#options-en-grafico) en `<grafico>` | `<grafico>` | — | JSON crudo que se mergea sobre las opciones de la librería de gráficos, para llegar a cualquier setting que el motor no… | | [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 3 más | 1 | Alias español de `<order>`, pero **sólo funciona en `<tabla_ex>` y `<ayuda_ex>`**. | | [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 3 más | 1 | Definición de orden de la consulta (`ORDER BY`). Cada `<field>` declara una columna y su dirección. | | [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param) | `<importar>` | 3 | Condición pre-filtrado en consultas/importar. `field` es alias de `campo` (mismo significado). | | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 2 más | 5 | Forma equivalente a `<field>` con la sintaxis `source`/`target`. | | [`<parameter>`](https://docs.histrix.com.ar/es/schema/campos/#parameter-en-values) en `<values>` | `<values>` | 2 | Parámetro que se pasa al XML de `values` (pares `name`/`value`). | | [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) | `<campo>`, `<field>` | 4 | Parámetros para helpers de tipo "parameter". `id` (o `xml`) puede omitirse cuando se usa `retorna` sobre un set de… | | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) | `<campo>`, `<field>` | 3 | Alimenta con una **condición SQL** al contenedor embebido del campo (el que abre `obj` / `linkint` / el helper). | | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring-en-cierraproceso) en `<cierraproceso>` | `<cierraproceso>` | 1 | Mapea un campo del padre a un campo del XML cierraproceso. | | [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) | `<consulta>`, `<form>` | — | Impresión PDF con código embebido: `<header>`, `<code>` y `<footer>` se ejecutan como código PHP con la variable `$pdf`… | | [`<pdf>`](https://docs.histrix.com.ar/es/schema/campos/#pdf-en-campo) en `<campo>` | `<campo>`, `<field>` | — | **Código PHP que reemplaza el dibujado de este campo en el PDF.** El contenido se ejecuta al imprimir la celda y, si… | | [`<pdfancho>`](https://docs.histrix.com.ar/es/schema/campos/#pdfancho) | `<campo>`, `<field>` | — | Ancho de la columna del **valor** en la ficha impresa. Su contraparte para la etiqueta es el atributo `size` del… | | [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) | `<abm>`, `<histrix>` | 4 | Pie del documento/pantalla (atributos para PDF). | | [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) | `<tabla>`, `<table>` | — | Bloque de pre-consultas/validaciones ejecutadas antes de la consulta principal. | | [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) | `<campo>`, `<field>`, `<txtresultados>` | — | Texto que se antepone al valor del campo al renderizar (en pantalla y PDF). | | [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam) | `<campo>`, `<field>`, `<importar>` | 3 | Condición pre-filtrado en consultas/importar. `field` es alias de `campo` (mismo significado). | | [`<prompt>`](https://docs.histrix.com.ar/es/schema/raiz/#prompt) | `<abm>`, `<histrix>` | — | Instrucción para el resumen automático de la pantalla: el texto se le pasa al modelo de lenguaje junto con los datos… | | [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) | `<movimientos>` | 2 | Referencia a un XML hijo que se procesa como parte del movimiento. | | [`<requiredWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#requiredwhen) | `<campo>`, `<field>` | — | Hace obligatorio **este** campo mientras se cumpla la condición, y le saca la marca cuando deja de cumplirse. | | [`<scriptSrc>`](https://docs.histrix.com.ar/es/schema/raiz/#scriptsrc) | `<abm>`, `<histrix>` | — | Librería JavaScript externa que la pantalla necesita: el texto del tag es la ruta del archivo y se inyecta antes que el… | | [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) | `<tabla>`, `<table>` | — | SELECT crudo que reemplaza la consulta que el motor armaría con los `<field>`. | | [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) | `<tabla>`, `<table>` | — | Bloque de código PHP que llena la grilla a mano, en lugar del SELECT que armaría el XML: se ejecuta al cargar los datos… | | [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) | `<grafico>` | 1 | Campo de una serie de datos (eje Y). Repetir para múltiples series. | | [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | 1 | Inyecta una propiedad arbitraria en el contenedor embebido del helper: el `id` es el nombre de la propiedad y el texto… | | [`<setvar>`](https://docs.histrix.com.ar/es/schema/campos/#setvar) | `<campo>`, `<field>` | — | Guarda el valor del campo en una propiedad del contenedor de esa instancia, con el nombre que dice el texto del tag. | | [`<size>`](https://docs.histrix.com.ar/es/schema/campos/#size) | `<campo>`, `<field>` | — | Tamaño visual del input o ancho de columna. | | [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) | `<subquery>`, `<tabla>`, `<table>` | — | SQL del subquery. Acepta `'[__campo__]'` para parámetros. | | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | `<tabla>`, `<table>` | 7 | Una columna del tablero `tipo="kanban"`. Va como hijo directo de `<table>`, al lado de `<filters>` y `<order>`, y se… | | [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) | `<join>` | 1 | Subquery aliasada usada como tabla joineada. Estructura: `<subquery as="ALIAS">`<sql>`SELECT ...`</sql>`<field… | | [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) | `<grafico>` | — | Subtítulo del gráfico. | | [`<sufijo>`](https://docs.histrix.com.ar/es/schema/raiz/#sufijo) | `<txtresultados>` | — | Texto después de la cantidad de resultados. | | [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | `<consulta>`, `<form>` | 10 | Tabla SQL fuente de datos (`<table>` o alias español `<tabla>`). | | [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla-en-join) en `<join>` | `<join>` | 2 | Tabla joineada (alias español). Un `<join>` puede contener múltiples tablas joineadas en cadena. | | [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) | `<campo>`, `<field>` | 24 | Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field =… | | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) | `<consulta>`, `<form>` | 10 | Tabla adicional declarada al nivel del `<form>`/`<consulta>`. | | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table-en-join) en `<join>` | `<join>` | 2 | Tabla referenciada en el JOIN. Puede ser una tabla real o un `<subquery>` aliasado. | | [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) | `<consulta>`, `<form>` | 1 | Definición de tabla temporal usada como fuente del grid (típicamente en flujos de importación). | | [`<text>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#text) | `<widget>` | — | Contenido HTML fijo del widget, para los casos en que no hay una pantalla que embeber: un texto, un aviso, un bloque de… | | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | `<campo>`, `<field>` | 4 | Tipo del campo (date, numeric, check, file, geoPoint, etc.). | | [`<tipo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#tipo-en-grafico) en `<grafico>` | `<grafico>` | — | Tipo de gráfico. Valores válidos: `L` línea, `C` columnas, `SC` columnas (idéntico a `C`), `P` torta, `H` cotizaciones… | | [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) | `<abm>`, `<grafico>`, `<histrix>` y 1 más | — | Título del documento/pantalla. | | [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) | `<abm>`, `<grafico>`, `<histrix>` | — | Alias español de `<title>`; el motor lee las dos grafías. | | [`<true>`](https://docs.histrix.com.ar/es/schema/interaccion/#true) | `<if>` | — | Valor/expresión devuelto si la condición es truthy. | | [`<txtresultados>`](https://docs.histrix.com.ar/es/schema/raiz/#txtresultados) | `<abm>`, `<histrix>` | — | Cambia el texto que acompaña al contador de resultados del listado: `<prefijo>` va antes del número y `<sufijo>`… | | [`<url>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#url) | `<widget>` | — | Pantalla interna cuyo HTML se inyecta en el div del widget (se pide por AJAX, no es un iframe). | | [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) | `<fieldGroup>`, `<include>`, `<tabla>` y 1 más | 1 | Validación del formulario, en singular: `<condition>` + `<message>`. | | [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) | `<tabla>`, `<table>` | — | Validaciones **por campo**, en plural. Es un mecanismo distinto del `<validation>` singular: construye una validación… | | [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) | `<campo>`, `<field>` | 3 | Valor por defecto del campo. Con `eval="true"` se evalúa como PHP (ej. `date('d/m/Y')`). | | [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) | `<field>` | 1 | Valor literal contra el que comparar, como alternativa a `<expression>`. | | [`<value>`](https://docs.histrix.com.ar/es/schema/helpers/#value-en-ayuda) en `<ayuda>` | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | — | Campo que aporta la **descripción** de la ayuda en un `<helper type="external">`: el que se muestra al usuario… | | [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value-en-values) en `<values>` | `<values>` | 1 | Valor fijo: el `id` es lo que se guarda, el texto lo que se muestra. | | [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) | `<ayuda>`, `<ayuda_ex>`, `<helper>` y 1 más | 2 | Valores posibles de un parámetro (`type="parameter"`), para que el panel los ofrezca como lista en lugar de un texto… | | [`<verdadero>`](https://docs.histrix.com.ar/es/schema/interaccion/#verdadero) | `<if>` | — | Alias español legacy de `<true>`. El motor lo reconoce explícitamente como forma vieja: al encontrarlo activa el modo… | | [`<visibleWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#visiblewhen) | `<campo>`, `<field>` | — | Muestra u oculta **este** campo según una condición: el tag va sobre el campo controlado, no sobre el que dispara la… | | [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) | `<abm>`, `<histrix>` | 4 | Widget embebido en el dashboard. **No es un iframe y no apunta afuera**: el contenido de `<url>` se pide por AJAX y su… | ------------------------------------------------------------------------------ ## Tipos de valor URL: https://docs.histrix.com.ar/es/schema/tipos/ Los tipos del schema y, para los booleanos, cómo evalúa cada uno el motor. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Cada atributo declara de qué tipo es su valor. En Histrix eso importa más que en otros lenguajes por una razón concreta: **los booleanos del motor no se evalúan todos igual**. Hay atributos donde `attr="false"` desactiva la función, otros donde la deja activa, y otros donde escribir `false` la **activa**. Por eso los booleanos están separados en tipos distintos según su criterio de evaluación: el nombre del tipo dice qué hace el valor, sin necesidad de leer la descripción del atributo. ## Los criterios de los booleanos | Tipo | Con `attr="false"` | Si se omite el atributo | | --- | --- | --- | | [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) | desactivado | desactivado | | [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) | desactivado | **activo** | | [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) | **activo** | desactivado | | [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) | depende del camino del motor | indefinido | | [`Bool01`](https://docs.histrix.com.ar/es/schema/tipos/#bool01) | usa `0` y `1`, no `true`/`false` | según el atributo | `BoolPresencia` sólo admite el valor `true`, y es deliberado: el motor mira si el atributo está, no qué dice. El schema rechaza `="false"` para que el error salte en la validación en lugar de manifestarse como una función que quedó prendida. `BoolTrueFalse` es el caso a mirar con cuidado: son los atributos que el motor lee por más de un camino, con criterios distintos. Ahí conviene escribir el valor explícito y leer la descripción del atributo antes. ## Todos los tipos ### BoolEstricto Booleano textual: sólo el literal `true` en minúscula activa la función. Cualquier otro valor, y también omitir el atributo, la deja desactivada — así que `TRUE` en mayúsculas **no** la activa, y `false` es equivalente a no escribir nada. Base: `xs:string`. Valores (3 en total): `true`, `false` Valores con particularidades: - `no` — Legacy: cuenta como "false" por no ser `true`, no por diseño. No hay un `si` complementario. En código nuevo escribir "false". ### BoolDefaultActivo Booleano **activo por defecto**: si el atributo no está, la función corre igual. El único valor con efecto es `false`, que la apaga. Escribir `true` es redundante. Base: `xs:string`. Valores (3 en total): `true`, `false` Valores con particularidades: - `no` — Forma legacy equivalente a "false" en los atributos que la contemplan (`borra`, `modifica`, `inserta`). En código nuevo escribir "false". ### BoolPresencia **Sólo acepta `true`, y a propósito.** El motor no mira el valor de estos atributos sino si están presentes, así que `attr="false"` **activa** la función igual que `attr="true"` — es el error más frecuente con estos flags. Para desactivarla hay que **omitir el atributo**. El schema restringe el valor a `true` justamente para que un `="false"` se marque como error en vez de fallar en silencio en runtime. Base: `xs:string`. Valores (1 en total): `true` ### ModoAutocompletado Modo del helper de ayuda de un campo. **No es un booleano ni el atributo HTML `autocomplete`**: los únicos valores con efecto son `true` (autocompletado sobre el input) y `full` (autocompletado + popup de la ayuda). Cualquier otro valor —incluido `on` u `off`— cae en el comportamiento por defecto, que es sólo el popup de búsqueda: o sea que `off` no apaga nada. Base: `xs:string`. Valores (2 en total): `true`, `full` ### ActXmlValor Qué hace el `<jseval>` después de calcular: `true` (por defecto) manda el valor al servidor con un request por cada cambio; `false` lo resuelve entero en el browser — es la forma recomendada para aritmética pura, porque en una grilla con cálculos en cascada el default genera cientos de requests. También acepta el **nombre de un XML** (`algo.xml`), y en ese caso el request va contra ese XML. El patrón sólo admite esas tres formas justamente para que un `fasle` se marque como error. Base: `xs:string`. Patrón: `true|false|[A-Za-z0-9_./-]+\.xml` ### BoolTrueFalse Booleano textual `"true"` | `"false"` cuyo **criterio de evaluación no es uniforme**: el motor lo lee de más de una manera según el camino, o no está verificado cuál usa. En estos casos omitir el atributo no equivale a escribir ninguno de los dos valores, así que conviene ponerlo explícito y leer la descripción del atributo antes. Si un atributo tiene un criterio único y claro, está tipado con uno de los otros tres: `BoolEstricto`, `BoolDefaultActivo` o `BoolPresencia`. Base: `xs:string`. Valores (3 en total): `true`, `false` Valores con particularidades: - `no` — Legacy: cuenta como "false" por no ser `true`, no por diseño. No hay un `si` complementario. En código nuevo escribir "false". ### BoolJsLiteral Booleano que **se copia tal cual a la configuración de la grilla del navegador**: por eso no acepta ni `no` ni `1`/`0` — cualquier otro texto no es un booleano válido del otro lado y rompe el armado de la grilla en lugar de simplemente no aplicarse. Base: `xs:string`. Valores (2 en total): `true`, `false` ### GanttEscala Unidad de la escala de tiempo de un diagrama de Gantt. Base: `xs:string`. Valores (4 en total): `hours`, `days`, `weeks`, `months` ### OnClearFormValor Qué hacer con el campo al limpiar el formulario. `uniqid` es el único valor que el motor reconoce: cualquier otro texto no hace nada. Base: `xs:string`. Valores (1 en total): `uniqid` ### Bool01 Booleano entero: "0" | "1". Base: `xs:string`. Valores (2 en total): `0`, `1` ### KanbanRol Papel que cumple el campo dentro de la tarjeta de un tablero `tipo="kanban"`. La lista es cerrada: `KanbanData::ROLES` la valida y un rol mal escrito se reporta como error de configuración en pantalla, no se ignora. Base: `xs:string`. Valores con particularidades: - `title` — Encabezado de la tarjeta. Uno por tablero; sin él el tablero no se dibuja. Si el campo lleva un `<helper>`, la tarjeta muestra el valor crudo (el texto del control es vacío). - `body` — Texto descriptivo, recortado a tres líneas. - `tag` — Etiqueta corta al pie. **Admite varios campos**: cada uno se dibuja como una etiqueta aparte. - `person` — Responsable. Si el campo es un combo, se muestra el texto resuelto, no el id. - `age` — Antigüedad. El campo es una fecha y la tarjeta muestra el tiempo transcurrido ("12h", "3d"). Acepta ISO y `dd/mm/yyyy`. - `color` — Color del borde de la tarjeta, tomado del **valor** del campo (un color CSS). Pisa el color de la columna: sirve para pintar por regla de negocio (vencido, urgente) en lugar de por estado. - `action` — Botón al pie de la tarjeta, normalmente un `<helper type="link">`. **El campo no debe ocultarse**: con `noshow="true"` el helper viaja como metadata y la tarjeta muestra el valor crudo, y con `colstyle="display:none;"` el botón hereda ese `display:none`. Dejarlo visible no molesta, porque la tabla que alimenta al tablero ya está oculta. Admite varios campos. ### OrdenTipo Dirección de ordenamiento. En el `ORDER BY` del SQL da igual la caja, pero **el orden en memoria de la tabla temporal sólo reconoce `DESC` en mayúsculas**: con `orderType="desc"` la consulta sale ordenada y la grilla temporal no. Para que las dos coincidan, escribir `ASC`/`DESC` en mayúsculas. Base: `xs:string`. Valores (6 en total): `ASC`, `DESC`, `asc`, `desc`, `Asc`, `Desc` ### JoinTipo Tipo de JOIN. Base: `xs:string`. Valores (8 en total): `left`, `right`, `inner`, `full`, `LEFT`, `RIGHT`, `INNER`, `FULL` ### PdfFontStyle Aplicación de un estilo de fuente en el PDF. **No es un booleano**: el valor dice *a qué parte de la celda* se aplica el estilo. El motor pinta la celda en dos pasadas —primero el valor, después la etiqueta— y compara el atributo contra la pasada en curso: "true" aplica sólo al valor, "label" sólo a la etiqueta y "both" a las dos. "false" no coincide con ninguna pasada, o sea que no aplica el estilo (es la forma de anularlo). **El estilo se consulta sólo al imprimir fichas y etiquetas**: en las columnas de una grilla no se mira, así que ahí ninguno de los cuatro valores cambia nada. Base: `xs:string`. Valores (4 en total): `true`, `false`, `label`, `both` ### HelperTipo Tipo de helper (UI/ayudas). Un valor que no esté en esta lista **no construye ningún helper y se ignora en silencio** — el campo queda sin ayuda y no hay error en ningún log. Pero el valor **se guarda igual** en el campo antes de que el motor decida qué helper armar, y otras partes lo comparan para saber si el campo tiene combo, ayuda o contenedor embebido. Por eso un `type` mal escrito no sólo pierde la ayuda: además puede **desactivar la grabación inline** de ese campo o el modo `tags`. Base: `xs:string`. Valores (10 en total): `combo`, `comboex`, `link`, `external`, `parameter`, `object`, `inline`, `media`, `tags` Valores con particularidades: - `import` — Importa datos de otro XML al formulario. Se procesa por un camino aparte del resto de los tipos de helper, equivalente al tag `<importar>`: acepta los mismos `<field>`/`<parameter>` y los atributos del botón. ### CampoTipo Tipo del campo: decide el render, el formato y la validación. El valor se resuelve a una clase de tipo del motor y, **si no existe una clase para ese valor, el campo cae en silencio en el campo genérico**: pierde el comportamiento del tipo y también la inferencia por la metadata de la columna, sin ningún error. Por eso el enum es cerrado: un valor no listado casi siempre es un typo que ya está fallando en producción. Para resolver la clase el motor normaliza el valor (el guión bajo equivale a un espacio y el capital inicial es indiferente), pero **guarda además el texto crudo del tag** y lo compara de forma case-sensitive en más de una docena de lugares: armado del SQL, formato en el PDF, mapas. O sea que **las variantes de grafía no son equivalentes** aunque carguen la misma clase — resuelven el tipo y después no pasan ninguna de esas comparaciones. Escribir el valor exactamente como figura en la lista, con una excepción documentada más abajo: `geoPoint` va en camelCase. Base: `xs:string`. Valores (61 en total): `date`, `datetime`, `time`, `hora`, `month`, `timestamp`, `text`, `varchar`, `char`, `character`, `longtext`, `mediumtext`, `html`, `editor`, `integer`, `int`, `bigint`, `mediumint`, `smallint`, `tinyint`, `numeric`, `decimal`, `hfloat`, `custom_numeric`, `enclosed_integer`, `enclosed_numeric`, `meter`, `check`, `toggle`, `flipswitch`, `radio`, `select`, `button`, `color`, `tags`, `file`, `files`, `dir`, `aws`, `base64pdf`, `cuit`, `email`, `url`, `tel`, `isbn`, `password`, `grafico`, `qr`, `rrule`, `cron`, `string`, `float` Valores con particularidades: - `simpletext` — **No equivale a omitir `<tipo>`.** No hay clase para este valor, así que el campo cae en el genérico; y como el tag trae un tipo no vacío, el motor ya no consulta el tipo real de la columna: el campo queda **sin tipo**, ni siquiera `varchar`. Para un campo de texto plano conviene no escribir el tag. - `simpleditor` — Idéntico a `editor`: no cambia ningún comportamiento (la clase CSS que lo distingue la pone el propio editor). - `map` — **No-op**: como tipo de campo no agrega nada. El mapa lo dibuja la vista `<histrix tipo="map">` a partir de un campo `geoPoint`. - `geopoint` — Punto geográfico. **Si el campo alimenta una vista `tipo="map"` hay que escribirlo `geoPoint`, en camelCase**: el mapa compara el texto del tag y con `geopoint` no encuentra el punto, así que no dibuja nada. - `geopoly` — Renderiza igual que un `geopoint`: hereda el input del punto y el control de polígono nunca se alcanza. Sirve para documentar la intención, no cambia el comportamiento. - `Date` — **No equivale a `date`**: la clase resuelve igual, pero las comparaciones del motor son contra el texto crudo del tag y ninguna matchea `Date`, así que el campo pierde el tratamiento de fecha. Usar `date`. - `Integer` — **No equivale a `integer`**: la clase resuelve, pero el texto crudo `Integer` no pasa ninguna de las comparaciones de tipo del motor. Usar `integer`. - `custom numeric` — **No equivale a `custom_numeric`**: la clase resuelve, pero el formato numérico del PDF compara contra `custom_numeric` y con el espacio se pierde. Usar `custom_numeric`. - `geoPoint` — **Es la grafía obligatoria para los mapas, no una variante a evitar.** La vista `tipo="map"` busca el tipo escrito exactamente así, en camelCase, para saber qué campo trae el punto; con `geopoint` en minúsculas no lo encuentra y el mapa sale vacío. En un campo que no alimenta un mapa las dos grafías rinden igual. ### OperadorCondicion Operadores SQL para condiciones. Enum cerrado: arreglar el XML si trae un valor no listado. Base: `xs:string`. Valores (27 en total): `=`, `!=`, `<`, `>`, `<=`, `>=`, `<>`, `IN`, `in`, `LIKE`, `like`, `NOT LIKE`, `not like`, `is null`, `is not null`, `IS NULL`, `IS NOT NULL`, `IS`, `is`, `IS NOT`, `is not`, `NOT`, `not`, `NOT IN`, `not in`, `BETWEEN`, `between` ------------------------------------------------------------------------------ ## Raíz: <histrix> URL: https://docs.histrix.com.ar/es/schema/raiz/ El tag raíz de todo XML de Histrix, sus 168 atributos y los elementos de nivel superior. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: El tag raíz de un XML de Histrix. `<abm>` es un nombre alternativo del mismo tipo: las dos grafías aceptan exactamente los mismos atributos y los mismos hijos. Es el elemento con más atributos del schema, porque concentra la configuración de toda la pantalla: el tipo de vista, la paginación, la grabación, la impresión, la exportación y el comportamiento de la grilla. ## `<histrix>` Raíz del documento Histrix. Define un formulario, consulta, ficha, grid, gráfico u otra vista según el atributo `tipo`. Contiene un `<form>` (o alias `<consulta>`) con la definición de datos, y opcionalmente `<grafico>`, `<widget>`, `<eventos>`, `<customScript>`, etc. - **Va dentro de:** es el elemento raíz del documento. - **Atributos:** 172 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) | 0..n | Título del documento/pantalla. | | [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) | 0..n | Alias en español de title (tooltip/título). | | [`<pie>`](https://docs.histrix.com.ar/es/schema/raiz/#pie) | 0..n | Pie del documento/pantalla (atributos para PDF). | | [`<obs>`](https://docs.histrix.com.ar/es/schema/raiz/#obs) | 0..n | Observaciones (puede estar vacío). | | [`<confirmacion>`](https://docs.histrix.com.ar/es/schema/raiz/#confirmacion) | 0..n | Mensaje de confirmación. | | [`<eventos>`](https://docs.histrix.com.ar/es/schema/raiz/#eventos) | 0..n | Grafía castellana de `<events>`: contenedor de `<event id="...">` con el JavaScript que se ejecuta en cada momento del ciclo de la pantalla. | | [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) | 0..n | Alias en inglés de "eventos". | | [`<customScript>`](https://docs.histrix.com.ar/es/schema/raiz/#customscript) | 0..n | Script personalizado para la pantalla. | | [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) | 0..n | Definición del formulario/consulta principal. Contiene `<table>`, opcionales `<join>`, `<sql>`, `<tempTable>`, `<importar>`. | | [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) | 0..n | Alias español de `<form>`. Misma estructura. | | [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) | 0..n | Widget embebido (iframe a URL externa o componente custom) para dashboards. | | [`<scriptSrc>`](https://docs.histrix.com.ar/es/schema/raiz/#scriptsrc) | 0..n | Librería JavaScript externa que la pantalla necesita: el texto del tag es la ruta del archivo y se inyecta antes que el resto del JS del XML. | | [`<txtresultados>`](https://docs.histrix.com.ar/es/schema/raiz/#txtresultados) | 0..n | Cambia el texto que acompaña al contador de resultados del listado: `<prefijo>` va antes del número y `<sufijo>` después (por ejemplo "Se… | | [`<prompt>`](https://docs.histrix.com.ar/es/schema/raiz/#prompt) | 0..n | Instrucción para el resumen automático de la pantalla: el texto se le pasa al modelo de lenguaje junto con los datos del listado para que genere el… | ### Atributos #### Identificación y datos ##### `path` texto · opcional **No tiene nada que ver con la resolución de XMLs** (de eso se ocupan `dir=` y el orden de búsqueda del motor, que no miran `path`): es el **directorio de subida y lectura** de los campos `file`, `files` y `dir`. #### Visibilidad y estado ##### `editable` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional **Está invertido respecto del nombre**: `editable="true"` convierte la grilla en editable inline y por eso **oculta el botón Modificar**. `"false"` es lo mismo que no poner nada y no bloquea nada — para bloquear van `modifica="false"` o `sololectura`. (En un `<field>` el atributo homónimo significa otra cosa.) ##### `sololectura` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Si "true", el formulario es de sólo lectura (no permite alta/modificación/baja). **Sin `default` declarado a propósito**: un camino del motor trata la ausencia como activo (sólo "false" lo desactiva) y otro exige el literal "true", o sea que omitirlo no equivale a ninguno de los dos valores en todos los caminos. #### Clave y grabación ##### `log` texto · opcional Registra las operaciones en HTXLOG (auditoría). **Requiere el literal "true"**: todos los lectores lo comparan exacto, y **no** existe la variante de pasarle el nombre de un logger custom (el puente de auditoría se resuelve por plugin). Lo que faltaba, y es lo importante: **todo XML abierto desde el menú arranca con `log="true"` implícito**, así que ahí declararlo no cambia nada. #### Validación ##### `email` texto · opcional Al grabar, además de disparar la impresión declarada en `impresion`, abre el envío de ese PDF por mail. **Alcanza con que el atributo esté presente: el valor no se usa para nada** (por convención se repite el nombre del XML de impresión, pero es indistinto). Sin `impresion` no hace nada, porque el envío viaja pegado a la llamada de impresión. #### Estilo y presentación ##### `style` texto · opcional CSS inline del contenedor. ##### `clase` texto · opcional Igual que `class` (es la propiedad interna a la que `class` se mapea; escribir cualquiera de las dos llega al mismo lugar). El default cuando se omite lo pone cada vista: `ParentingClass` en un grid `ing`, y su clase por defecto propia en las vistas de mapa, ayuda, árbol y consulta. **No confundir con el `clase` del `<field>`**, que es la clase CSS del input. ##### `class` texto · opcional Clase CSS del contenedor de la vista. **No es "adicional": reemplaza** la clase por defecto (`consulta`, `ParentingClass`, el `defaultClass` de la vista…) — todos los lectores la toman como default-override. Para agregar sin reemplazar existe `tableClass`, que sí concatena. `class` y `clase` son la misma cosa en el `<histrix>`: escribir cualquiera de las dos llega al mismo lugar. #### Enlaces ##### `showLink` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Agrega en el ABM un botón que abre la URL de la vista en otra pestaña. **No aparece en la grilla** ni agrega una columna con el link. #### Exportación ##### `export` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Muestra el botón exportar (XLS/CSV). "false" lo oculta. #### Otros ##### `accordion` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Convierte las **solapas internas** (los campos con contenedor embebido) en un acordeón de paneles colapsables. **Los `<fieldGroup>` no participan.** ##### `ancho` texto · opcional Misma cosa que `width`: se leen juntos y gana el que esté presente. Aplica al ancho del contenedor en las vistas de árbol, mapa, calendario y consulta. ##### `automail` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Con "true" y junto a `autoprint`, además de imprimir dispara el envío del PDF por mail. Requiere el literal "true". ##### `autoprint` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Imprime automáticamente al abrir el documento (sin click del usuario). **Trae dos efectos laterales que se leen como un bug**: al parsear el XML fuerza `preFetch="true"` y pone en **sólo lectura** el formulario y sus grillas embebidas. Es la causa de "puse autoprint y ahora no puedo editar". ##### `autoupdate` texto · opcional Refresco automático periódico de la vista. **No es un booleano sino el intervalo**: el valor se compara contra cero, así que `autoupdate="true"` no hace nada — hay que poner un número. Y el polling sólo se arma en gráficos de tipo `gauge`. ##### `before` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Selector de **fase** del movimiento: con `"true"` ese contenedor se graba en la pasada previa; con cualquier otro valor, o ausente, en la pasada posterior. No tiene nada que ver con eventos de plugins. ##### `borra` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Permiso de borrado a nivel ABM. **No es alias de `deleteRow`** y la precedencia es asimétrica: en el permiso de borrado que expone el schema de la API gana `deleteRow`, y `borra="false"` **no** apaga el botón de borrar de cada fila de las grillas. Acepta la variante legacy `borra="no"`. ##### `bottomMargin` texto · opcional **No es un margen sino la coordenada Y del pie del PDF** (mm): positiva se mide desde el borde superior, negativa desde el borde inferior. Además corre el punto donde se dispara el salto de página. `bottomMargin="20"` imprime el pie a 20 mm del borde **superior**. ##### `btnconfirma` texto · opcional Texto custom del botón de confirmación. ##### `buildTree` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Construye una estructura jerárquica a partir de los resultados. Requiere campos con `arbol="padre"` y `arbol="hijo"`, **en minúscula**: escrito `Arbol` hay consumidores que no lo leen y el árbol sale vacío. ##### `calculateButton` texto · opcional Agrega un botón de recálculo a la barra de acciones. **No es un booleano**: el valor es la etiqueta visible del botón. Ej: `calculateButton="Buscar"`. ##### `calendarAspectRatio` `número` · opcional · default `1` Relación ancho/alto con la que se dibuja el calendario. ##### `calendarDefaultView` texto · opcional Vista inicial del calendario; omitido equivale a `"month"`. El valor se inyecta **crudo** en la configuración del calendario, así que un nombre inexistente no lo rechaza el schema pero rompe el render del lado del cliente. Los nombres válidos en la versión instalada son `month`, `basicWeek`, `basicDay`, `agendaWeek`, `agendaDay`, `listDay`, `listWeek`, `listMonth` y `listYear` — las vistas de lista ya vienen incluidas, sin agregar nada. ##### `calendarOptions` texto · opcional Opciones extra del calendario: el contenido se concatena **como JavaScript crudo** dentro de su configuración. No hay validación ni escapado, así que un error de sintaxis acá rompe el render del calendario entero. ##### `calendarTasks` texto · opcional Fuente de tareas del panel lateral del calendario. **No puede ser un campo**: el valor se usa crudo como **nombre de un XML** (se busca en el directorio del XML actual) y sus filas son las tareas. Requiere el panel lateral visible — ver `sidePanel`. ##### `cancel` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Muestra el botón que **limpia el formulario** (no cancela ninguna transacción). **Con `preFetch="true"` el botón no se dibuja**, aunque se declare `cancel="true"`. (Bug conocido: en `fichaing` devuelve `ReferenceError: xml is not defined`.) ##### `checkDupOnUpdate` texto · opcional **No valida duplicados**: el valor se pasa a un parámetro que nadie consume. Su único efecto real es forzar el camino **sin prepared statement** en el UPDATE. ##### `close` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", el popup se cierra automáticamente tras procesar. ##### `conBusqueda` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No es una búsqueda global y no tiene relación con los campos `fullSearch`.** Es la barra Buscar/Limpiar de una **ficha**: marca el formulario como formulario de búsqueda, lo arranca vacío y hace que el campo clave se use para traer el registro por su clave. ##### `confirma` texto · opcional **Es la leyenda del botón de procesar, no un mensaje de confirmación**: el valor se usa como texto del botón (el mismo lugar que `btnconfirma`). Los valores del repo lo confirman: GRABAR, CONFIRMAR, ANULAR, FACTURAR. El mensaje del popup "¿Está seguro?" es el elemento `<confirmacion>`. ##### `copies` `entero` · opcional Cantidad de copias del PDF a generar (multiplicar la salida). ##### `createButtonLabel` texto · opcional Texto del botón "Nuevo" del listado. ##### `dataSource` texto · opcional Nombre de una clase PHP propia con un método estático `Select()` que recibe el contenedor de datos y provee las filas (o `Clase::MetodoCustom`, para varias vistas en una misma clase), bypaseando la generación de SQL del motor. ##### `dataTable_info` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Controla el pie informativo de la grilla ("Mostrando X de Y registros"). ##### `dataTablePaginate` [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) · opcional Enciende el paginador de la grilla: aparecen los botones de página y el selector de cuántos renglones mostrar (arranca en 10, con opciones 10/25/50/100). Viene apagado, así que por defecto la grilla dibuja todos los renglones y se recorre con la barra de scroll vertical. Trampa: el valor se copia tal cual al script de la grilla, sólo se acepta true o false — cualquier otro texto rompe el armado de la grilla. En grillas con serverSide="true" que declaran paginar=, la paginación la decide paginar y este atributo queda sin efecto. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `dataTableReorder` texto · opcional Habilita el reordenamiento de filas de la grilla por drag-and-drop ("true"/"false"). ##### `dataTableScrollCollapse` [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) · opcional Cuando la grilla tiene menos renglones de los que entran en su alto, el marco con scroll se encoge hasta la altura real de los datos en vez de dejar el hueco vacío abajo. Viene apagado. Trabaja de la mano del alto de la grilla (tableHeight): si no hay un alto que sobre, no se nota diferencia. Sólo se acepta true o false, porque el valor se copia tal cual al script de la grilla. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `dataTableScroller` [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) · opcional Cambia la paginación por scroll virtual: la grilla mantiene el alto fijo y va pidiendo y dibujando sólo los renglones que caen en la ventana visible mientras se scrollea, lo que la vuelve usable con muchísimos registros. Viene apagado. Trampa grande: se aplica únicamente en grillas con serverSide="true"; en una grilla común el atributo se ignora por completo. Sólo se acepta true o false. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `defaultPrinter` texto · opcional Impresora que queda preseleccionada en el combo de impresoras del panel de opciones de impresión del programa. El combo se arma con las impresoras configuradas en la base más la opción PDF, que es la primera y corresponde al valor vacío, así que el texto tiene que coincidir exactamente con el nombre de una impresora configurada; si no coincide con ninguna no se preselecciona nada y queda PDF. Es sólo un valor por defecto: el usuario puede cambiarlo antes de imprimir. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `deleteRow` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Habilita el botón eliminar en cada fila. **No es alias de `borra`**: `deleteRow` es el que decide el permiso de borrado que expone la API, y `borra="false"` no apaga el botón por fila de las grillas. ##### `delimitador` texto · opcional Separador de columnas **efectivo** de la exportación CSV (default ","). **No es un alias secundario de `delimiter`**: `delimiter` sólo precarga el input del diálogo y éste es el que manda. ##### `delimiter` texto · opcional **Sólo precarga** el separador en el input del diálogo de exportación; no es el separador efectivo del CSV. El carácter que se escribe lo fija `delimitador`. ##### `detailDir` texto · opcional Directorio donde vive el XML de detalle: el que se abre al expandir una fila, y también el detalle de las vistas de calendario y de gantt. Sin esto se busca en el directorio del XML actual. Si el nombre declarado en `detalle` ya trae ruta propia, esa ruta gana. El mismo valor se puede escribir como `dir` en el `<consulta>`/`<form>`, y si están los dos, el del `<consulta>`/`<form>` pisa a éste. ##### `directprint` texto · opcional Nombre de la impresora configurada a la que se manda, sin pasar por el visor de PDF, el comprobante que el programa imprime automáticamente después de grabar. Cualquier valor no vacío enciende el modo directo, pero NO es un booleano: el valor se usa tal cual como nombre de impresora, así que poner "true" hace que se busque una impresora llamada "true" (con el usuario en modo editor eso corta con un error de impresora inexistente). Escrito en el XML de un movimiento la impresión se resuelve entera en el servidor; escrito en el programa principal el navegador dispara el pedido en segundo plano en lugar de abrir la ventana con el PDF. Va todo en minúsculas. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `dirImpresion` texto · opcional Directorio del XML de impresión (combinado con `xmlImpresion`). ##### `dirimpresion` texto · opcional Alias lowercase de `dirImpresion`. ##### `displayFilterButton` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Con false esconde el renglón de la barra de filtros donde viven el botón Buscar, el de limpiar filtros y los botones de toolbar declarados para la barra de filtros. Cualquier otro valor —o no poner el atributo— los deja visibles. Sólo tiene sentido si la búsqueda se dispara de otra forma (por ejemplo con autoFilter="true"), porque si no el usuario se queda sin manera de ejecutar el filtro. Trampa: el ocultado se genera con un estilo mal cerrado, así que además de esconderse puede comerse parte del contenido de ese renglón. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `drag` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Permite mover tarjetas entre columnas. **Apagado por defecto.** Sólo se concede si además el XML permite escribir: `sololectura` y `modifica="false"` lo desactivan, y el servidor lo vuelve a evaluar antes de grabar, así que un PUT a mano sobre un tablero de sólo lectura responde 403. El movimiento hace un UPDATE del campo de estado y **no dispara `<movimientos>`**. Para un estado que es consecuencia de un comprobante o de un proceso (presupuesto → facturado, orden pendiente → cumplida), dejarlo en `false`: el tablero grabaría el estado nuevo sin los movimientos que le corresponden. ##### `dsn` texto · opcional Nombre del DSN alternativo (definido en `custom_dsn` de config.xml). Permite que este XML consulte otra BD distinta de la principal. ##### `evento` texto · opcional **No es un evento JS**: se resuelve server-side y filtra **qué evento de grabación dispara este movimiento**. Si el evento en curso no coincide con el valor, el contenedor se saltea entero y no graba nada. ##### `exportasuma` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No interviene en la exportación.** Aplica a los XMLs que devuelven datos al contenedor referente (`llenoReferente` / `<importar>`): con "true" se devuelve **una sola fila** que acumula los campos marcados con `suma="true"`, en vez de las N filas del resultado. ##### `exportFormat` texto · opcional · default `Xls` Formato con el que sale el botón exportar: "Xls" (default) | "Csv" | "Xml". El valor se resuelve por nombre, así que hay que respetar las mayúsculas del ejemplo. ##### `exportHeader` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Controla si la primera fila del XLS exportado lleva los nombres de columnas. ##### `extension` texto · opcional Extensión que se propone en el diálogo de exportación (default "csv"). **Sólo precarga el input**: cuando la exportación se pide por API gana la extensión propia del formato. El motor acepta además la grafía con typo `extenssion` como alias. ##### `filter` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Controla el **buscador general de la grilla** (el input de búsqueda que trae la tabla), **no la barra de `<filters>`**. Y el valor engaña: cualquier valor no vacío lo enciende, incluido `"false"` — lo único que lo apaga es **omitir el atributo**. El que sí controla la barra de filtros es `autoFilter`. ##### `fontSize` texto · opcional Tamaño de fuente de la **planilla exportada** (default 10). No toca el HTML del formulario ni el PDF. ##### `forceReload` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Después de grabar o de borrar, vuelve a consultar la base (y a recargar la tabla temporal) en lugar de reusar los datos que ya tenía en memoria. **Excepción a `BoolTrueFalse`: el motor sólo mira si el atributo está presente, no su valor** — cualquier valor lo activa, incluido `"false"`. Para desactivarlo hay que quitar el atributo (o inutilizarlo renombrándolo, p.ej. `_forceReload`). ##### `form` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` **No suprime el render del formulario.** Sólo tiene efecto real en las vistas de árbol (`arbol`/`treeView`); en `tipo="consulta"` lo único que hace `form="false"` es desactivar el llenado del formulario al clickear una fila (click-en-la-fila → llena-el-form). En las demás vistas es inerte. Además el motor lo lee con más de un criterio, así que omitirlo no es idéntico a escribir "true". ##### `ganttItemsPerPage` `entero` · opcional Cuántas filas muestra cada página del diagrama de Gantt; el resto se llega con los botones de página. Si no se indica, 20. Tiene que ser un número: el valor se copia tal cual al script de la vista, así que un texto la rompe. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `ganttMaxScale` [`GanttEscala`](https://docs.histrix.com.ar/es/schema/tipos/#ganttescala) · opcional Escala más gruesa a la que el usuario puede alejar el zoom del diagrama de Gantt. Si no se indica queda en meses, que además es lo máximo que maneja la vista, así que en la práctica sólo sirve para restringir más (por ejemplo, poner weeks para que no se pueda alejar hasta meses). **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `ganttMinScale` [`GanttEscala`](https://docs.histrix.com.ar/es/schema/tipos/#ganttescala) · opcional Escala más fina a la que el usuario puede acercar el zoom del diagrama de Gantt. Trampa: si no se declara queda en días, más restrictivo que el mínimo natural de la vista, así que el zoom a horas está bloqueado hasta que se ponga hours de forma explícita. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `ganttScale` [`GanttEscala`](https://docs.histrix.com.ar/es/schema/tipos/#ganttescala) · opcional Escala de tiempo con la que abre el diagrama de Gantt: horas, días, semanas o meses. Si no se indica, abre en días. Después el usuario puede acercar o alejar con el zoom, siempre dentro de los límites que fijan ganttMinScale y ganttMaxScale. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `graba` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Opt-**in** del contenedor de **cabecera** para que la cabecera haga su propio INSERT: sólo `"true"` hace algo. `graba="false"` no impide ninguna grabación, es un no-op. ##### `grabaFinal` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **Va en el `<histrix>` del XML de movimiento/relación**, no en un `<table>`. Con "true", ese contenedor se saltea en la pasada normal de movimientos y se graba al final de todo. No es específico de UPDATE. La fase exacta la termina de elegir `postGrabacion`, que se evalúa junto con él. Alias lowercase aceptado: `grabafinal`. ##### `grabafinal` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Alias lowercase de `grabaFinal`. ##### `grid` texto · opcional **No es un modo de render: es la geometría del contenedor.** El valor son dos medidas separadas por coma — `"ancho,alto"` — que se vuelcan al CSS del contenedor; en `tipo="card"` es lo que dimensiona las tarjetas. ##### `hasFieldset` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Envuelve los campos en un `<fieldset>` HTML (agrupado visual). **Cualquier valor no vacío lo activa, incluido `"false"`**: para no envolver hay que omitir el atributo. ##### `hideForm` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En `tipo="ing"`, deja la grilla sola y esconde el formulario de entrada detrás de un botón. No es sólo un `display:none`: el bloque del formulario nace oculto, el botón pasa a decir **"Agregar …"** y es el que lo despliega, y al confirmar el alta el diálogo se cierra y el formulario vuelve a ocultarse. Se compara contra el literal `"true"`: cualquier otro valor deja el formulario visible. ##### `htmlTemplate` texto · opcional Template HTML alternativo para fichas con layout custom. ##### `importFile` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Activa el botón para importar datos desde archivo XLS/CSV. **El motor sólo mira si el atributo está presente, no su valor**: `importFile="false"` muestra el botón igual. Para que no aparezca hay que omitir el atributo. ##### `importTempTable` texto · opcional Nombre de la tabla temporal de importación que alimenta el grid. ##### `impresion` texto · opcional Alias lowercase de `xmlImpresion`: XML de impresión asociado. ##### `imprime` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Muestra el botón imprimir/exportar a PDF. "false" lo oculta. **Sin `default` declarado a propósito**: el motor lo lee con dos criterios distintos, así que el valor efectivo depende de la vista. En unas ramas el botón aparece salvo que el valor sea exactamente "false"; en otras hace falta el literal "true" para que se active. Omitirlo NO es equivalente a ponerlo en "true". Y el valor se compara sin normalizar: `imprime="false "` (con un espacio al final) no es "false" y el botón se dibuja igual. ##### `imprimetanda` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Agrega un botón que imprime **en tanda**: un solo PDF con una copia por cada fila de la tabla temporal, respetando el campo de condición de cada fila y el `pageBreak`. No "agrupa varias instancias" en una sola impresión. ##### `innerForms` texto · opcional Modo de render de formularios internos en ABMs. Ej. "list" muestra los hijos como lista en lugar de tabs. ##### `inserta` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional · default `true` Permite el alta de registros en ABM/consulta. Default true. Equivalente al botón "+". XMLs legacy usan `inserta="no"`, pero **las dos vistas no lo tratan igual**: la web contempla los dos valores ("false" y "no"), mientras que la vista mobile sólo mira "false". En los XMLs con `inserta="no"` el botón de alta queda oculto en la web y **visible en mobile**. Para que valga en las dos, usar "false". Ojo también con `insertaABM`: es la otra grafía del mismo permiso, y cuando están los dos `inserta` la pisa. ##### `insertaABM` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` **No es independiente de `inserta`**: los dos escriben el mismo interruptor de alta y, si están los dos, **gana `inserta`** porque se aplica después. Poner `insertaABM="true"` junto a `inserta="false"` no habilita el alta. ##### `limit` texto · opcional `LIMIT` aplicado a la query principal. Tres cosas que no son obvias: `limit="0"` significa **sin límite** (está excluido explícitamente); la forma `"offset,count"` es válida y es la que usa la paginación; y **la forma `[__campo__]` no existe** — el valor se castea a entero, así que `[__campo__]` colapsa a 0 y el límite queda desactivado en silencio. ##### `llenoreferente` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Es la misma propiedad que `llenoReferente`: escribir cualquiera de las dos grafías llega al mismo lugar. **El `default="false"` declarado acá es engañoso**, y además contradice a `llenoReferente`, que a propósito no declara ninguno: hay caminos del motor que tratan la ausencia como activo y otros que exigen el literal "true". Ver la descripción de `llenoReferente`. ##### `llenoReferente` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Si "true", al recibir un parámetro referente precarga sus datos en el form. **Sin `default` declarado a propósito**: hay un camino que trata la ausencia como activo (sólo "false" lo desactiva) y otros dos que exigen el literal "true", así que omitirlo no equivale a ninguno de los dos valores. ##### `llenoTemporal` texto · opcional Nombre de la tabla temporal usada para alimentar grillas de importación. **Tiene doble semántica**: además de nombre funciona como flag — `llenoTemporal="false"` evita que la tabla temporal se vacíe al recargar, y el valor participa de la cadena de `preFetch` del schema. ##### `llenotemporal` texto · opcional Alias lowercase de `llenoTemporal`. ##### `logReference` texto · opcional Lista CSV de campos cuyo valor se incluye como observación en el log de auditoría. ##### `mapPolyline` texto · opcional Polyline que conecta los puntos del mapa. **Viene dibujada aunque no se declare el atributo**: el único valor con efecto es `"false"`, que la saca. ##### `maxshowresult` `entero` · opcional Tope de filas que la consulta acepta mostrar. **No pagina ni recorta**: si el total supera el número **no se renderiza ninguna fila** y el cuerpo de la tabla se reemplaza por una línea con "N Registros Encontrados". Sirve para obligar a filtrar antes de listar. ##### `modifica` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Muestra el botón de modificar registros. Con la variante legacy `modifica="no"` pasa lo mismo que con `inserta="no"`: algunas ramas del ABM la toleran, pero la vista que dibuja el botón lee el atributo tal cual y con "no" **deja el botón visible**. Usar "false". ##### `modificar` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Tercera grafía viva junto a `modifica`: con "true" habilita el botón de modificar. Conviene usar `modifica`, que es la que contemplan todos los caminos del render. ##### `multipleSelection` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Agrega la columna de checkboxes para seleccionar varias filas; al procesar, el motor junta las marcadas y las manda juntas. Sirve declarado acá **o** en el `<form>`: los dos caminos terminan en el mismo contenedor, y de ahí lo leen los consumidores. **Ojo con el valor**: una parte del render exige el literal `"true"` y otra alcanza con que el atributo esté presente, así que `multipleSelection="false"` deja el render a medias (columna y clase CSS sí, configuración de la grilla no). Usar `"true"` o no ponerlo. ##### `noForm` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional No dibuja la barra de botones de la toolbar y, en la vista mobile, tampoco la columna de borrar fila de los grids `ing`. **No suprime el tag `<form>` envolvente ni oculta el formulario**: para esconder el form de entrada está `hideForm`, que es otra cosa. ##### `noform` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Alias lowercase de `noForm`. ##### `noLimit` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Saca el tope de un solo registro que el motor le agrega por defecto a sus UPDATE y DELETE, de manera que la operación alcanza a todos los renglones que cumplan la condición. Usar con mucho cuidado: si la condición no identifica un único registro, se modifican o borran varios de una vez y sin aviso. Además, una vez que se aplica deja en cero el tope declarado con limit= para lo que resta de la operación. Sólo true activa. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `noTabs` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Con "true" el contenedor se renderiza **inline en lugar de como pestaña**. **Va en el `<histrix>` del XML EMBEBIDO**, no en el del formulario padre: los dos únicos lectores lo consultan sobre el contenedor interno, no sobre el del padre. O sea que hay que ponerlo en el XML que abre el `<helper type="object">`, no en el que lo contiene. Declararlo en el padre no hace nada. ##### `notificationDir` texto · opcional Subdirectorio del XML vinculado al aviso de notificación; si no se pone, se usa el directorio del programa que generó el aviso. El dato viaja dentro de la notificación y llega al cliente, pero la interfaz actual no lo usa para armar el botón del aviso (lo arma sólo con el nombre del XML), así que hoy no cambia nada visible: queda disponible para clientes propios que consuman las notificaciones por API. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `notificationLink` texto · opcional Nombre del XML al que apunta el botón de lupa ("Ver") del aviso de notificación: al tocarlo se abre el historial de auditoría de ese evento para ese programa. Si no se pone, se usa el XML del programa que generó el aviso, que es lo habitual; sirve cuando el aviso lo dispara un XML de grabación pero el historial que le interesa al usuario es el de otro programa. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `notificationText` texto · opcional Reemplaza el texto del aviso que reciben los usuarios suscriptos al programa cuando alguien da de alta, modifica, borra o procesa. Si no se pone, el aviso dice la acción más el título del programa ("Insertó Facturas", "Modificó Facturas"). El texto aparece en el globo de notificación, en el panel de notificaciones y en el aviso push del celular. Ojo que el aviso de altas, modificaciones y bajas sólo se emite si el programa tiene la auditoría activada y si hay usuarios suscriptos. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `onDuplicateKey` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Activa `ON DUPLICATE KEY UPDATE` en el INSERT. ##### `orphanLabel` texto · opcional Título de la columna de huérfanos. Default "Sin clasificar". ##### `pageBreak` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` **No es lo mismo que `PDFpageBreak`**: `pageBreak` sólo existe en la impresión en tanda (`imprimetanda`) y decide si cada **fila** arranca en una página nueva. ##### `pageNumber` texto · opcional `id` del campo que aporta el número de página del PDF. **No es un booleano ni un número**: el motor toma el valor de ese campo (o el último valor, si hay varias filas) como número de la primera página y sigue numerando desde ahí. Ej: `pageNumber="numerator"` numera con el campo `numerator`. ##### `paginar` `entero` · opcional Activa paginación con N filas por página. ##### `PDFcardBottomMargin` texto · opcional En PDFs tipo etiqueta/tarjeta: **pese al nombre se usa como offset superior** del contenido de la tarjeta y como separación entre filas de tarjetas (mm). No tiene efecto en la primera tarjeta ni en la primera de cada página. ##### `PDFconpie` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Renderiza el pie de página del PDF (toma el contenido del `<pie>` del XML). **Cualquier valor no vacío lo activa, incluido "false"**: con `PDFconpie="false"` el pie se imprime igual. Para que no salga hay que **omitir el atributo**. ##### `PDFfont` texto · opcional · default `helvetica` Fuente del PDF (helvetica, times, courier...). ##### `PDFfontSize` `entero` · opcional Tamaño de fuente global del PDF (en puntos). Es la única grafía que se lee a nivel `<histrix>`; a nivel `<field>`/`<label>` la grafía viva es `PDFfontsize` (con `s` minúscula), que es otro atributo. ##### `PDFheaderBorder` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Recuadro redondeado de la **cabecera del documento** (logo, título, fecha) más el separador de la fecha. **No afecta los títulos de columna de la tabla.** Viene activo; "false" lo saca. ##### `PDFheaderMargin` `número` · opcional Distancia en milímetros, medida desde el borde superior de la hoja, a la que vuelve el contenido cada vez que la impresión PDF abre una hoja nueva por corte de página. Por defecto son 27 mm, que es lo que ocupa la cabecera estándar (logo, datos de la empresa, título, fecha): si la cabecera de la base es más alta, de la segunda hoja en adelante el contenido se le encima y hay que subir este número. No cambia nada en la primera hoja, donde el contenido arranca justo debajo de la cabecera ya medida. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `PDFheaderTotals` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", repite la fila de totales en el header de cada página del PDF. ##### `PDFheigthRel` `número` · opcional Divisor del interlineado de las celdas del PDF: cuanto más alto, más comprimidas quedan las filas. Default 1.2 en el cuerpo de la grilla y 2 en la línea de cantidad de registros. **El nombre lleva el typo `heigth` en el motor** y hay que escribirlo así. Es el atributo que se busca cuando `PDFlineHeight` no da el resultado esperado: ése fija un alto absoluto en mm, éste es el multiplicador. ##### `PDFlineColor` texto · opcional Color de las líneas/recuadros del PDF. **No es hexadecimal**: son los tres componentes RGB en decimal separados por coma, y el default es `220,220,220`. Un valor como `#cccccc` no se parsea: rompe la generación del PDF. ##### `PDFlines` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` **Ya vienen prendidas: el atributo sirve sólo para apagarlas con "false".** Y no son líneas separadoras entre filas: es el recuadro de cada celda (un rectángulo por columna), y en la vista de tarjetas el marco de la tarjeta. ##### `PDForientacion` texto · opcional **No es un alias equivalente de `PDForientation`.** La generación del PDF lee `PDForientation`; `PDForientacion` sólo preselecciona el valor en el selector de impresión de la UI, así que por sí solo no rota nada. ##### `PDForientation` texto · opcional · default `P` Orientación del PDF: "P" (Portrait, default) | "L" (Landscape — rota contenido 90°). **Es la grafía que lee la generación del PDF**; la variante española `PDForientacion` sólo preselecciona el valor en el selector de impresión de la UI. ##### `PDFpageBreak` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Permite/desactiva el salto de página automático del PDF; "false" lo desactiva. **No es lo mismo que `pageBreak`**, que sólo existe en la impresión en tanda y decide si cada fila arranca en página nueva. ##### `PDFpageSize` texto · opcional · default `A4` Tamaño de página PDF: "A4", "Letter", "Legal", o personalizado. ##### `PDFpageSizeX` `entero` · opcional Ancho custom de página PDF (mm). **Sólo se aplica si además está declarado `PDFpageSizeY`**: solo, no hace nada. ##### `PDFpageSizeY` `entero` · opcional Alto custom de página PDF (mm). **Va siempre en pareja con `PDFpageSizeX`**: si falta el otro, el tamaño custom no se aplica. En `PDForientation="L"` se interpreta como ancho. ##### `PDFprintPageTotals` texto · opcional Totales por página del PDF. **Trampa:** vienen activos por defecto y la comparación es estricta contra un booleano, así que **declarar el atributo con cualquier valor —incluido "true"— los desactiva**. Para tenerlos hay que omitirlo. ##### `PDFsincabecera` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Omite la cabecera del PDF (la primera página arranca sin header global). **Cualquier valor no vacío lo activa, incluido "false"**: con `PDFsincabecera="false"` la cabecera igual se suprime. Para que la cabecera salga hay que **omitir el atributo**. ##### `postGrabacion` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` En `<histrix tipo="nosql">`: ejecuta el PHP DESPUÉS de la grabación, no antes. ##### `postGridData` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional **Va en el `<histrix>` del XML embebido**: con "true" ese contenedor interno postea sus datos junto con el formulario padre, como si fuera una grilla. Sirve para que un embebido que no es grid participe de la grabación del padre. ##### `preFetch` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` En ficha/fichaing, precarga los datos existentes del registro. NO usar en formularios de alta. El motor lo lee con más de un criterio, así que omitirlo no es idéntico a escribir "false". `autoprint="true"` lo fuerza a "true" (y de paso deja el formulario en sólo lectura). Escrito `prefetch` o `preetch` (28 usos en el repo) no lo lee nadie y la ficha no precarga nada. ##### `preloadData` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional · default `true` Si "true", ejecuta la query y precarga los datos al renderizar; "false" en grillas embebidas con `lazyLoad` difiere la carga. El motor lo lee con más de un criterio, así que omitirlo no es idéntico a escribir "false". ##### `preventDuplication` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional **No bloquea el doble submit del botón grabar.** Lo que evita es que se duplique la solapa de un grid `ing` embebido en un `fichaing`, y para lograrlo descarta los scripts de recarga de los contenedores relacionados. **Con el atributo ausente ya está activo**: escribir `"true"` no cambia nada y el valor útil es `"false"`. El propio motor tiene este camino marcado como código a corregir, así que conviene verificar el efecto antes de dejarlo. ##### `printCondition` texto · opcional Nombre de un campo del propio programa que decide si se hace o no la impresión automática posterior a la grabación. La trampa está en la comparación: la impresión se saltea únicamente cuando ese campo vale el texto exacto "false"; con 0, con vacío, con "no" o con cualquier otro valor imprime igual. Sirve con un campo calculado que devuelva "true" o "false" según el tipo de comprobante. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `printer` texto · opcional Dirige la impresión a una impresora concreta. **El valor no es el nombre del dispositivo sino un `idPrinter` de la tabla `HTXPRINTERS`**: el motor busca esa fila y de ahí saca `printerClass`, `systemName` (el nombre real en el sistema; si viene vacío usa el `idPrinter`), `outputFormat` y `printMode` — con `printMode = 'client'` la impresión se enruta al cliente de impresión instalado en la máquina del usuario. Dos consecuencias: si la fila **no existe** en la base del cliente no se imprime y **no hay mensaje de error**, así que el mismo XML funciona en un cliente y no en otro; y su sola presencia **cambia la salida de PDF a HTML** (iframe de preview + script del cliente de impresión), por eso la vista deja de declarar el contenido como PDF cuando está seteado — declararlo igual provocaría un "Failed to load PDF document" en Chrome. El valor viaja además en la URL de impresión (`&printer=…`). Para elegirlas desde la UI existe `ayudas/htxprinters_qry.xml`. ##### `printViewer` texto · opcional Nombre del conversor con el que se previsualiza la impresión en el navegador, para formatos que no son PDF. Valores en uso: `Zpl2pdf` (etiquetas Zebra) y `Esc2html` (impresoras de tickets). ##### `privacy` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Activa la **seguridad por registro**: al insertar se guarda quién es el dueño de la fila, y después las consultas de esa pantalla filtran por eso. Requiere el literal "true". Es el atributo que hace que dos usuarios de la misma pantalla vean sólo lo suyo. ##### `procesa` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional · default `true` **No es alias de `process` ni de `procesar`**: son tres atributos con lectores disjuntos. `procesa` es el que decide si el contenedor tiene proceso y si se dibuja el botón de procesar. El motor lo lee con más de un criterio, así que omitirlo no es idéntico a escribir "false". ##### `procesar` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No es una variante de `procesa` ni hace lo mismo.** `procesar="true"` dispara la grabación de los contenedores internos y marca el contenedor como procesable en el schema que expone la API. El botón de procesar y la detección de "este XML tiene proceso" las maneja `procesa`. ##### `process` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Habilita el procesamiento de `<movimientos>`/relaciones al grabar. **`procesa` y `procesar` no son sus aliases**: son tres atributos con lectores distintos, y poner uno esperando el efecto de otro no funciona (ver sus descripciones). El motor lo lee con más de un criterio, así que omitirlo no es idéntico a escribir "false". ##### `processFirst` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` En `<cierraproceso>`: si "true", ejecuta los movimientos del HIJO antes que los del padre. Útil para obtener numeradores antes de que el padre grabe. ##### `redirect` texto · opcional El motor lo publica tal cual en el esquema que devuelve la API del programa, junto con el título, el tipo, los permisos y la paginación, para que un cliente propio decida a dónde llevar al usuario. El resto del motor no lo interpreta: en la interfaz web clásica no produce ningún efecto, y si no se declara el esquema lo informa vacío. No tiene relación con el parámetro de redirección del login, que es otra cosa y viaja por la URL. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `reloadForm` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Sólo aplica a los **detalles inline** (el XML embebido, distinto del padre) y sólo cuando `llenoReferente` no está en `"true"`. Y `"false"` no significa "no recargar": el bloque inline **se vacía** en lugar de recargarse. ##### `replaceInto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Genera `REPLACE INTO` en lugar de `INSERT INTO` (MySQL). ##### `resume` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En `<importar>` con popup hijo. **No "mantiene el contexto": en su ámbito hace lo contrario** — antes de volver a subir la celda al padre **descarta el SQL que esa celda ya había generado**, justamente para que reabrir el popup no duplique movimientos. ##### `saveRowButton` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Muestra botón "guardar" por fila en grids editables. ##### `selectModifier` texto · opcional Texto que se inyecta **entre `SELECT` y la lista de campos**, para forzar el plan del optimizador: típicamente `STRAIGHT_JOIN` o un hint entre comentarios. Va crudo al SQL, así que un valor inválido rompe la consulta. Usarlo sólo después de haber medido el plan de ejecución; no es una optimización a ciegas. ##### `serverSide` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Activa el modo server-side de la grilla: paginación, búsqueda y orden se resuelven en el servidor vía AJAX en vez de traer todas las filas al navegador. ##### `showCantidad` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Imprime al pie del PDF la línea `Registros: N` con la cantidad de filas. **Sólo aplica al PDF**: no hay equivalente en la vista HTML. Requiere el literal "true"; el default es no imprimirla, así que `showCantidad="false"` es redundante. El motor también lo acepta en `<table>`, aunque hoy ningún XML lo use ahí. Escrito `showCant` o `showcantidad` (34 usos en el repo) no lo lee nadie. ##### `showcantidad` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Variante en minúsculas de `showCantidad`, que **acá sí funciona**: la búsqueda de atributos del `<histrix>` ignora mayúsculas. En `<table>`, en cambio, se acepta sólo `showCantidad`. En código nuevo escribir `showCantidad` en los dos lugares. ##### `showOrphans` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Muestra la columna con las tarjetas cuyo estado no coincide con ninguna `<status>` declarada. **Activa por defecto, a propósito**: apagarla hace que esas filas desaparezcan del tablero sin ningún aviso. Esa columna no acepta drops. ##### `showProcessButton` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Fuerza el botón de procesar en un contenedor embebido. **Va en el `<histrix>` del XML embebido**, no en el del padre. ##### `sidePanel` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Panel lateral de las vistas `calendar`. **Está al revés**: viene activo por default y la comparación es estricta contra un booleano, así que **cualquier valor explícito lo apaga**, incluido `sidePanel="true"`. Para tenerlo hay que omitir el atributo; para esconderlo, escribir cualquier valor. Ojo que `calendarTasks` necesita el panel visible. ##### `sinFecha` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Suprime la fecha en la cabecera del PDF. ##### `sinNumero` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Suprime el número de comprobante en la cabecera del PDF. ##### `sqlClausule` texto · opcional Texto que se inserta tal cual inmediatamente después del SELECT y antes de la lista de campos; el uso típico es meter DISTINCT. Viene vacío. Trampas: no agrega separador, hay que dejarle el espacio final (por ejemplo "DISTINCT ") o queda pegado al primer campo y el SQL sale inválido; y no se aplica a la consulta de conteo que usa paginar=, así que el total de registros puede no coincidir con las filas que realmente se ven. Cae en el mismo lugar que selectModifier, que es el atributo de uso corriente para esto. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `sqlhardcoded` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No afecta la consulta sino la grabación**: el INSERT se arma con los valores crudos y sin lista de columnas, se deshabilitan los prepared statements y cambia el contexto en que se resuelve el código del INSERT. El motor anota el XML en su log de pendientes como algo a arreglar, así que es un modo a evitar en XMLs nuevos. Para SQL literal en la **consulta** va el elemento `<sql>`. ##### `sqlKillable` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Hoy no produce ningún efecto: el motor tiene la lectura del atributo, pero el bloque que la usaba está desactivado, así que declararlo o no genera exactamente el mismo SQL. Estaba pensado para evitar que la consulta salga marcada con el identificador de la instancia (marca que servía para reconocerla en el servidor y cancelarla si quedaba colgada). No conviene declararlo en XMLs nuevos. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `statusField` texto · opcional Sólo para `tipo="kanban"`, donde es **obligatorio**: nombra el campo cuyo valor decide en qué columna cae cada tarjeta. Tiene que estar declarado como `<field>` en el XML (puede ser `noshow="true"`); si falta o no existe, el tablero no se dibuja y lo dice en pantalla. ##### `styleTable` texto · opcional Estilo CSS inline que se aplica a la tabla HTML de la grilla. Trampa importante: cuando no se declara, el motor le pone float:left;clear:left;, así que en el momento en que lo definís pisás ese default y la grilla deja de flotar a la izquierda y de cortar el renglón anterior; si solo querés agregar algo, repetí el float y el clear. En la vista mobile no hay default: ahí queda solo lo que escribas. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `subtipo` texto · opcional Subtipo del modo. Ej. `tipo="ing" subtipo="vertical"` renderiza el form de entrada como columna en lugar de fila. ##### `swap` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Agrega una columna angosta a la izquierda de la grilla con una manija para arrastrar renglones y cambiarles el orden; al soltar, el cambio se graba solo, sin apretar Grabar. Trampa central: no se guarda ningún número de orden — el motor intercambia el contenido de los renglones entre registros dejando los campos clave quietos, o sea que reescribe con UPDATE los registros involucrados (el registro que tenía la clave 1 queda con los datos del que estaba abajo). Todos los movimientos van en una sola transacción. Sólo true activa. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `tabindex` `entero` · opcional Tabindex base del formulario para navegación por teclado. ##### `tableBorder` `entero` · opcional Se pasa tal cual al atributo border de la tabla HTML de la grilla, así que con "1" te dibuja el borde de la tabla y de las celdas. Trampa: el border escrito en el tag table del XML no lo lee el motor; el que manda es este, arriba en histrix. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `tableClass` texto · opcional Clases CSS que se **agregan** a la tabla de la grilla. Es el complemento de `class`/`clase`, que en cambio **reemplazan** la clase por defecto de la vista. ##### `tableHeight` texto · opcional Altura fija del contenedor de la tabla (`px`, `vh`, etc.). Va en `<histrix>`, NO en `<table>`. ##### `template` texto · opcional Nombre/ruta de un template alternativo de impresión/render para este `<histrix>`. ##### `tipo` texto · **obligatorio** Modo del documento. **El valor es el nombre de la vista que lo renderiza**, así que la lista no es cerrada y un valor mal escrito no resuelve ninguna vista. Los que se usan de verdad: "consulta" (listado/grid), "ficha" (form de un registro), "fichaing" (form con grillas embebidas), "ing" (grid editable), "crud", "update", "abm" (alta/baja/mod), "abm-mini", "grid", "horizontalGrid", "liveGrid", "list", "card", "cabecera", "delete", "insert" (alta directa con SQL literal), "sql", "nosql" (ejecuta PHP/SQL sin mapeo), "chart" (gráfico), "arbol", "dashboard", "calendar", "map", "kanban" (tablero por estado: ver `statusField`, `drag` y `<status>`) y "ayuda" (popup de ayuda). "gantt" tiene vista en el motor pero **ningún XML lo usa**. ##### `tipoInsert` texto · opcional Modificador que se inyecta en el `INSERT` generado — y también en los `UPDATE`. **Los valores válidos son "IGNORE" y "REPLACE", en mayúsculas.** Los tres que documentaba antes el XSD estaban mal: `insertSelect` no existe; `replace` en minúscula no matchea la comparación del motor y se emite tal cual, generando `INSERT replace into …` (error de sintaxis SQL); e `ignore` funciona de casualidad, porque la base ignora el case de la keyword. ##### `titulo_div` texto · opcional Título alternativo del contenedor: reemplaza al título declarado a la hora de nombrar el PDF que se imprime, de titular ese PDF y de describir la operación en la auditoría. Se le sacan las etiquetas HTML antes de usarlo. Trampa: normalmente lo manda el navegador con el título de la pestaña que abrió el usuario, y ese valor pisa lo que venga escrito en el XML. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `topMargin` `número` · opcional Se declara como margen superior de la impresión PDF y el motor lo lee y lo guarda (si no se pone, vale 0), pero ninguna rutina de armado del PDF llega a usarlo: hoy no produce ningún efecto visible. Si lo que buscás es correr hacia abajo el arranque del contenido en las hojas que se abren por corte de página, el atributo que sí funciona es PDFheaderMargin; para el margen de abajo está bottomMargin, que sí se aplica. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `transaccional` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Envuelve la grabación en una transacción SQL explícita (BEGIN/COMMIT/ROLLBACK). El motor lo lee con más de un criterio, así que omitirlo no es idéntico a escribir "false": para activarlo va el literal "true". **Escrito con una sola `c` (`transacional`, 12 usos en el repo) no lo lee nadie y la grabación no va en transacción.** ##### `treeGrid` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Muestra el árbol como grilla: una primera columna con los nodos y, a la derecha, una columna por cada campo visible del XML (con su etiqueta y su ancho). Sin este atributo el árbol muestra únicamente los nodos. Trampas: las columnas se arman sólo con los campos que no estén marcados como ocultos, y en árboles que llevan un campo con suma="true" —que se construyen completos de entrada— las columnas de datos se pierden y queda sólo la del nodo. Sólo true activa. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `unserializeParent` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Al volver de un popup, deserializa los datos del padre desde la sesión (sincroniza estado). **Viene activo aunque no se declare**: el único valor que lo apaga es `"false"`, así que el `default="false"` declarado acá hace creer lo contrario de lo que pasa. ##### `updateTempTable` texto · opcional **No es el nombre de una tabla: es un booleano y viene activo.** Con el atributo ausente los datos del grid se copian a las tablas temporales; el único valor con efecto es `"false"`, que desactiva ese volcado. ##### `width` texto · opcional Ancho del contenedor, pero **sólo lo leen cuatro vistas, y con unidades distintas**: en `arbol`, `map` y `calendar` es un número sin unidad (el porcentaje del split), y en `chart` un entero en px al que el motor le agrega el `px`. En consulta/abm/ficha es **inerte** (93 XMLs del repo lo declaran ahí para nada), y `width="30%"` en un chart genera CSS inválido. ##### `xlsHeader` [`BoolJsLiteral`](https://docs.histrix.com.ar/es/schema/tipos/#booljsliteral) · opcional Decide si la exportación a Excel arranca con un bloque de cabecera: logo, nombre de la empresa, CUIT/teléfono/web, línea separadora y el título del reporte con la fecha, y los datos empiezan más abajo. Tiene tres estados: "true" la fuerza, "false" la saca y, si no se declara el atributo, se respeta la configuración general de la base (que viene apagada). También deja pre-marcado el interruptor de cabecera del diálogo de exportación, que el usuario puede cambiar para esa exportación puntual. Sólo afecta a Excel: CSV, PDF y XML lo ignoran. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ##### `xmldir` texto · opcional Directorio del XML, usado para armar la clave de programa de las notificaciones. Va **en el `<histrix>`**: sólo el tag raíz copia todos sus atributos al contenedor. Puesto en el `<form>` no llega a ninguna propiedad y no hace nada, porque ahí el parser sólo toma una lista blanca de atributos. ##### `xmlImpresion` texto · opcional Nombre del XML usado para la impresión (separado de la consulta). ##### `XMLroot` texto · opcional · default `data` Nombre del tag raíz cuando se exporta a XML (`tipo="exportXML"` o similar). Default: "data". ##### `XMLrow` texto · opcional · default `row` Nombre del tag por fila al exportar a XML. Default: "row". ##### `zoom` texto · opcional Zoom inicial (mapa/gráfico). Alias corto de `mapZoom`. ## `<abm>` Raíz del documento. Atributo "tipo" identifica el modo del documento (p.ej., "consulta"). - **Va dentro de:** es el elemento raíz del documento. - **Atributos:** 172 (propios) Acepta los mismos 172 atributos y los mismos elementos hijos que [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix), que es donde están documentados. ## `<title>` Título del documento/pantalla. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n), [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<titulo>` Alias español de `<title>`; el motor lee las dos grafías. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<obs>` Observaciones (puede estar vacío). - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<pie>` Pie del documento/pantalla (atributos para PDF). - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. - **Atributos:** 4 (propios) ### Atributos #### `align` texto · opcional Sin descripción en el schema. #### `color` texto · opcional Color del texto del pie. #### `size` texto · opcional Sin descripción en el schema. #### `style` texto · opcional Sin descripción en el schema. ## `<confirmacion>` Mensaje de confirmación. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<eventos>` Grafía castellana de `<events>`: contenedor de `<event id="...">` con el JavaScript que se ejecuta en cada momento del ciclo de la pantalla. El motor lee las dos grafías; en código nuevo usar `<events>`. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) | 0..n | — | No acepta atributos. ## `<events>` Alias en inglés de "eventos". - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<event>`](https://docs.histrix.com.ar/es/schema/raiz/#event) | 1..n | — | | [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) | 0..n | — | No acepta atributos. ## `<event>` - **Va dentro de:** [`<eventos>`](https://docs.histrix.com.ar/es/schema/raiz/#eventos) (0..n), [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) (1..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) Acepta los mismos 1 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar), que es donde están documentados. ## `<customScript>` Script personalizado para la pantalla. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<scriptSrc>` Librería JavaScript externa que la pantalla necesita: el texto del tag es la ruta del archivo y se inyecta antes que el resto del JS del XML. El orden de carga es `<scriptSrc>` → el `.js` hermano del XML (si existe, se carga solo) → `<customScript>`, así que las funciones declaradas acá ya están disponibles en el `customScript`. Repetible: un tag por librería. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<txtresultados>` Cambia el texto que acompaña al contador de resultados del listado: `<prefijo>` va antes del número y `<sufijo>` después (por ejemplo "Se encontraron" / "comprobantes"). Sin este bloque se usa el texto por defecto del sistema. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) | 0..1 | Texto antes de la cantidad de resultados. | | [`<sufijo>`](https://docs.histrix.com.ar/es/schema/raiz/#sufijo) | 0..1 | Texto después de la cantidad de resultados. | No acepta atributos. ## `<prefijo>` Texto que se antepone al valor del campo al renderizar (en pantalla y PDF). Útil para etiquetas tipo "$ 1.000" o "Total: 5". También se acepta como atributo. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<txtresultados>`](https://docs.histrix.com.ar/es/schema/raiz/#txtresultados) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<sufijo>` Texto después de la cantidad de resultados. - **Va dentro de:** [`<txtresultados>`](https://docs.histrix.com.ar/es/schema/raiz/#txtresultados) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<prompt>` Instrucción para el resumen automático de la pantalla: el texto se le pasa al modelo de lenguaje junto con los datos del listado para que genere el análisis que se muestra al usuario. Acá se le dice qué mirar ("resumí los desvíos de stock por depósito") en lugar de dejarlo librado al resumen genérico. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<include>` Fragmento XML incluido por otro documento (típicamente vía `<fieldGroup xml="..." dir="...">`). Comparte la estructura de un fieldGroup pero como documento independiente: lista de campos o grupos que el motor inyecta en el sitio donde se incluye. El nombre del elemento raíz **no se chequea**: el motor toma los hijos del documento sin mirar cómo se llama la raíz, así que `<include>` es una convención, no un requisito. - **Va dentro de:** es el elemento raíz del documento. ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo incluido. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`. | | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | 0..n | Sub-grupo incluido. | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | 0..n | Inclusión condicional: texto PHP que decide si el contenido del include se procesa. | | [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) | 0..n | Validación incluida junto con los campos. | | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | 0..n | Cierre de proceso incluido junto con los campos. | | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | 0..n | Bloque de importación incluido junto con los campos. | | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) | 0..n | Helper incluido junto con los campos. | No acepta atributos. ## `<events>` en `<events>` - **Va dentro de:** [`<events>`](https://docs.histrix.com.ar/es/schema/raiz/#events) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) Acepta los mismos 1 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar), que es donde están documentados. ------------------------------------------------------------------------------ ## Consulta: <form> y <table> URL: https://docs.histrix.com.ar/es/schema/consulta/ Los elementos que definen de dónde salen los datos: tabla base, joins, agrupamiento, orden y filtros. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Estos elementos describen la consulta: qué tabla es la base, con qué se une, cómo se agrupa y ordena, y qué filtros ve el usuario. El motor arma el SQL a partir de esta declaración. ## `<form>` Contenedor del modelo de edición/visualización (`<form>` o alias español `<consulta>`). Define la tabla base, joins, parámetros, y opcionalmente un bloque PDF custom. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Atributos:** 8 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) | 0..n | Impresión PDF con código embebido: `<header>`, `<code>` y `<footer>` se ejecutan como código PHP con la variable `$pdf` disponible, que apunta al… | | [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) | 0..n | JOIN a otra tabla. El motor genera el SQL del JOIN a partir de los `<field>` con `<condicion>`. | | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) | 0..n | Tabla adicional declarada al nivel del `<form>`/`<consulta>`. | | [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | 0..n | Alias español de `<table>` a este nivel, con el mismo comportamiento: si se declara más de una, sobrevive únicamente la última. | | [`<tempTable>`](https://docs.histrix.com.ar/es/schema/consulta/#temptable) | 0..n | Tabla temporal que alimenta el grid (flujos de importación). | ### Atributos #### `detailText` texto · opcional Texto que ocupa el panel de detalle **mientras no se eligió ninguna fila** (el "Seleccione una fila…"). Sólo aplica al detalle en panel, no al inline, y si se omite se usa el texto traducido por defecto. #### `detalle` texto · opcional Nombre del XML hijo que se abre como popup al hacer click en una fila (vista de detalle). #### `dir` texto · opcional Directorio del XML referenciado por `detalle` (relativo al módulo). #### `hasDetail` texto · opcional Campo cuyo valor determina si la fila tiene detalle disponible (icono "+"). #### `inline` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Muestra el detalle expandido bajo la fila en lugar de en un popup. **Cualquier valor no vacío lo activa, incluido `"false"`**: para que el detalle salga en popup hay que **omitir** el atributo. El `default="false"` declarado acá es engañoso — `inline="false"` no apaga nada, lo prende. #### `multipleSelection` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Agrega la columna de checkboxes para seleccionar varias filas. **`multipleSelection="false"` no lo apaga**: unas partes del render exigen el literal `"true"` y otras se conforman con que el atributo tenga cualquier valor, así que con `"false"` la selección múltiple queda a medio armar. Para desactivarla hay que **omitir** el atributo. #### `showCab` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Muestra arriba del detalle la cabecera de lo consultado (el form en modo lectura). **Escrito acá no funciona**: el motor lo renombra al transferirlo al contenedor y la propiedad resultante no la lee nadie. Hoy el único lugar donde surte efecto es el `<histrix>`, con `showCab="true"`. Es un defecto del motor, no del schema. #### `single` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Con `"true"`, y sólo cuando hay `detalle` + `inline`, agrega la clase CSS `single` a la celda del detalle inline. **No hace nada más**: no es "registro único", no toca la paginación ni la navegación entre filas, y hoy ni el JS ni el CSS del proyecto consumen esa clase. ## `<consulta>` Contenedor del modelo de edición/visualización (`<form>` o alias español `<consulta>`). Define la tabla base, joins, parámetros, y opcionalmente un bloque PDF custom. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Atributos:** 8 (propios) Acepta los mismos 8 atributos y los mismos elementos hijos que [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form), que es donde están documentados. ## `<table>` Tabla adicional declarada al nivel del `<form>`/`<consulta>`. **No es un JOIN implícito**: el motor arma un contenedor por cada `<table>` de este nivel y se queda **sólo con el último**, sin merge ni condición ON automática, así que la primera tabla queda pisada. Para relacionar tablas va `<join>`. - **Va dentro de:** [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) (0..n), [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) (0..n) - **Atributos:** 10 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) | 0..n | Relaciones a otros XMLs que se procesan al grabar (cascada de inserts/updates). | | [`<ejecuta>`](https://docs.histrix.com.ar/es/schema/grabacion/#ejecuta) | 0..n | SQL/PHP arbitrario a ejecutar. En `tipo="nosql"` Histrix reemplaza `'nombre_campo'` (entre comillas) por el valor del campo. | | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | 0..n | XML hijo que se procesa al cerrar/grabar este. Con `processFirst="true"` el hijo se ejecuta antes que el padre. | | [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) | 0..n | Validación previa a la grabación con `<condition>` + `<message>`: si la condición falla, se muestra el mensaje y se aborta. | | [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) | 0..n | Validaciones por campo (`<field>` con `<expression>` + `<operator>` + `<message>`). | | [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) | 0..n | Filtros adicionales (barra superior). Equivalente a `<filtros>`. | | [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) | 0..n | Alias español de `<filters>`, pero **no del todo equivalente**: el motor procesa primero `<filtros>` y después `<filters>`, y la segunda pasada… | | [`<preconsultas>`](https://docs.histrix.com.ar/es/schema/consulta/#preconsultas) | 0..n | **No ejecuta SQL.** Es una lista de otros XMLs que se consultan antes de la consulta principal y cuyas filas quedan disponibles para ésta. | | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | 0..n | Popup hijo para alimentar el grid actual. | | [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) | 0..n | SQL raw. Sólo se reemplaza `[__campo__]`. | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo de formulario o columna de grid/consulta. Es el bloque fundamental: representa una columna SQL, un campo local (`local="true"`), un valor… | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Campo de formulario o columna de grid/consulta. Es el bloque fundamental: representa una columna SQL, un campo local (`local="true"`), un valor… | | [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) | 0..n | Agrupador visual/lógico de campos. Se renderiza en el orden de aparición. | | [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) | 0..n | Campos por los que agrupar (genera `GROUP BY`). Requiere `tabla="X"` en cada `<field>` cuando la columna está en múltiples tablas del JOIN. | | [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) | 0..n | Orden de la consulta (genera `ORDER BY`). | | [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) | 0..n | Alias español de `<order>`. | | [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) | 0..n | Gráfico asociado a la tabla (líneas/barras/torta). | | [`<status>`](https://docs.histrix.com.ar/es/schema/consulta/#status) | 0..n | Columna de un tablero `tipo="kanban"`: un valor del campo declarado en `statusField`. | | [`<select>`](https://docs.histrix.com.ar/es/schema/consulta/#select) | 0..n | SELECT crudo que reemplaza la consulta que el motor armaría con los `<field>`. | | [`<selectCode>`](https://docs.histrix.com.ar/es/schema/consulta/#selectcode) | 0..n | Bloque de código PHP que llena la grilla a mano, en lugar del SELECT que armaría el XML: se ejecuta al cargar los datos y tiene que dejar armado un… | | [`<onRowClick>`](https://docs.histrix.com.ar/es/schema/consulta/#onrowclick) | 0..n | JS a ejecutar al hacer clic en una fila de la grilla. | | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) | 0..n | Helper de importación a nivel de tabla (`type="import"`): define de dónde se traen renglones para llenar la grilla. | ### Atributos #### `ajusteDebe` texto · opcional `id` del campo donde se imputa el ajuste al Debe. El valor se transfiere al contenedor, pero **hoy ningún consumidor del motor lo lee**: escribirlo no cambia nada. #### `ajusteHaber` texto · opcional `id` del campo donde se imputa el ajuste al Haber. El valor se transfiere al contenedor, pero **hoy ningún consumidor del motor lo lee**: escribirlo no cambia nada. #### `as` texto · opcional Alias SQL de la tabla base. Necesario cuando la misma tabla entra más de una vez en la consulta (por ejemplo un JOIN a sí misma) para poder calificar las columnas sin ambigüedad. #### `CondExp` texto · opcional Condición de grabación por expresión, **complemento de `idCampoCond`** y no un reemplazo: el motor toma el último valor grabado del campo nombrado en `idCampoCond` (o `0` si viene vacío), le pega este texto a la derecha y evalúa el resultado como expresión PHP; si da falso, la fila no se graba. O sea que acá va sólo el operador y el término derecho — por ejemplo `> 0` o `== 5`. Estando presente, reemplaza la evaluación truthy simple de `idCampoCond`. #### `id` texto · **obligatorio** Nombre de la tabla SQL base. #### `idCampoCant` texto · opcional `id` de un campo cuyo valor es la **cantidad de veces que se repite la grabación** de la fila: con `idCampoCant="cant"` y `cant=3`, el movimiento inserta tres registros iguales en lugar de uno. Vacío o ausente equivale a 1, y si el campo contiene una grilla embebida se usa la cantidad de filas de esa grilla. **No valida nada**: no tiene relación con rechazar cantidades en cero. #### `idCampoCond` texto · opcional `id` del campo que habilita la grabación de la fila: si su valor es falsy, el INSERT/UPDATE de esa fila no se ejecuta. Cuentan como falsy el vacío (o sólo espacios), `0`, `'0'`, `0.00`, `'0.00'`, `false` y `'false'`; cualquier otra cosa graba, incluido el literal `"true"`. **Va en el `<table>`**: escrito en el `<form>`/`<consulta>` se descarta en silencio (30 XMLs del repo lo tienen ahí y no hace nada). #### `label` texto · opcional Etiqueta legible de la tabla. **En la práctica no se ve en ninguna parte**: el motor la toma como título inicial del contenedor y unas líneas después la pisa siempre con el título declarado en el `<histrix>` — y si el `<histrix>` no trae título, la pisa con vacío. Ni la pestaña, ni el PDF, ni el nombre del archivo exportado la usan, aunque hay cientos de XMLs que la escriben. El título va en el `<title>`/`<titulo>` del `<histrix>`. #### `showCantidad` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Muestra la cantidad de renglones de la grilla. Ojo con la grafía: es exactamente `showCantidad` — `showCant` y `showcantidad` no se leen. #### `style` texto · opcional CSS inline que se emite como atributo `style` de la `<table>` HTML de la grilla, tanto en la vista web como en la mobile. **Ojo que reemplaza el default del motor**, que es `float:left;clear:left;`: si sólo querés agregar una regla conviene repetir esas dos, porque al pisarlas cambia el layout de la grilla. Y `styleTbody` —que este mismo XSD recomendaba antes para el `<tbody>`— **no existe en ninguna forma**: los 265 usos del repo no hacen nada. ## `<tabla>` Tabla SQL fuente de datos (`<table>` o alias español `<tabla>`). Contiene los campos del form, opcionalmente grupos, orden, filtros, validaciones, movimientos, cierraproceso. El `id` es el nombre de la tabla en la BD. - **Va dentro de:** [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) (0..n), [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) (0..n) - **Atributos:** 10 (propios) Acepta los mismos 10 atributos y los mismos elementos hijos que [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table), que es donde están documentados. ## `<join>` Relación con otra tabla (JOIN SQL). Soporta también JOIN a `<subquery>` cuando la tabla joineada es derivada (`<subquery as="ALIAS"><sql>SELECT ...</sql></subquery>`). **Un `<if>` dentro del `<join>` no se lee: el join se aplica siempre.** Para condicionarlo está `grupo`. - **Va dentro de:** [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) (0..n), [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) (0..n) - **Atributos:** 2 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) | 0..n | Tabla joineada (alias español). Un `<join>` puede contener múltiples tablas joineadas en cadena. | | [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) | 0..n | Tabla joineada (alias inglés). | | [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) | 0..n | JOIN a un subquery (tabla derivada). Requiere atributo `as`. | ### Atributos #### `grupo` texto · opcional Grupo lógico del join (usado para identificar conjuntos de joins relacionados). #### `tipo` [`JoinTipo`](https://docs.histrix.com.ar/es/schema/tipos/#jointipo) · opcional Tipo de JOIN: left | right | inner | full (case-insensitive). ## `<subquery>` Subquery aliasada usada como tabla joineada. Estructura: `<subquery as="ALIAS"><sql>SELECT ...</sql><field .../>...</subquery>`. El SQL dentro de `<sql>` soporta `'[__campo__]'` para valores de campos del padre. - **Va dentro de:** [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) (0..n) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<sql>`](https://docs.histrix.com.ar/es/schema/consulta/#sql) | 0..1 | SQL del subquery. Acepta `'[__campo__]'` para parámetros. | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campos del subquery con sus condiciones ON. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`. | ### Atributos #### `as` texto · **obligatorio** Alias SQL obligatorio del subquery. ## `<sql>` SQL del subquery. Acepta `'[__campo__]'` para parámetros. - **Va dentro de:** [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) (0..1), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<group>` Campos por los cuales agrupar el SQL (`GROUP BY`). Los campos con `<expression>` que usan funciones de agregación (SUM/COUNT/MAX) quedan fuera del GROUP BY automáticamente. Va dentro de la `<table>`/`<tabla>`: dentro de un `<fieldGroup>` no se lee y el `GROUP BY` no se aplica. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo de agrupación. Requiere `tabla="X"` si la columna está en múltiples tablas del JOIN. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`. | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | 0..n | Condición de procesamiento del bloque entero: texto PHP que decide si el `GROUP BY` se aplica o no. | No acepta atributos. ## `<order>` Definición de orden de la consulta (`ORDER BY`). Cada `<field>` declara una columna y su dirección. Va dentro de la `<table>`/`<tabla>`: colgado directo del `<form>`/`<consulta>` o de un `<fieldGroup>` no se lee y el `ORDER BY` no se aplica. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | 0..1 | Orden condicional: aplica el `<field>` que esté dentro de la rama true/false según la expresión. | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo por el que ordenar. Si tiene `<expression>`, se ordena por esa expresión SQL. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`: el motor lo toma como fallback cuando el bloque de orden no tiene ningún `<field>`. | ### Atributos #### `ordenaTemporal` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Aplica el orden sobre la tabla temporal del grid en lugar de sobre la consulta original. Es lo que hace que un grid de carga respete el orden declarado en vez de mostrar los renglones en el orden en que se fueron cargando. **Cuidado si hay más de un bloque de orden en la misma tabla**: el valor se asigna al procesar cada bloque, así que gana el último y puede apagar el de un bloque anterior. ## `<orden>` Alias español de `<order>`, pero **sólo funciona en `<tabla_ex>` y `<ayuda_ex>`**. Dentro de un `<helper>` es **inerte**: ahí el motor busca únicamente `<order>` y no tiene fallback al español. Los 11 combos del repo que lo usan caen al orden por defecto (por el 2º campo del combo) y el síntoma es "el combo sale desordenado". En un `<helper>` usar `<order>`. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 1 (propios) Acepta los mismos 1 atributos y los mismos elementos hijos que [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order), que es donde están documentados. ## `<filters>` Filtros adicionales mostrados en la barra superior del listado. Recordar: un filtro debe declararse en `<filters>` Y como `<field>` (puede ser `oculto="true"`). Sólo se leen los `<field>`/`<campo>` hijos: un `<label>` o un `<tabla_ex>` colgado directo del bloque no genera ningún filtro. Y si en la misma tabla se escriben los dos tags, `<filters>` y `<filtros>`, la segunda lectura **resetea el `auto`** de la primera. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo de filtro (cada uno genera un input en la barra de filtros). | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`: el motor lee las dos grafías como filtro. | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | 0..n | Condición de procesamiento del bloque entero: es texto PHP que se evalúa antes de leer los filtros y, si da falso, el bloque no se procesa. | ### Atributos #### `auto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Con `auto="true"` los filtros se aplican solos al cambiar cualquier valor, sin botón "filtrar". La comparación es estricta contra el texto `true`: `1` no sirve. ## `<filtros>` Filtros adicionales mostrados en la barra superior del listado. Recordar: un filtro debe declararse en `<filters>` Y como `<field>` (puede ser `oculto="true"`). Sólo se leen los `<field>`/`<campo>` hijos: un `<label>` o un `<tabla_ex>` colgado directo del bloque no genera ningún filtro. Y si en la misma tabla se escriben los dos tags, `<filters>` y `<filtros>`, la segunda lectura **resetea el `auto`** de la primera. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 1 (propios) Acepta los mismos 1 atributos y los mismos elementos hijos que [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters), que es donde están documentados. ## `<condicion>` Condición SQL de un campo: operador + valor literal/expresión. Va al `WHERE`. El ruteo al `HAVING` lo decide el atributo `having` **del `<expression>` del campo** (o del propio `<field>`): escrito acá, sobre la `<condicion>`, no se lee — hay 7 XMLs con `<condicion having="true">` que no hacen nada. En `<helper>` de combo, las condiciones se aplican al SELECT del combo (NO soportan `'[__campo__]'` — usar `<actualiza>` para combo dinámico). Este mismo tipo se usa para la `<condition>` de un `<validation>`, que **no es SQL** sino una expresión JavaScript evaluada en el browser: ahí ni `operador` ni `valorde` se leen. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 4 (propios) ### Atributos #### `fixed` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Hace la condición **inmune al botón de limpiar filtros**: cuando el usuario resetea la barra de filtros, las condiciones normales se van y ésta queda. Sirve para las restricciones que son parte de la definición de la pantalla (una empresa, un estado, un tipo de comprobante) y que el usuario no debería poder sacar. #### `logic` texto · opcional Cómo se encadena esta condición con las anteriores del mismo campo. Por defecto todas se suman con `AND`; con `logic="OR"` esta condición se une con `OR` a la de arriba. Es la única forma declarativa de armar un `(a = 1 OR a = 2)` sin escribir el SQL a mano. #### `operador` [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) · opcional · default `=` Operador SQL: =, !=, <, >, <=, >=, like, in, between, is null, etc. Opcional: si se omite, el motor asume `=` (normaliza el operador vacío), por lo que omitirlo y escribir `operador="="` son equivalentes. #### `valorde` texto · opcional Toma el valor de otro campo del mismo form (`id`). Útil en JOINs y filtros dinámicos. ## `<condition>` Condición SQL de un campo: operador + valor literal/expresión. Va al `WHERE`. El ruteo al `HAVING` lo decide el atributo `having` **del `<expression>` del campo** (o del propio `<field>`): escrito acá, sobre la `<condicion>`, no se lee — hay 7 XMLs con `<condicion having="true">` que no hacen nada. En `<helper>` de combo, las condiciones se aplican al SELECT del combo (NO soportan `'[__campo__]'` — usar `<actualiza>` para combo dinámico). Este mismo tipo se usa para la `<condition>` de un `<validation>`, que **no es SQL** sino una expresión JavaScript evaluada en el browser: ahí ni `operador` ni `valorde` se leen. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) (1) - **Contenido:** texto libre. - **Atributos:** 4 (propios) Acepta los mismos 4 atributos que [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion), que es donde están documentados. ## `<operador>` Operador de la condición de filtro/JOIN del campo (=, !=, like, in, between, etc.). Acepta atributos `modificador` (modifica el valor antes de comparar) y `oplogico` (and/or para concatenar con el siguiente filtro). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto, de tipo [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) - **Atributos:** 2 (propios) ### Atributos #### `modificador` texto · opcional Modificador del operador: transforma el valor antes de comparar (ej. `UPPER`, `LOWER`, `DATE`). #### `oplogico` texto · opcional Operador lógico para concatenar con el siguiente filtro: "and" (default) | "or". ## `<operator>` Elemento `<operador>` (o alias `<operator>`) dentro de `<field>`. Contenido = operador SQL (`OperadorCondicion`); atributos opcionales `modificador` y `oplogico` para refinar el comportamiento del filtro. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto, de tipo [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) - **Atributos:** 2 (propios) Acepta los mismos 2 atributos que [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador), que es donde están documentados. ## `<preconsultas>` Bloque de pre-consultas/validaciones ejecutadas antes de la consulta principal. La forma canónica es `<xmlfile id="mi_consulta"/>` (69 usos en el repo): cada uno nombra otro XML que se ejecuta antes, y sus resultados quedan disponibles para la consulta de esta pantalla. Se usa para preparar datos —llenar una tabla temporal, recalcular un saldo— sin meter ese SQL en la consulta principal. El contenido está declarado permisivo a propósito, así que **acá el schema no valida nada**: un tag mal escrito adentro de este bloque no da error y simplemente no hace nada. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<tempTable>` Definición de tabla temporal usada como fuente del grid (típicamente en flujos de importación). La forma canónica es una lista de `<row>`, cada uno con los `<field>` de un renglón (315 usos en el repo): con eso se precarga el grid con renglones fijos sin que exista una tabla real detrás. También se acepta SQL de creación de la temporal. El contenido está declarado permisivo a propósito, así que **acá el schema no valida nada**: un tag mal escrito adentro de este bloque no da error y simplemente no hace nada. - **Va dentro de:** [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) (0..n), [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) Acepta los mismos 1 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar), que es donde están documentados. ## `<code>` Código del cuerpo del PDF, se ejecuta una vez al imprimir el contenedor. - **Va dentro de:** [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<footer>` Código que se ejecuta al dibujar cada pie de página. - **Va dentro de:** [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<header>` Código que se ejecuta al dibujar cada cabecera de página. - **Va dentro de:** [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<onRowClick>` JS a ejecutar al hacer clic en una fila de la grilla. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<pdf>` Impresión PDF con código embebido: `<header>`, `<code>` y `<footer>` se ejecutan como código PHP con la variable `$pdf` disponible, que apunta al objeto que dibuja el PDF — de ahí salen los métodos que se pueden llamar (`Cell`, `MultiCell`, `Image`, `SetFont`, `SetXY`…). **Los atributos de este tag se descartan**: `PDForientacion` / `PDForientation` escritos acá no hacen nada (146 XMLs del repo lo intentan) — la orientación va en el `<histrix>`. Y el bloque tiene que colgar del `<form>`/`<consulta>`: un `<code>` suelto dentro de `<table>` no se lee. - **Va dentro de:** [`<consulta>`](https://docs.histrix.com.ar/es/schema/consulta/#consulta) (0..n), [`<form>`](https://docs.histrix.com.ar/es/schema/consulta/#form) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<header>`](https://docs.histrix.com.ar/es/schema/consulta/#header) | 0..1 | Código que se ejecuta al dibujar cada cabecera de página. | | [`<code>`](https://docs.histrix.com.ar/es/schema/consulta/#code) | 0..1 | Código del cuerpo del PDF, se ejecuta una vez al imprimir el contenedor. | | [`<footer>`](https://docs.histrix.com.ar/es/schema/consulta/#footer) | 0..1 | Código que se ejecuta al dibujar cada pie de página. | No acepta atributos. ## `<select>` SELECT crudo que reemplaza la consulta que el motor armaría con los `<field>`. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<selectCode>` Bloque de código PHP que llena la grilla a mano, en lugar del SELECT que armaría el XML: se ejecuta al cargar los datos y tiene que dejar armado un arreglo con un elemento por renglón, y cada renglón como pares campo => valor. Si devuelve algo, ese contenido reemplaza por completo al resultado de la consulta. Dos trampas: **no corre si el contenedor tiene `dataSource`**, que tiene prioridad; y si el código falla, la grilla queda vacía sin ningún aviso en pantalla — el error va al log. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<status>` Una columna del tablero `tipo="kanban"`. Va como hijo directo de `<table>`, al lado de `<filters>` y `<order>`, y se declara una por cada valor del campo indicado en `statusField` que quiera verse. Las columnas se dibujan **en el orden de aparición**. Las filas cuyo estado no coincide con ninguna columna declarada no desaparecen: van a una columna "Sin clasificar" al final (ver `showOrphans` y `orphanLabel` en `<histrix>`). - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. - **Atributos:** 7 (propios) ### Atributos #### `color` texto · opcional Color CSS de la columna: pinta la línea superior del encabezado y el borde izquierdo de sus tarjetas. Un campo con `kanban="color"` lo pisa por tarjeta. #### `confirmDir` texto · opcional Directorio de `confirmXml`. **Obligatorio cuando hay `confirmXml`**: sin él el path no resuelve en varios contextos y el popup abre con "file not found" (la misma regla que el `dir` de los includes). Declararlo aunque apunte al directorio del propio XML. #### `confirmTitle` texto · opcional Título del modal de confirmación. Si no está, se usa el `label` de la columna. #### `confirmXml` texto · opcional XML que hay que completar para entrar a esta columna. **Sin este atributo el movimiento se graba directo**, como en el resto de las columnas. Con él, el tablero **no graba**: al soltar la tarjeta abre este XML como modal pasándole la clave de la tarjeta y el estado destino —los `<parameter>` prellenan el form del lado del servidor, así que la pantalla abre con el estado nuevo ya puesto— y **ese XML es el que graba**. Puede ser un `update` simple o una ficha con `<movimientos>`, que es justamente lo que el UPDATE plano del campo no puede hacer. Al cerrarse el modal el tablero recarga y acomoda cada tarjeta según el estado que tiene en la base: si se confirmó queda en la columna nueva, y si se canceló vuelve sola a donde estaba. El endpoint del movimiento rechaza estas columnas con `400`, así que la confirmación no se puede saltear pegándole a la API. **Es la forma de dar drag a un estado que es consecuencia de un proceso** (presupuesto → facturado, orden pendiente → cumplida): en vez de pisar el campo, se dispara la pantalla que hace el trabajo completo. #### `label` texto · opcional Título de la columna. Si no está, se muestra el `value`. #### `limit` `entero` · opcional Límite de trabajo en curso (WIP). Es **sólo visual**: el contador pasa a mostrar `usadas/limit` y se pinta en alerta al pasarse, pero no impide mover tarjetas a la columna. #### `value` texto · **obligatorio** Valor del campo `statusField` que cae en esta columna. **Obligatorio**, y no puede repetirse entre columnas: las dos cosas se reportan como error de configuración en pantalla. Es también el único destino válido de un drop — arrastrar a la columna de huérfanos se rechaza con 400. ## `<table>` en `<join>` Tabla referenciada en el JOIN. Puede ser una tabla real o un `<subquery>` aliasado. - **Va dentro de:** [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) (0..n) - **Atributos:** 2 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 1..n | Campos de la tabla joineada con sus condiciones ON. | ### Atributos #### `as` texto · opcional Alias SQL de la tabla en el JOIN. #### `id` texto · **obligatorio** Nombre de la tabla joineada. ## `<tabla>` en `<join>` Tabla joineada (alias español). Un `<join>` puede contener múltiples tablas joineadas en cadena. - **Va dentro de:** [`<join>`](https://docs.histrix.com.ar/es/schema/consulta/#join) (0..n) - **Atributos:** 2 (propios) Acepta los mismos 2 atributos y los mismos elementos hijos que [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table-en-join), que es donde están documentados. ## `<campo>` en `<orden>` Alias español de `<field>`: el motor lo toma como fallback cuando el bloque de orden no tiene ningún `<field>`. - **Va dentro de:** [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) (0..n), [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) (0..n) - **Contenido:** texto libre. - **Atributos:** 5 (propios) Acepta los mismos 5 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-orden), que es donde están documentados. ## `<campo>` en `<subquery>` Campo que define una condición ON del JOIN. La `<condicion>` con `valorde="campo"` referencia un campo de la tabla principal para armar el `ON tabla_join.x = tabla_principal.y`. - **Va dentro de:** [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) (0..n) - **Atributos:** 5 (propios) Acepta los mismos 5 atributos y los mismos elementos hijos que [`<field>`](https://docs.histrix.com.ar/es/schema/consulta/#field-en-subquery), que es donde están documentados. ## `<field>` en `<orden>` Campo por el que ordenar. Si tiene `<expression>`, se ordena por esa expresión SQL. - **Va dentro de:** [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) (0..n), [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) (0..n) - **Contenido:** texto libre. - **Atributos:** 5 (propios) ### Atributos #### `id` texto · **obligatorio** `id` del campo por el que ordenar. #### `orderType` [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) · opcional Dirección de orden (inglés). Coexiste con `tipoOrden`; el motor lee ambos. #### `tabla` texto · opcional Tabla del campo (cuando ambiguo en JOINs). #### `table` texto · opcional Alias inglés de `tabla`. #### `tipoOrden` [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) · opcional · default `ASC` Dirección de orden. Alias inglés: `orderType`. ## `<field>` en `<subquery>` Campo que define una condición ON del JOIN. La `<condicion>` con `valorde="campo"` referencia un campo de la tabla principal para armar el `ON tabla_join.x = tabla_principal.y`. - **Va dentro de:** [`<subquery>`](https://docs.histrix.com.ar/es/schema/consulta/#subquery) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (1..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (1..n) - **Atributos:** 5 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion) | 0..n | Condición del JOIN (operador + valor o referencia a otro campo). | | [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | 0..n | Alias inglés de `<condicion>`. | | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression) | 0..n | Expresión SQL alternativa para el campo del JOIN. | | [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) | 0..n | Alias español de `<expression>`. | | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | 0..n | Etiqueta del campo en pantalla (si se muestra). | | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | 0..n | Tipo del campo del JOIN. | ### Atributos #### `alias` texto · opcional Alias SQL del campo. #### `id` texto · **obligatorio** Nombre de la columna en la tabla del JOIN. #### `noshow` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Alias inglés de `oculto`. #### `oculto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", oculta el campo en pantalla. #### `tabla` texto · opcional Tabla a la que pertenece el campo (cuando ambiguo). ------------------------------------------------------------------------------ ## Campos: <field> URL: https://docs.histrix.com.ar/es/schema/campos/ El elemento con más atributos del schema: definición, presentación y comportamiento de cada campo. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: `<field>` —o `<campo>`, su alias— es el elemento central de cualquier XML: define una columna de la consulta, su presentación y su comportamiento. `<fieldGroup>` agrupa campos y **copia sus atributos a cada campo hijo**, así que casi todo lo que vale en un campo vale también en el grupo. ## `<field>` Campo de formulario o columna de grid/consulta. Es el bloque fundamental: representa una columna SQL, un campo local (`local="true"`), un valor calculado (`<expression>`) o un control de UI sin persistencia. Aliases del tag: `<field>` (canónico) y `<campo>` (español). - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) (0..n), [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) (0..n), [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) (0..n), [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 218 (32 propios y 186 heredados de grupos) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | 0..n | Etiqueta legible del campo (header de columna o label del input). | | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression) | 0..n | Expresión SQL para valores calculados. Va al SELECT (o HAVING si hay GROUP BY). | | [`<expresion>`](https://docs.histrix.com.ar/es/schema/campos/#expresion) | 0..n | Alias español de `<expression>`. | | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | 0..n | Tipo del campo (date, numeric, check, file, geoPoint, etc.). | | [`<formato>`](https://docs.histrix.com.ar/es/schema/campos/#formato) | 0..n | Formato de visualización (ej. "dd/mm/yyyy" en fechas, "#.##0,00" en numéricos). | | [`<format>`](https://docs.histrix.com.ar/es/schema/campos/#format) | 0..n | Alias inglés de `<formato>`. | | [`<size>`](https://docs.histrix.com.ar/es/schema/campos/#size) | 0..n | Tamaño visual del input o ancho de columna. | | [`<maxsize>`](https://docs.histrix.com.ar/es/schema/campos/#maxsize) | 0..n | Máximo de caracteres del input (atributo HTML `maxlength`). | | [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) | 0..n | Parámetros pasados al XML referenciado por `obj`/`linkint` (popups, helpers de tipo "parameter"). | | [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) | 0..n | Lista de opciones fijas para radio/select (no dependen de SQL). | | [`<opciones>`](https://docs.histrix.com.ar/es/schema/helpers/#opciones) | 0..n | Alias español de `<options>`. | | [`<help>`](https://docs.histrix.com.ar/es/schema/campos/#help) | 0..n | Texto de ayuda contextual del campo (tooltip). | | [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) | 0..n | Helper UI: combo dinámico, link a otro XML, popup de ayuda, grilla embebida, etc. | | [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) | 0..n | Tabla externa (legacy). Equivalente a `<helper type="object">` o `<ayuda_ex>`. | | [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) | 0..n | Helper popup de ayuda inline (combo o lookup). | | [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) | 0..n | Ayuda externa (popup completo desde otro XML). | | [`<valor>`](https://docs.histrix.com.ar/es/schema/campos/#valor) | 0..n | Valor por defecto del campo. Con `eval="true"` se evalúa como PHP (ej. `date('d/m/Y')`). | | [`<operador>`](https://docs.histrix.com.ar/es/schema/consulta/#operador) | 0..n | Operador de la condición de filtro/JOIN del campo (=, !=, like, in, between, etc.). | | [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) | 0..n | Alias inglés de `<operador>`. | | [`<condicion>`](https://docs.histrix.com.ar/es/schema/consulta/#condicion) | 0..n | Condición SQL del campo. Va al WHERE (o HAVING si `having="true"`/hay GROUP BY). | | [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | 0..n | Alias inglés de `<condicion>`. | | [`<attribute>`](https://docs.histrix.com.ar/es/schema/campos/#attribute) | 0..n | **El texto del tag no es un valor: es el `id` de otro campo.** El motor copia el valor de ese otro campo a la propiedad Histrix que nombra el… | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | 0..n | Condicional `<if exp="..."><true>X</true><false>Y</false></if>`. | | [`<setvar>`](https://docs.histrix.com.ar/es/schema/campos/#setvar) | 0..n | Guarda el valor del campo en una propiedad del contenedor de esa instancia, con el nombre que dice el texto del tag. | | [`<detalle>`](https://docs.histrix.com.ar/es/schema/campos/#detalle) | 0..n | Nombre lógico del campo destino al volver de un popup hijo (mecanismo `<importar resume>`). | | [`<prefijo>`](https://docs.histrix.com.ar/es/schema/raiz/#prefijo) | 0..n | Texto que se antepone al valor del campo al renderizar (en pantalla y PDF). | | [`<habilita>`](https://docs.histrix.com.ar/es/schema/campos/#habilita) | 0..n | **Está al revés de lo que sugiere el nombre**: el texto del tag es el `id` del campo *controlador*, y el que se habilita o deshabilita es **el campo… | | [`<jseval>`](https://docs.histrix.com.ar/es/schema/interaccion/#jseval) | 0..n | Evaluación JS al cambiar el campo. Resultado va al `campodestino`. | | [`<visibleWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#visiblewhen) | 0..n | Muestra u oculta **este** campo según una condición: el tag va sobre el campo controlado, no sobre el que dispara la condición. | | [`<requiredWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#requiredwhen) | 0..n | Hace obligatorio **este** campo mientras se cumpla la condición, y le saca la marca cuando deja de cumplirse. | | [`<enabledWhen>`](https://docs.histrix.com.ar/es/schema/interaccion/#enabledwhen) | 0..n | Habilita **este** campo mientras se cumpla la condición y lo deshabilita cuando deja de cumplirse. | | [`<eval>`](https://docs.histrix.com.ar/es/schema/interaccion/#eval) | 0..n | **No es JavaScript: es PHP que corre server-side al parsear el XML**, y decide si el campo existe. | | [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam) | 0..n | Condición pre-filtrado aplicada a este campo antes de la query principal. | | [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) | 0..n | Configura popup hijo que alimenta el grid via este campo. | | [`<actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#actualiza) | 0..n | Al cambiar este campo, envía su valor a otros campos/combos/grids/helpers (refrescos en cascada). | | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) | 0..n | Alimenta con una **condición SQL** al contenedor embebido del campo (el que abre `obj` / `linkint` / el helper). | | [`<jsfunction>`](https://docs.histrix.com.ar/es/schema/interaccion/#jsfunction) | 0..n | Función JS asociada a un evento del campo (onfocus, onblur, onkeypress...). | | [`<pdfancho>`](https://docs.histrix.com.ar/es/schema/campos/#pdfancho) | 0..n | Ancho de la columna del **valor** en la ficha impresa. Su contraparte para la etiqueta es el atributo `size` del `<label>`. | | [`<complete>`](https://docs.histrix.com.ar/es/schema/campos/#complete) | 0..n | Expresión que el motor evalúa al completarse el campo. Ej: `<complete>numero + 1</complete>`. | | [`<checklabel>`](https://docs.histrix.com.ar/es/schema/campos/#checklabel) | 0..n | Etiqueta que acompaña al checkbox, a la derecha del control. | | [`<htmllabel>`](https://docs.histrix.com.ar/es/schema/campos/#htmllabel) | 0..n | Texto alternativo del encabezado de columna, y **sólo se usa cuando la etiqueta normal está vacía**. | | [`<conditionalDisplay>`](https://docs.histrix.com.ar/es/schema/campos/#conditionaldisplay) | 0..n | **No es una expresión: es el `id` de otro campo.** Si el valor de ese campo es falsy, este campo no se renderiza. | | [`<onformchange>`](https://docs.histrix.com.ar/es/schema/campos/#onformchange) | 0..n | Código a ejecutar cuando cambia cualquier campo del form. | | [`<pdf>`](https://docs.histrix.com.ar/es/schema/consulta/#pdf) | 0..n | **Código PHP que reemplaza el dibujado de este campo en el PDF.** El contenido se ejecuta al imprimir la celda y, si devuelve algo, ese valor se usa… | ### Atributos #### Identificación y datos ##### `id_int` texto · opcional Campo interno asociado. ##### `id_cont` texto · opcional Contenedor interno asociado. ##### `obj` texto · opcional Nombre del XML referenciado como objeto embebido (grid hijo o ficha link). ##### `objdir` texto · opcional Directorio del XML referenciado por `obj`. Con barra inicial (`/carpeta`) **reemplaza** el subdirectorio vigente; sin barra se concatena a él. ##### `path` texto · opcional Directorio de lectura/subida de los archivos de este campo (`file`, `files`, `dir`), que se concatena al del contenedor. En los adjuntos del PDF (`attach="true"`) puede además nombrar una columna: en ese caso ese tramo de la ruta sale del valor de la columna en cada fila. #### Visibilidad y estado ##### `showObjTabla` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Muestra dentro de la celda la grilla del contenedor embebido del campo (el que trae `obj`). Con esa grilla visible, el valor propio del campo se muestra sólo si además lleva `showValor`. Combinado con `lazyLoad="true"` difiere la carga. ##### `invalid` texto · opcional Motivo que se muestra cuando el campo no valida. Trabaja junto a `validar="true"`: si el valor del campo (o su último valor grabado) no es `true` ni `1`, el botón de procesar queda deshabilitado y este texto es el tooltip que explica por qué. Es un **atributo**: escrito como elemento (`<invalid>…</invalid>`) el mensaje no se muestra nunca. #### Clave y grabación ##### `forceUpdate` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", incluye el campo en el UPDATE aunque su valor no haya cambiado respecto al original. ##### `valop` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Nada que ver con filtros opcionales, y sólo hace algo con el literal "true": las `<options>` del campo **dejan de aplicarse al armar el input** (el combo sale sin opciones) y el valor de cada fila se traduce por el texto de la opción al recorrer el resultado. Alcanza con un campo con `valop` para que el contenedor procese el resultado fila por fila. ##### `acumula` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` La celda **muestra el acumulado** de la columna hasta esa fila en lugar del valor propio de la fila (y recibe la clase de celda sumada). Exige el literal "true", y necesita que el campo lleve además `suma="true"`: sin la suma el acumulado no se calcula y la columna sale en `0`. Con `norepeat` no acumula. ##### `setOriginalValue` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Con el literal "true", al restaurar el campo se vuelve al **valor original del registro** aun cuando `valauto="true"` mandaría a conservar el `<valor>` declarado. Sin este atributo la restauración ya ocurre con `valauto` en "false", que es el comportamiento por omisión: sólo hace falta para ganarle a un `valauto="true"`. ##### `log` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Decide si los cambios de **este campo** entran a la auditoría. **Está al revés de lo que sugiere el nombre**: con el atributo ausente el campo **se audita** igual, y el único valor con efecto es `log="false"`, que lo excluye. La auditoría además tiene que estar prendida en el contenedor: con `<histrix log="false">` no se audita ningún campo. #### Validación ##### `required` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Campo obligatorio. El form no graba si está vacío. **Sin `default` declarado a propósito**: el motor lo evalúa con dos criterios a la vez — hay lecturas que tratan la **ausencia** como obligatorio (comparan contra `'false'`) y otras que exigen el literal "true". Conviene ponerlo siempre explícito. Ojo: es un **atributo**; escrito como elemento (`<required>true</required>`) no lo lee nadie y el campo no queda obligatorio. ##### `validRow` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Convierte al campo en validador de la fila: si su valor es `0`, la fila se descarta y no graba. **El motor sólo mira si el atributo está presente, no su valor**, así que `validRow="false"` lo activa igual y el `default="false"` de esta declaración es engañoso: para no validar hay que **omitir** el atributo. ##### `checkType` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` **No valida tipos, y viene activo.** Sólo aplica a campos `tipo="date"`: prendido — que es lo que pasa cuando el atributo falta — convierte un valor de 8 dígitos `ddmmyyyy` en fecha. El único valor útil es `checkType="false"`, que desactiva esa conversión; el `default="false"` de esta declaración es engañoso. Nada de esto valida números. #### SQL y consulta ##### `search` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", el campo participa de la búsqueda aunque tenga opciones cargadas (se lo consulta al re-aplicar las condiciones de la consulta). Va en el `<field>`: escrito en el `<helper>` queda en el helper, donde no lo lee nadie. ##### `orderName` texto · opcional Nombre de columna o expresión que se usa en el `ORDER BY` en lugar del campo. Es la forma de ordenar por un campo calculado o por otra columna que la mostrada — el `<expression>` escrito dentro de un `<field>` de `<order>` no se lee. ##### `tipoOrden` [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) · opcional · default `ASC` Dirección de orden del campo. `orderType` es el nombre inglés pero **no son alias simétricos**: el motor toma el primero que esté seteado, así que con los dos declarados gana `tipoOrden`. Y el reordenamiento en memoria de la tabla temporal reconoce **sólo `DESC` en mayúsculas**: con `tipoOrden="desc"` la consulta sale ordenada y la tabla temporal no. ##### `customTotal` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Con el literal "true" la celda de total del pie **no suma la columna**: el número sale de evaluar el `<if>` del campo sobre la fila de totales. Es la forma de armar un total que depende de otros totales (un porcentaje, un neto), y necesita que el campo tenga `<if>`: de ahí saca el valor. ##### `valauto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", al renderizar nuevo registro el `<valor>` se aplica como valor (vs sólo como default). #### Estilo y presentación ##### `labelStyle` texto · opcional CSS inline de la etiqueta del campo, incluida la del checkbox. El motor lo lee junto con `Formstyle` y toma el primero que esté seteado: **si el campo declara los dos, gana `Formstyle`**. Se acepta también como atributo del `<label>`, donde escribe la misma propiedad. #### Interacción entre campos ##### `retroalimenta` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No tiene nada que ver con popups ni con devolverle valores al padre.** Convierte el resultado del `<if>` del campo en un **acumulado fila a fila** (un running total que arranca de nuevo en la fila 0) y desplaza la suma normal de la columna. ##### `refresh` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Sólo actúa en campos de un contenedor embebido, y sólo con el literal "true": al cambiar el valor recarga la cabecera del formulario y dispara la grabación del contenedor de origen. **No es el mecanismo para refrescar campos dependientes** — eso lo dispara el campo de origen con `<actualiza>`. ##### `preventLoop` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Va en el campo **destino** de un `<jseval>`: cuando el cálculo le escribe un valor nuevo no se dispara su evento `change`, así que los `<jseval>` que dependen de él no se recalculan y la cascada se corta ahí. Sólo lo activa el literal "true". ##### `bloqueafila` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Con el literal "true", las filas en las que **el valor de este campo sea `1` o `true`** quedan bloqueadas: se marcan como no editables y se pintan grisadas. Con cualquier otro valor en la celda, la fila queda normal. ##### `clasefila` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` El **valor del campo en cada fila** se agrega como clase CSS del `<tr>`; si hay varios campos marcados, se concatenan. **Cualquier valor no vacío lo activa, incluido "false"**: para desactivarlo hay que omitir el atributo. ##### `autocompletar` [`ModoAutocompletado`](https://docs.histrix.com.ar/es/schema/tipos/#modoautocompletado) · opcional Alias español de `autocomplete`, y **no es el atributo HTML del input**: es el modo del helper de ayuda del campo. Los valores con efecto son "true" (autocompletado sobre el input) y "full" (autocompletado + popup de la ayuda); `on`/`off` no prenden ni apagan nada. Sin helper de ayuda declarado no hace nada. ##### `valoropcion` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", al grabar usa el VALUE de la opción seleccionada del combo, no el texto visible. #### Enlaces ##### `linkdir` texto · opcional Directorio del XML al que apunta `linkint`. Si falta, se usa el directorio del XML del contenedor. ##### `linkint` texto · opcional Nombre del XML interno al que linkea el campo (genera link clickable). En un campo con `attach="true"` cumple una segunda función: lo que se adjunta al PDF no es un archivo del disco sino **el PDF generado por ese XML**. ##### `attach` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Al generar el PDF adjunta un archivo por cada renglón, usando **el valor del campo** como nombre. La ruta se arma con el directorio de datos, el `path` del contenedor y el `path` del campo — que puede nombrar una columna, en cuyo caso ese tramo sale del valor de la fila. Si el archivo no existe **no adjunta nada y no avisa**. Con `watermark` el nombre visible del adjunto se toma de otra columna, y con `linkint` en vez de buscar un archivo se genera el PDF de ese XML y se adjunta ése. Sólo actúa con el literal "true". #### Exportación ##### `encode` texto · opcional Simbología del código de barras cuando el campo dibuja un código: el valor se pasa tal cual al generador. Si falta se usa `int25` (Interleaved 2 of 5). El valor en uso en el repo es "QR". **No confundir con el `encode` del `<tipo>`**, que es otra cosa: ahí define el algoritmo de encriptación y sólo se mira con `Type="password"`. ### Grupos de atributos que acepta Acepta además los 186 atributos de [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags), [`idGrup`](https://docs.histrix.com.ar/es/schema/grupos/#idgrup), [`CalendarGrup`](https://docs.histrix.com.ar/es/schema/grupos/#calendargrup), [`KanbanGrup`](https://docs.histrix.com.ar/es/schema/grupos/#kanbangrup). ## `<campo>` Campo de formulario o columna de grid/consulta. Es el bloque fundamental: representa una columna SQL, un campo local (`local="true"`), un valor calculado (`<expression>`) o un control de UI sin persistencia. Aliases del tag: `<field>` (canónico) y `<campo>` (español). - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) (0..n), [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) (0..n), [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) (0..n), [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<parametro>`](https://docs.histrix.com.ar/es/schema/helpers/#parametro) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 218 (32 propios y 186 heredados de grupos) Acepta los mismos 218 atributos y los mismos elementos hijos que [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), que es donde están documentados. ## `<fieldGroup>` Agrupador visual/lógico de campos. Se renderiza en el orden de aparición. Los `<field>` sueltos (fuera de cualquier fieldGroup) se renderizan al final del form. Con `xml="..."` + `dir="..."` incluye un XML externo como fieldGroup (resuelto server-side). Útil para compartir campos entre formularios (ej. datos de agente de retención compartidos entre IG e IB). - **Va dentro de:** [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 169 (5 propios y 164 heredados de grupos) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) | 0..n | Inclusión condicional del fieldGroup. | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo dentro del grupo. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`. | | [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) | 0..n | Validación de formulario declarada dentro del grupo. **Sólo se registra si el `<if>` del grupo dio verdadero**, y por eso es la forma de declarar una… | | [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) | 0..n | Proceso de cierre declarado dentro del grupo. Igual que la `<validation>` de acá: sólo se registra si el `<if>` del grupo dio verdadero. | ### Atributos #### `dir` texto · opcional Directorio del XML externo. #### `id` texto · opcional Identificador del grupo (sirve para targeting CSS y referencias). #### `label` texto · opcional Etiqueta del grupo (header del fieldset). #### `valauto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Aplica `valauto` a todos los campos del grupo. #### `xml` texto · opcional Nombre del XML externo a incluir como fieldGroup (resuelto server-side). ### Grupos de atributos que acepta Acepta además los 164 atributos de [`UiFlags`](https://docs.histrix.com.ar/es/schema/grupos/#uiflags). ## `<label>` Etiqueta legible del campo (header de columna o label del input). Se usa también como clave en logs de auditoría. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 47 (14 propios y 33 heredados de grupos) ### Atributos #### `colspan` `entero` · opcional Sin descripción en el schema. #### `colstyle` texto · opcional Sin descripción en el schema. #### `Formstyle` texto · opcional Sin descripción en el schema. #### `formStyle` texto · opcional Sin descripción en el schema. #### `getStyle` texto · opcional Sin descripción en el schema. #### `labelStyle` texto · opcional CSS de la etiqueta. El motor lo lee junto con `Formstyle` al armar el `<label>` y su celda, y también lo aplica a la etiqueta de un checkbox. Se puede escribir acá o en el `<field>`: los atributos del `<label>` se copian al mismo campo. #### `modpos` texto · opcional Modificador de posición. El valor que el motor entiende es `nobr`: con `modpos="nobr"` la etiqueta o el campo no pasa al renglón siguiente — vale en el ABM, en los `ing` con `subtipo="vertical"`, en la barra de filtros, en el PDF y en la planilla exportada. Es la forma canónica, con ~15.000 usos. **`nobr` es el valor de este atributo, no un atributo en sí**: escribir `nobr="true"` no hace nada, no se declara a propósito. #### `pdfancho` texto · opcional Ancho de la celda del valor en la ficha impresa. Misma propiedad que `PDFancho` acá y que el `<pdfancho>` del campo — ver la doc de `pdfancho` en `UiFlags`. #### `PDFancho` texto · opcional Ancho de la celda del **valor** en la ficha impresa. Es el único lugar donde esta grafía funciona: el renombre que la habilita se aplica **sólo** al tag `<label>`. Escrita en el `<field>` no la lee nadie — ahí va `pdfancho` en minúscula — y hay unos 250 usos de `PDFancho` en `<field>` que no hacen nada. #### `rowspan` `entero` · opcional Sin descripción en el schema. #### `sincelda` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Sin descripción en el schema. #### `size` `número` · opcional Sin descripción en el schema. #### `style` texto · opcional Sin descripción en el schema. #### `xml` texto · opcional Convierte la etiqueta en un link que abre otro XML: el valor es el XML destino. Sirve para colgar una pantalla de consulta o de configuración del propio título del campo, sin gastar una columna ni un botón. ### Grupos de atributos que acepta Acepta además los 33 atributos de [`pdfGrup`](https://docs.histrix.com.ar/es/schema/grupos/#pdfgrup). ## `<tipo>` Tipo del campo (date, numeric, check, file, geoPoint, etc.). Determina render y validación. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto, de tipo [`CampoTipo`](https://docs.histrix.com.ar/es/schema/tipos/#campotipo) - **Atributos:** 4 (propios) ### Atributos #### `aletras` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Imprime el importe en letras. **El motor lo evalúa por presencia y con comparación laxa: `aletras="false"` ENCIENDE la conversión igual** — cualquier valor no vacío la prende. Para no convertir hay que **omitir** el atributo; el `default="false"` de esta declaración es engañoso. #### `encode` texto · opcional Algoritmo con el que se encripta el valor, y **sólo se consulta cuando el `<tipo>` lleva `Type="password"`**. Valores reconocidos: `encrypt` y `plain`; **cualquier otro valor, o la ausencia del atributo, aplica `md5()`**. No confundir con el `encode` del `<field>`, que es la simbología del código de barras. #### `Type` texto · opcional El único valor con efecto es `password`: hace que el campo se trate como contraseña y habilita la encriptación del valor (ver `encode`). Cualquier otro valor es inerte, incluido `Type="Image"`, que es el más escrito del repo y no hace nada. Va con **T mayúscula**: escrito `type` no lo lee nadie. #### `url` texto · opcional Prefijo de ruta/URL de los archivos del campo (`file`/`files`): se antepone al `path` del contenedor para leer el archivo y para armar el link de descarga. ## `<expression>` Expresión SQL para valores calculados. Va al SELECT (o HAVING si hay GROUP BY). Soporta `'[__campo__]'` para inyectar valores de campos locales. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 2 (propios) ### Atributos #### `having` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional · default `false` Sin descripción en el schema. #### `sql` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Sin descripción en el schema. ## `<expresion>` Expresión (SQL) para valores calculados. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 2 (propios) Acepta los mismos 2 atributos que [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression), que es donde están documentados. ## `<valor>` Valor por defecto del campo. Con `eval="true"` se evalúa como PHP (ej. `date('d/m/Y')`). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 3 (propios) ### Atributos #### `default` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", se aplica sólo como default (no pisa valor existente al editar). #### `eval` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", el contenido se evalúa como expresión PHP en el server. #### `retval` texto · opcional **Sólo tiene sentido junto a `eval="true"`.** Sin `retval`, el contenido tiene que ser una expresión PHP que devuelva el valor. Con `retval`, el contenido se ejecuta como una secuencia de sentencias (se pueden declarar variables, hacer un `if`, un loop) y `retval` nombra la variable de la que sale el valor final. Además, con `retval` **no se hace la sustitución de `[__campo__]`** en el cuerpo: el código llega tal cual se escribió. ## `<value>` Valor literal contra el que comparar, como alternativa a `<expression>`. Con `eval="true"` el contenido se evalúa como PHP. - **Va dentro de:** [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) ### Atributos #### `eval` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Sin descripción en el schema. ## `<values>` Valores posibles de un parámetro (`type="parameter"`), para que el panel los ofrezca como lista en lugar de un texto libre. Dos formas, excluyentes: con `xml` (+ `dir` y `<parameter>` opcionales) los valores salen de una consulta; sin `xml`, se enumeran a mano con `<value id="...">`. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Atributos:** 2 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) | 0..n | Valor fijo: el `id` es lo que se guarda, el texto lo que se muestra. | | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | 0..n | Parámetro que se pasa al XML de `values` (pares `name`/`value`). | ### Atributos #### `dir` texto · opcional Directorio del XML de valores. #### `xml` texto · opcional XML que provee los valores. Si está, se ignoran los `<value>` fijos. ## `<size>` Tamaño visual del input o ancho de columna. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<help>` Texto de ayuda contextual del campo (tooltip). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<detalle>` Nombre lógico del campo destino al volver de un popup hijo (mecanismo `<importar resume>`). El padre matchea por este nombre. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<attribute>` **No inyecta HTML: hace condicional un atributo de Histrix según el valor de otra columna.** El `id` es el nombre del atributo Histrix que se va a setear en este campo (`print`, `noshow`, `oculto`, `linkint`…) y **el texto del tag es el `id` de otro campo**, cuyo valor se copia en ese atributo. Ejemplo real: `<attribute id="print">muestra_iva</attribute>` — el campo se imprime o no según lo que traiga la columna `muestra_iva` en la fila. Si el campo nombrado no existe o viene sin valor, el atributo queda vacío (o sea, apagado). Para `data-*` o `aria-*` no sirve. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) Acepta los mismos 1 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar), que es donde están documentados. ## `<set>` Inyecta una propiedad arbitraria en el contenedor embebido del helper: el `id` es el nombre de la propiedad y el texto del tag es el valor. Es la única vía declarativa para setear algo que el helper no expone como atributo, y por eso mismo no hay validación posible del nombre ni del valor: lo que se escriba se asigna tal cual. Funciona en los combos y en `type="external"`. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) Acepta los mismos 1 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar), que es donde están documentados. ## `<checklabel>` Etiqueta que acompaña al checkbox, a la derecha del control. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<complete>` Expresión que el motor evalúa al completarse el campo. Ej: `<complete>numero + 1</complete>`. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<conditionalDisplay>` **No es una expresión: es el `id` de otro campo.** Si el valor de ese campo es falsy, este campo no se renderiza. Si el `id` no existe en el XML la búsqueda devuelve falso y el render **revienta con error**, así que el nombre tiene que estar declarado como `<field>` (puede ser `noshow="true"`). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<format>` Alias inglés de `<formato>`. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<formato>` Formato de visualización (ej. "dd/mm/yyyy" en fechas, "#.##0,00" en numéricos). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<habilita>` **Está al revés de lo que sugiere el nombre**: el texto del tag es el `id` del campo *controlador*, y el que se habilita o deshabilita es **el campo que declara `<habilita>`**. Escribirlo como dice el nombre deshabilita el campo equivocado. Se resuelve server-side al renderizar (no hay handler JS) y mira el **último valor grabado** del controlador, no lo que el usuario acaba de tipear. Cuentan como falso sólo `0`, `'0'`, `'false'` y `false`. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<htmllabel>` Texto alternativo del encabezado de columna, y **sólo se usa cuando la etiqueta normal está vacía**. Ojo con el nombre: el único camino que lo renderiza **escapa el HTML**, así que los tags salen a la vista como texto en vez de aplicarse. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<maxsize>` Máximo de caracteres del input (atributo HTML `maxlength`). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<onformchange>` Código a ejecutar cuando cambia cualquier campo del form. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<pdfancho>` Ancho de la columna del **valor** en la ficha impresa. Su contraparte para la etiqueta es el atributo `size` del `<label>`. También se puede fijar con `PDFancho` en el `<label>`, que escribe la misma propiedad. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<setvar>` Guarda el valor del campo en una propiedad del contenedor de esa instancia, con el nombre que dice el texto del tag. **No es una variable de sesión**: vive lo que vive la instancia. La contracara para leerla es `<getvar>`, que este schema no declara. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<expression>` en `<field>` SELECT cuyo resultado se compara con el valor del campo. Soporta `'[__campo__]'` para interpolar otros campos del form. - **Va dentro de:** [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<value>` en `<values>` Valor fijo: el `id` es lo que se guarda, el texto lo que se muestra. - **Va dentro de:** [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) Acepta los mismos 1 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/grabacion/#field-en-importar), que es donde están documentados. ## `<if>` en `<fieldGroup>` Condición de procesamiento del bloque entero: es texto PHP que se evalúa antes de leer los filtros y, si da falso, el bloque no se procesa. **No es el `<if>` de un campo**: no lleva `exp` ni ramas `<true>`/`<false>`, y su resultado no es un valor sino un sí/no sobre si el bloque existe. - **Va dentro de:** [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) (0..n), [`<filters>`](https://docs.histrix.com.ar/es/schema/consulta/#filters) (0..n), [`<filtros>`](https://docs.histrix.com.ar/es/schema/consulta/#filtros) (0..n), [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<operator>` en `<field>` Operador de comparación (`==`, `!=`, ...). Default `==`. Suele ir en CDATA cuando lleva `<` o `>`. - **Va dentro de:** [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<parameter>` en `<values>` Parámetro que se pasa al XML de `values` (pares `name`/`value`). - **Va dentro de:** [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) (0..n) - **Contenido:** texto libre. - **Atributos:** 2 (propios) ### Atributos #### `name` texto · **obligatorio** Sin descripción en el schema. #### `value` texto · opcional Sin descripción en el schema. ## `<pdf>` en `<campo>` **Código PHP que reemplaza el dibujado de este campo en el PDF.** El contenido se ejecuta al imprimir la celda y, si devuelve algo, ese valor se usa en lugar del render normal del campo. Con esto se resuelven celdas que el motor no sabe dibujar (un código de barras, una imagen calculada, un bloque con formato propio). **Es ejecución de código arbitrario dentro del XML**: cualquiera que pueda editar el XML puede correr PHP en el servidor. Usarlo sólo si no hay alternativa declarativa, y tener en cuenta que un error de sintaxis acá tira abajo la impresión entera, no sólo la celda. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ------------------------------------------------------------------------------ ## Helpers y combos URL: https://docs.histrix.com.ar/es/schema/helpers/ Ayudas, combos, enlaces a otros XML y contenedores embebidos. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Un helper agrega a un campo una ayuda de búsqueda, un combo, un enlace a otro XML o un contenedor embebido. El atributo `type` decide cuál, y de él dependen qué otros atributos tienen efecto. ## `<helper>` Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field = texto visible). - "comboex": **idéntico a "combo"** — el motor los atiende con la misma rama. - "link": botón/icono que abre otro XML como popup (consulta, ficha, fichaing). - "external": ayuda que abre una tabla popup para elegir un registro. - "parameter": parámetro de configuración editable desde el panel nativo de parámetros. - "object": grilla/ficha embebida inline en el campo (no popup). - "inline": contenedor embebido, misma rama que "object" y "tags". - "tags": campo de etiquetas múltiples, misma rama que "object". - "media": botón que abre la imagen/archivo del campo. - "import": trae datos de otro XML al form. **Este complexType valida cuatro elementos distintos**: `<helper>` y las formas legacy `<tabla_ex>`, `<ayuda>` y `<ayuda_ex>`. Por eso hay hijos y atributos declarados acá que sólo tienen efecto en uno de los cuatro — y por eso cada declaración aclara en qué forma y en qué `type` se lee. Un atributo escrito en el `type` equivocado se descarta sin aviso. Las `<condicion>` SQL del combo NO soportan `'[__campo__]'` directamente — usar `<actualiza>` desde el form padre + `<detalle>` para alimentar el combo dinámicamente. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 24 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo del helper (columna del combo o filtro de la ayuda). | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`. El motor lo toma como fallback cuando no hay `<field>`, pero sólo en `<tabla_ex>` y `<ayuda_ex>`, las formas legacy… | | [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) | 0..n | Opción fija del combo (no proviene de SQL). | | [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) | 0..n | Ordenamiento del combo/helper. | | [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) | 0..n | Alias español de `<order>`, pero **sólo funciona en `<tabla_ex>` y `<ayuda_ex>`**. | | [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label) | 0..n | Etiqueta del **parámetro**: se lee sólo en `type="parameter"` y es el nombre con el que el parámetro aparece en el panel nativo de parámetros. | | [`<defaultValue>`](https://docs.histrix.com.ar/es/schema/helpers/#defaultvalue) | 0..n | Valor por defecto del **parámetro de configuración**, no del combo: se lee sólo en `type="parameter"` y es el valor que toma el parámetro mientras… | | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | 0..n | Parámetro pasado del padre al XML del helper. Source = campo del padre, target = campo en el XML hijo. | | [`<clave>`](https://docs.histrix.com.ar/es/schema/helpers/#clave) | 0..n | Campo que aporta la clave de la ayuda. **Sólo se lee dentro de `<ayuda_ex>`**, una de las formas legacy que comparten este complexType. | | [`<key>`](https://docs.histrix.com.ar/es/schema/helpers/#key) | 0..n | Campo que aporta la clave de la ayuda, **en un `<helper type="external">`**. | | [`<description>`](https://docs.histrix.com.ar/es/schema/helpers/#description) | 0..n | Descripción del parámetro, para `type="parameter"`: es el texto explicativo que se muestra en el **panel nativo de parámetros** junto al valor… | | [`<descripcion>`](https://docs.histrix.com.ar/es/schema/helpers/#descripcion) | 0..n | Se acepta por compatibilidad, pero **el motor no lo lee**: sólo busca la forma en inglés. | | [`<values>`](https://docs.histrix.com.ar/es/schema/campos/#values) | 0..n | Valores posibles de un parámetro (`type="parameter"`), para que el panel los ofrezca como lista en lugar de un texto libre. | | [`<set>`](https://docs.histrix.com.ar/es/schema/campos/#set) | 0..n | Inyecta una propiedad arbitraria en el contenedor embebido del helper: el `id` es el nombre de la propiedad y el texto del tag es el valor. | | [`<group>`](https://docs.histrix.com.ar/es/schema/consulta/#group) | 0..n | `GROUP BY` de la consulta del helper. Sirve para desduplicar el combo cuando la tabla de origen repite el valor a mostrar (típico al venir de un JOIN… | | [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) | 0..n | Campo que aporta la **descripción** de la ayuda en un `<helper type="external">`: el que se muestra al usuario, mientras `<key>` aporta el valor que… | ### Atributos #### `ajax` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional El combo no viene con las opciones adentro del HTML: se piden al servidor a medida que el usuario escribe. **Es la solución para combos con muchas filas**, donde armar el select completo hace lenta (o imposible) la carga de la pantalla. #### `close` texto · opcional Sólo en `type="link"`: nombre de la función JavaScript que se ejecuta cuando el popup se cierra. Es el gancho para refrescar la pantalla padre con lo que el hijo grabó. #### `dir` texto · opcional Directorio del XML del helper. **Se concatena al directorio del XML que lo declara**, no lo reemplaza: `dir="ing"` desde un XML que vive en `caja/` busca en `caja/ing/`. Para dar una ruta desde la raíz del árbol de XMLs, empezarla con `/`. #### `editable` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Permite escribir un valor que no esté en la lista: el combo deja de ser cerrado y acepta texto libre además de las opciones. #### `empty` texto · opcional Opción vacía del combo (`type="combo"`/`"comboex"`). No es booleano: si el valor no es `''`, `'true'` ni `'false'`, se usa como **texto del placeholder** de esa opción, así que `empty="Seleccione…"` funciona y es el uso interesante. En `<tabla_ex>` el atributo equivalente es `vacio`. #### `expand` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Arranca el helper desplegado en lugar de cerrado. #### `height` texto · opcional Alto del popup del helper. Lo leen `type="link"`, `type="media"` y `type="import"`; en combo/external/parameter no tiene efecto. #### `icon` texto · opcional Icono mostrado en el botón del helper, con los nombres del set de iconos de la UI (ej. `ui-icon-wrench`). Sólo tiene efecto en `type="link"`, `type="media"` y `type="import"`; en combo/external/parameter se ignora. #### `id` texto · opcional **No es un id de debug: es funcional y sensible.** En `type="parameter"` es la clave con la que el parámetro se guarda en `HTXOPTIONS`, así que renombrarlo pierde el valor ya configurado (y si no hay `<label>`, también es la etiqueta que se muestra). En combo/external sin `xml`, su presencia es lo que hace que el motor arme el contenedor del helper. #### `label` texto · opcional Texto del botón que abre el popup, **sólo en `type="import"`**. En los demás tipos el atributo es inerte; para `type="parameter"` la etiqueta va en el elemento `<label>`. #### `modal` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Si "true", el popup es modal (bloquea la interacción con el padre hasta cerrarlo). Sólo lo lee `type="link"`. #### `multiple` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Habilita la selección múltiple del combo (`type="combo"`/`"comboex"`). Hay que escribir el literal `"true"`: cualquier otro valor lo deja apagado. En los otros tipos se ignora. #### `reposition` texto · opcional Reposiciona el popup del helper respecto del control que lo abre. Sólo lo leen `type="link"` y `type="media"`, y hay que escribir el literal `"true"`. #### `required` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Para `type="parameter"`: marca el parámetro como obligatorio en el panel nativo. Hay que escribir el literal `"true"`; cualquier otro valor equivale a "false". #### `style` texto · opcional CSS inline del **botón** del helper de `type="link"`/`"media"`, no del contenedor del campo: se concatena después de los `style`, `colstyle` e `inputstyle` del propio campo, así que por venir último sus reglas ganan sobre las de ellos. #### `tag` texto · opcional Tag HTML con el que se dibuja el botón del helper (por defecto `a`). Sólo lo lee `type="link"`. #### `text` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Si "false", suprime el texto del botón del helper y deja sólo el icono. Sólo aplica a `type="link"` y `type="media"`. #### `title` texto · opcional Título del popup del helper. #### `titulo` texto · opcional Título del popup, pero **no es un alias universal de `title`**: en `type="link"` y `type="media"` el motor lee sólo `title` y acá `titulo` es inerte. El único tipo que lee las dos formas es `type="import"`, y ahí `title` gana si están las dos. #### `type` [`HelperTipo`](https://docs.histrix.com.ar/es/schema/tipos/#helpertipo) · opcional Tipo de helper: combo | comboex | link | external | parameter | object | inline | tags | media | import. Un valor no listado no arma ningún helper y se ignora sin error, pero igual queda guardado en el campo y puede desactivarle la grabación inline — ver `HelperTipo`. #### `vacio` texto · opcional Opción vacía del combo. **Sólo se lee en `<tabla_ex>`**, que es la forma legacy del combo y comparte este complexType con `<helper>`. En un `<helper type="combo">` el atributo equivalente es `empty`. No es booleano: si el valor no es `''`, `'false'` ni `'true'`, se usa como **texto del placeholder** de la opción vacía — o sea que `vacio="Seleccione…"` funciona y es el uso interesante. #### `ventint` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Se acepta por compatibilidad, pero **el motor no lo lee**: no hay ninguna lectura de este atributo (verificado en 2026-07). Lo que existe es una **clase CSS** `ventint` que el motor agrega por su cuenta al abrir ventanas internas — no sale de acá. Omitirlo no cambia nada. #### `width` texto · opcional Ancho del popup del helper (px o vw). Lo leen `type="link"`, `type="media"` y `type="import"`; en combo/external/parameter no tiene efecto. #### `xml` texto · opcional XML que alimenta el helper. Lo usan todos los tipos que construyen un contenedor (combo, comboex, external, parameter, object, tags, inline, import) y también `type="link"`, donde es el XML que se abre en el popup. En combo/external puede omitirse si el helper declara sus propios `<field>` y trae un `id`. ## `<ayuda>` Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field = texto visible). - "comboex": **idéntico a "combo"** — el motor los atiende con la misma rama. - "link": botón/icono que abre otro XML como popup (consulta, ficha, fichaing). - "external": ayuda que abre una tabla popup para elegir un registro. - "parameter": parámetro de configuración editable desde el panel nativo de parámetros. - "object": grilla/ficha embebida inline en el campo (no popup). - "inline": contenedor embebido, misma rama que "object" y "tags". - "tags": campo de etiquetas múltiples, misma rama que "object". - "media": botón que abre la imagen/archivo del campo. - "import": trae datos de otro XML al form. **Este complexType valida cuatro elementos distintos**: `<helper>` y las formas legacy `<tabla_ex>`, `<ayuda>` y `<ayuda_ex>`. Por eso hay hijos y atributos declarados acá que sólo tienen efecto en uno de los cuatro — y por eso cada declaración aclara en qué forma y en qué `type` se lee. Un atributo escrito en el `type` equivocado se descarta sin aviso. Las `<condicion>` SQL del combo NO soportan `'[__campo__]'` directamente — usar `<actualiza>` desde el form padre + `<detalle>` para alimentar el combo dinámicamente. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Atributos:** 24 (propios) Acepta los mismos 24 atributos y los mismos elementos hijos que [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), que es donde están documentados. ## `<ayuda_ex>` Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field = texto visible). - "comboex": **idéntico a "combo"** — el motor los atiende con la misma rama. - "link": botón/icono que abre otro XML como popup (consulta, ficha, fichaing). - "external": ayuda que abre una tabla popup para elegir un registro. - "parameter": parámetro de configuración editable desde el panel nativo de parámetros. - "object": grilla/ficha embebida inline en el campo (no popup). - "inline": contenedor embebido, misma rama que "object" y "tags". - "tags": campo de etiquetas múltiples, misma rama que "object". - "media": botón que abre la imagen/archivo del campo. - "import": trae datos de otro XML al form. **Este complexType valida cuatro elementos distintos**: `<helper>` y las formas legacy `<tabla_ex>`, `<ayuda>` y `<ayuda_ex>`. Por eso hay hijos y atributos declarados acá que sólo tienen efecto en uno de los cuatro — y por eso cada declaración aclara en qué forma y en qué `type` se lee. Un atributo escrito en el `type` equivocado se descarta sin aviso. Las `<condicion>` SQL del combo NO soportan `'[__campo__]'` directamente — usar `<actualiza>` desde el form padre + `<detalle>` para alimentar el combo dinámicamente. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Atributos:** 24 (propios) Acepta los mismos 24 atributos y los mismos elementos hijos que [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), que es donde están documentados. ## `<tabla_ex>` Helper UI asociado a un campo. Tipos (`type`): - "combo": dropdown alimentado por SQL (1er field = VALUE, 2do field = texto visible). - "comboex": **idéntico a "combo"** — el motor los atiende con la misma rama. - "link": botón/icono que abre otro XML como popup (consulta, ficha, fichaing). - "external": ayuda que abre una tabla popup para elegir un registro. - "parameter": parámetro de configuración editable desde el panel nativo de parámetros. - "object": grilla/ficha embebida inline en el campo (no popup). - "inline": contenedor embebido, misma rama que "object" y "tags". - "tags": campo de etiquetas múltiples, misma rama que "object". - "media": botón que abre la imagen/archivo del campo. - "import": trae datos de otro XML al form. **Este complexType valida cuatro elementos distintos**: `<helper>` y las formas legacy `<tabla_ex>`, `<ayuda>` y `<ayuda_ex>`. Por eso hay hijos y atributos declarados acá que sólo tienen efecto en uno de los cuatro — y por eso cada declaración aclara en qué forma y en qué `type` se lee. Un atributo escrito en el `type` equivocado se descarta sin aviso. Las `<condicion>` SQL del combo NO soportan `'[__campo__]'` directamente — usar `<actualiza>` desde el form padre + `<detalle>` para alimentar el combo dinámicamente. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Atributos:** 24 (propios) Acepta los mismos 24 atributos y los mismos elementos hijos que [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper), que es donde están documentados. ## `<options>` Lista de opciones fijas para radio/select (no dependen de SQL). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option) | 1..n | Opción con valor fijo y etiqueta. | | [`<opcion>`](https://docs.histrix.com.ar/es/schema/helpers/#opcion) | 0..n | Alias español de `<option>`; el motor lee las dos grafías. | No acepta atributos. ## `<opciones>` Contenedor de opciones de un campo. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) Acepta los mismos elementos hijos que [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options), que es donde están documentados. ## `<option>` Opción fija del combo (no proviene de SQL). - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<opciones>`](https://docs.histrix.com.ar/es/schema/helpers/#opciones) (1..n), [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) (1..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. - **Atributos:** 2 (propios) ### Atributos #### `valor` texto · opcional Sin descripción en el schema. #### `value` texto · opcional Sin descripción en el schema. ## `<opcion>` Alias español de `<option>`; el motor lee las dos grafías. - **Va dentro de:** [`<opciones>`](https://docs.histrix.com.ar/es/schema/helpers/#opciones) (0..n), [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) (0..n) - **Contenido:** texto libre. - **Atributos:** 2 (propios) Acepta los mismos 2 atributos que [`<option>`](https://docs.histrix.com.ar/es/schema/helpers/#option), que es donde están documentados. ## `<parameter>` Forma equivalente a `<field>` con la sintaxis `source`/`target`. Las dos formas registran exactamente el mismo mapeo, así que **no hay diferencia funcional**: `<parameter source="X" target="Y"/>` equivale a `<field id="X">Y</field>`. Se procesa después de los `<field>`, así que ante un `source` repetido en las dos formas gana este. En el repo hay 460 usos de `<field>` y 7 de esta forma. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. - **Atributos:** 5 (propios) ### Atributos #### `operador` [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) · opcional Alias español de `operator`. #### `operator` [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) · opcional · default `=` Operador SQL aplicado al pasar el valor. Default "=". #### `replace` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En vez de agregar una condición sobre el campo destino, **reemplaza el valor** del campo destino por el que viene del padre. Se usa cuando el hijo tiene que arrancar con un dato del padre en un campo editable, no filtrado por él. #### `source` texto · **obligatorio** `id` del campo origen (en el XML padre). #### `target` texto · **obligatorio** `id` del campo destino (en el XML hijo/helper). ## `<parametro>` Parámetros para helpers de tipo "parameter". `id` (o `xml`) puede omitirse cuando se usa `retorna` sobre un set de fields locales. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Atributos:** 4 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Campo parámetro pasado al XML hijo. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>`. | ### Atributos #### `dir` texto · opcional Directorio del XML helper. #### `id` texto · opcional ID del XML helper al que se le pasan los parámetros. #### `retorna` texto · opcional Lista CSV de campos cuyo valor debe regresar al padre cuando el helper se cierra. #### `xml` texto · opcional Nombre del XML helper destino. ## `<clave>` Campo que aporta la clave de la ayuda. **Sólo se lee dentro de `<ayuda_ex>`**, una de las formas legacy que comparten este complexType. En un `<helper type="external">` el nombre del hijo es `<key>`, no éste. 35 XMLs lo usan bajo `<ayuda_ex>`. Si no se declara ni `<clave>` ni `<key>`, el motor toma los dos primeros campos visibles: el 1º como clave y el 2º como descripción. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<defaultValue>` Valor por defecto del **parámetro de configuración**, no del combo: se lee sólo en `type="parameter"` y es el valor que toma el parámetro mientras nadie lo haya guardado en `HTXOPTIONS`. En los otros tipos de helper es inerte. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<descripcion>` Se acepta por compatibilidad, pero **el motor no lo lee**: sólo busca la forma en inglés. Para que el texto llegue al panel de parámetros hay que usar `<description>`. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<description>` Descripción del parámetro, para `type="parameter"`: es el texto explicativo que se muestra en el **panel nativo de parámetros** junto al valor editable. Ojo que el alias en español `<descripcion>` **no** lo lee nadie. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<key>` Campo que aporta la clave de la ayuda, **en un `<helper type="external">`**. Es el equivalente moderno de `<clave>`, que sólo funciona en `<ayuda_ex>`. Mismo fallback: sin él se usan los dos primeros campos visibles del helper. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<label>` en `<ayuda>` Etiqueta del **parámetro**: se lee sólo en `type="parameter"` y es el nombre con el que el parámetro aparece en el panel nativo de parámetros. Si se omite, se usa el `id` del helper. En los otros tipos de helper es inerte. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<value>` en `<ayuda>` Campo que aporta la **descripción** de la ayuda en un `<helper type="external">`: el que se muestra al usuario, mientras `<key>` aporta el valor que se graba. Sin él, la descripción sale del 2º campo visible del helper. No confundirlo con los `<value>` de adentro de `<values>`, que son la lista de opciones de un parámetro. - **Va dentro de:** [`<ayuda>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda) (0..n), [`<ayuda_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#ayuda_ex) (0..n), [`<helper>`](https://docs.histrix.com.ar/es/schema/helpers/#helper) (0..n), [`<tabla_ex>`](https://docs.histrix.com.ar/es/schema/helpers/#tabla_ex) (0..n) - **Contenido:** texto libre. No acepta atributos. ------------------------------------------------------------------------------ ## Interacción y validaciones URL: https://docs.histrix.com.ar/es/schema/interaccion/ JavaScript en el campo, evaluación condicional server-side, propagación de valores y validaciones. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Los elementos que dan comportamiento a un campo sin escribir código en un archivo aparte: cálculos en el navegador, evaluación condicional en el servidor, propagación de valores entre campos y validaciones. ## `<jseval>` Evaluación de código JavaScript al cambiar el campo. El resultado se asigna al destino. Debe estar presente uno de `campodestino` o `fielddestino` (alias). Regla crítica: para cálculos aritméticos puros usar `actxml="false"` — sin ese atributo el motor envía un PUT al server por cada cambio (en grillas grandes esto explota en cientos de requests innecesarios). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 4 (propios) ### Atributos #### `actxml` [`ActXmlValor`](https://docs.histrix.com.ar/es/schema/tipos/#actxmlvalor) · opcional Default "true": envía request al server por cada cambio. "false": el JS se resuelve en el browser sin request (preferido para aritmética pura). #### `campodestino` texto · opcional `id` del campo destino donde se asigna el resultado del JS. #### `fielddestino` texto · opcional Alias inglés de `campodestino`. #### `total` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", el JS calcula el total de columna (footer del grid). ## `<jsfunction>` Función JS asociada a un evento del campo (onfocus, onblur, onkeypress...). El atributo `event` declara el nombre del evento. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) ### Atributos #### `event` texto · **obligatorio** Nombre del evento DOM (sin "on": "focus", "blur", "change"...). ## `<if>` Estructura condicional de un `<field>`: `<if exp="..."><true>X</true><false>Y</false></if>`. `exp` se evalúa como PHP en el servidor y el campo toma el contenido de la rama que corresponda. Los identificadores sin comillas se reemplazan por el valor de los `<field>` declarados en el XML: **un identificador que no esté declarado como `<field>` hace fallar la evaluación en silencio y se toma la rama `<false>`** — el síntoma es un campo vacío sin ningún error (y si ese campo es el `idCampoCond` de una tabla, el registro no graba). La comparación entera va dentro de `exp`: **`operador` y `valor` no se leen** — el parser los guarda pero la evaluación del `<if>` nunca los consume, así que los 75 XMLs que escriben `<if operador="...">` no obtienen nada de eso. **Sólo el `<if>` de un `<field>` tiene esta forma.** El de `<order>`, `<group>`, `<filters>`, `<fieldGroup>` e `<include>` es otra cosa: no lleva `exp` ni ramas, es texto PHP que decide si el bloque entero se procesa. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<orden>`](https://docs.histrix.com.ar/es/schema/consulta/#orden) (0..1), [`<order>`](https://docs.histrix.com.ar/es/schema/consulta/#order) (0..1) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<true>`](https://docs.histrix.com.ar/es/schema/interaccion/#true) | 1 | Valor/expresión devuelto si la condición es truthy. | | [`<false>`](https://docs.histrix.com.ar/es/schema/interaccion/#false) | 0..1 | Valor/expresión devuelto si la condición es falsy. Opcional: sin esta rama, cuando la condición da falso el campo queda vacío. | | [`<verdadero>`](https://docs.histrix.com.ar/es/schema/interaccion/#verdadero) | 1 | Alias español legacy de `<true>`. El motor lo reconoce explícitamente como forma vieja: al encontrarlo activa el modo de compatibilidad del parser. | | [`<falso>`](https://docs.histrix.com.ar/es/schema/interaccion/#falso) | 0..1 | Alias español legacy de `<false>`. | ### Atributos #### `exp` texto · opcional Expresión PHP a evaluar. Los `<field>` declarados son referenciables por nombre sin comillas. ## `<true>` Valor/expresión devuelto si la condición es truthy. - **Va dentro de:** [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) (1) - **Contenido:** texto libre. No acepta atributos. ## `<false>` Valor/expresión devuelto si la condición es falsy. Opcional: sin esta rama, cuando la condición da falso el campo queda vacío. - **Va dentro de:** [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<visibleWhen>` Muestra u oculta **este** campo según una condición: el tag va sobre el campo controlado, no sobre el que dispara la condición. Al ocultarlo esconde la celda entera del campo y la de su `<label>`, y le **saca el `required`**, para que el formulario no quede trabado pidiendo un campo que no se ve. La condición se escribe como la de un `<jseval>`: los `id` de otros campos van **sin comillas** y el motor los reemplaza por su valor, así que `exige_obs == 1` muestra el campo cuando `exige_obs` vale 1. Ese reemplazo **convierte el valor a número**, de modo que la comparación contra un número funciona y la comparación contra texto —`== 'A'`— no es confiable. Se resuelve entero en el navegador: no genera SQL, no pide nada al servidor y **se re-evalúa con cada cambio** de cualquier campo del formulario, incluidos los que llena un combo o un helper. **No es lo mismo que `<if>` o `noshow`**, que deciden en el servidor una sola vez, al armar la pantalla, y no vuelven a mirar nada. Es el reemplazo declarativo del `<customScript>` que había que escribir para esto. Si se declara más de una vez en el mismo campo, vale la última. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<requiredWhen>` Hace obligatorio **este** campo mientras se cumpla la condición, y le saca la marca cuando deja de cumplirse. Va sobre el campo que se vuelve obligatorio. **Un campo oculto nunca queda obligatorio**: si la condición da verdadera pero la celda del campo está escondida —por un `<visibleWhen>` o por cualquier otro motivo— el `required` no se aplica. La condición se escribe igual que la de `<visibleWhen>`, con las mismas reglas de reemplazo y la misma reactividad; el detalle está ahí. Si se declara más de una vez en el mismo campo, vale la última. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<enabledWhen>` Habilita **este** campo mientras se cumpla la condición y lo deshabilita cuando deja de cumplirse. Va sobre el campo que se habilita. Deshabilitar es sólo apagar el control: el campo sigue en la pantalla y en el formulario, a diferencia de `<visibleWhen>`, que lo esconde. Tampoco toca el `required`. La condición se escribe igual que la de `<visibleWhen>`, con las mismas reglas de reemplazo y la misma reactividad; el detalle está ahí. Si se declara más de una vez en el mismo campo, vale la última. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<actualiza>` Al cambiar el campo padre, propaga su valor a otros campos/combos/grilla/helpers. Cada `<field>` declara un destino. Para combos: el valor se inserta en un campo del combo con `<detalle>` que define el nombre lógico. De cada `<field>` destino sólo se leen `id`, `destino` y `xml`. Cualquier otro atributo (`oculto`, por ejemplo, que 23 XMLs escriben acá) y el texto del tag se ignoran. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Destino de la actualización: campo, combo o grid embebido. | | [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) | 0..n | Alias español de `<field>` como destino de la actualización. | No acepta atributos. ## `<validations>` Validaciones **por campo**, en plural. Es un mecanismo distinto del `<validation>` singular: construye una validación por cada `<field>` del bloque, que compara el valor del campo contra el resultado de una `<expression>` SQL usando el `<operator>`. **El plural es obligatorio.** Con `<validation>` (singular) el bloque se ignora en silencio: el singular busca `<condition>` y `<message>` directos y no mira los `<field>`. No hay error en ningún log — la validación simplemente deja de existir. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 1..n | Campo a validar. El `id` es el campo del form cuyo valor se compara. | No acepta atributos. ## `<validation>` Validación del formulario, en singular: `<condition>` + `<message>`. Si la condición no se cumple se muestra el mensaje y no se graba. **La condición es JavaScript que corre en el browser, no SQL ni PHP.** Se evalúa reemplazando los nombres de campo por el valor del input correspondiente del DOM, así que sólo ve campos que existan como input: con `oculto="true"` el campo no se renderiza y la validación **nunca dispara**; con `noshow="true"` el input sigue en el DOM y sí funciona. Los atributos `operador` y `valorde` que admite el tipo de la `<condition>` pertenecen a la `<condicion>` SQL de un campo: acá no se leen. No confundir con `<validations>` (plural), que es otro mecanismo — compara el valor de un campo contra el resultado de un SELECT. Y en singular **no hay alias español**: hay 20 validaciones escritas con `<condicion>` que no existen. - **Va dentro de:** [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<condition>`](https://docs.histrix.com.ar/es/schema/consulta/#condition) | 1 | Condición (expresión) que debe cumplirse para pasar la validación. | | [`<message>`](https://docs.histrix.com.ar/es/schema/interaccion/#message) | 1 | Mensaje a mostrar si la condición no se cumple. | ### Atributos #### `optional` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Sin descripción en el schema. ## `<message>` Mensaje de error si la validación falla. Default "Valor invalido". - **Va dentro de:** [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<validation>`](https://docs.histrix.com.ar/es/schema/interaccion/#validation) (1) - **Contenido:** texto libre. No acepta atributos. ## `<eval>` **No es JavaScript: es PHP que corre server-side al parsear el XML**, y decide si el campo existe. Si el código no devuelve un valor verdadero, el `<field>` no se agrega al contenedor: no se renderiza, no entra al SELECT y no graba. La forma habitual es `if (...) return true;`. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<falso>` Alias español legacy de `<false>`. - **Va dentro de:** [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) (0..1) - **Contenido:** texto libre. No acepta atributos. ## `<verdadero>` Alias español legacy de `<true>`. El motor lo reconoce explícitamente como forma vieja: al encontrarlo activa el modo de compatibilidad del parser. Funciona, pero en código nuevo va `<true>`. - **Va dentro de:** [`<if>`](https://docs.histrix.com.ar/es/schema/interaccion/#if) (1) - **Contenido:** texto libre. No acepta atributos. ## `<campo>` en `<actualiza>` Alias español de `<field>` como destino de la actualización. - **Va dentro de:** [`<actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#actualiza) (0..n) - **Contenido:** texto libre. - **Atributos:** 3 (propios) Acepta los mismos 3 atributos que [`<field>`](https://docs.histrix.com.ar/es/schema/interaccion/#field-en-actualiza), que es donde están documentados. ## `<field>` en `<actualiza>` Destino de la actualización: campo, combo o grid embebido. - **Va dentro de:** [`<actualiza>`](https://docs.histrix.com.ar/es/schema/interaccion/#actualiza) (0..n) - **Contenido:** texto libre. - **Atributos:** 3 (propios) ### Atributos #### `destino` texto · opcional Si el destino es un combo/grid: nombre del subcampo dentro del helper (matchea con `<detalle>`). #### `id` texto · **obligatorio** `id` del campo o helper destino. #### `xml` texto · opcional XML del helper destino (cuando ambiguo). ## `<field>` en `<validations>` Campo a validar. El `id` es el campo del form cuyo valor se compara. - **Va dentro de:** [`<validations>`](https://docs.histrix.com.ar/es/schema/interaccion/#validations) (1..n) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<expression>`](https://docs.histrix.com.ar/es/schema/campos/#expression) | 0..n | SELECT cuyo resultado se compara con el valor del campo. Soporta `'[__campo__]'` para interpolar otros campos del form. | | [`<operator>`](https://docs.histrix.com.ar/es/schema/consulta/#operator) | 0..n | Operador de comparación (`==`, `!=`, ...). Default `==`. Suele ir en CDATA cuando lleva `<` o `>`. | | [`<message>`](https://docs.histrix.com.ar/es/schema/interaccion/#message) | 0..n | Mensaje de error si la validación falla. Default "Valor invalido". | | [`<value>`](https://docs.histrix.com.ar/es/schema/campos/#value) | 0..n | Valor literal contra el que comparar, como alternativa a `<expression>`. | ### Atributos #### `id` texto · **obligatorio** Sin descripción en el schema. ------------------------------------------------------------------------------ ## Grabación e importación URL: https://docs.histrix.com.ar/es/schema/grabacion/ Cómo se persisten los datos de un formulario: movimientos, procesos encadenados e importación desde otros XML. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Un formulario de ingreso no graba por sí mismo: declara **movimientos**, que son otros XML encargados de insertar, actualizar o borrar. Estos elementos definen ese encadenamiento y el pasaje de datos entre los XML que participan. ## `<movimientos>` Lista de XMLs relacionados que el motor procesa en cascada al grabar el padre. Útil para INSERT/UPDATE en múltiples tablas relacionadas (cabecera + detalles). - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 2 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<relacion>`](https://docs.histrix.com.ar/es/schema/grabacion/#relacion) | 0..n | Referencia a un XML hijo que se procesa como parte del movimiento. | ### Atributos #### `cabecera` texto · opcional Nombre del XML cabecera (padre lógico del movimiento). #### `dir` texto · opcional Directorio donde buscar el XML de `cabecera`. **Sólo afecta a `cabecera`**: las `<relacion>` hijas resuelven su propio XML por su cuenta y no heredan este valor. ## `<relacion>` Referencia a un XML hijo que se procesa como parte del movimiento. - **Va dentro de:** [`<movimientos>`](https://docs.histrix.com.ar/es/schema/grabacion/#movimientos) (0..n) - **Contenido:** texto libre. - **Atributos:** 2 (propios) ### Atributos #### `dir` texto · opcional Directorio del XML relacionado. #### `id` texto · **obligatorio** Nombre del XML relacionado. ## `<cierraproceso>` Cierre de proceso: ejecuta otro XML como parte de la grabación del actual. Con `processFirst="true"` en el `<histrix>` del hijo, el hijo se ejecuta antes que el padre (útil para obtener numeradores en el hijo antes de que el padre grabe). Caso típico: `recibos` y `pagos` comparten `cajmovimientos_ing.xml` como cierraproceso, diferenciando con el parámetro `tesconie` ('I' o 'E'). - **Va dentro de:** [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 3 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<paring>`](https://docs.histrix.com.ar/es/schema/grabacion/#paring) | 1..n | Mapea un campo del padre a un campo del XML cierraproceso. | ### Atributos #### `condition` texto · opcional Condición PHP que decide si el cierraproceso se ejecuta. #### `dir` texto · opcional Directorio del XML cierraproceso. #### `id` texto · **obligatorio** Nombre del XML cierraproceso (sin .xml). ## `<importar>` Configura un popup hijo que alimenta el grid/form actual con datos seleccionados. Cada `<field>` (o su equivalente `<parameter>`) mapea un campo del hijo con uno del padre. Cuidado: al volver del popup, el renglón se busca por los campos `esClave` del grid. Si un campo `esClave` del padre no se pasa al hijo y no vuelve via `<detalle>`, el matcheo falla y se crea una fila nueva (fantasma) en lugar de actualizar la existente. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<include>`](https://docs.histrix.com.ar/es/schema/raiz/#include) (0..n), [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 12 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<preparam>`](https://docs.histrix.com.ar/es/schema/grabacion/#preparam) | 0..n | Pre-condición que se aplica al popup hijo antes de ejecutar su query. | | [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param) | 0..n | Parámetro pasado al popup hijo (legacy de `preparam`). | | [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) | 0..n | Mapeo origen→destino entre hijo y padre. El `id` es el origen y **el texto del tag es el destino**; con el texto vacío se usa el mismo nombre en los… | | [`<parameter>`](https://docs.histrix.com.ar/es/schema/helpers/#parameter) | 0..n | Forma equivalente a `<field>` con la sintaxis `source`/`target`. | ### Atributos #### `accesskey` texto · opcional Tecla de acceso rápido del botón de importación (una letra). La menciona la doc de `ventint` y acá se declara: con esto el operador dispara la búsqueda sin ir al mouse. #### `boton` texto · opcional Texto del botón que abre la importación, en lugar del texto por defecto. #### `dir` texto · opcional Directorio del XML hijo. #### `height` texto · opcional Alto del popup. #### `icon` texto · opcional Nombre de la clase de icono a mostrar en el botón (ej. `ui-icon-search`, `ui-icon-plus`). #### `label` texto · opcional Texto del botón que abre el popup. #### `resume` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Se acepta por compatibilidad, pero **acá no hace nada**: `readImportTag` no lee este atributo y `Relationship/ImportRelationship` no lo conoce. El `resume` funcional es el del `<histrix>`, donde `Data/Container` lo consulta para descartar el SQL externo previo del contenedor referente al volver de un popup. #### `title` texto · opcional Título del popup. #### `titulo` texto · opcional Alias español de `title`. #### `ventint` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Se acepta por compatibilidad, pero **el motor no lo lee** — igual que en el `<helper>`. `readImportTag` sólo procesa `xml`, `field`/`campo`, `parameter`, `icon`, `accesskey`, `boton`, `width`, `height`, `label`, `titulo`/`title` y `dir`. #### `width` texto · opcional Ancho del popup. #### `xml` texto · opcional Nombre del XML hijo que se abre como popup. ## `<ejecuta>` SQL/PHP arbitrario a ejecutar. En `tipo="nosql"` Histrix reemplaza `'nombre_campo'` (entre comillas) por el valor del campo. - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<param>` Condición pre-filtrado en consultas/importar. `field` es alias de `campo` (mismo significado). - **Va dentro de:** [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) (0..n) - **Contenido:** texto libre. - **Atributos:** 3 (propios) ### Atributos #### `campo` texto · opcional `id` del campo del XML hijo al que se le aplica el pre-filtro. #### `field` texto · opcional Alias inglés de `campo`. #### `operador` [`OperadorCondicion`](https://docs.histrix.com.ar/es/schema/tipos/#operadorcondicion) · opcional Operador SQL del pre-filtro. ## `<preparam>` Condición pre-filtrado en consultas/importar. `field` es alias de `campo` (mismo significado). - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n), [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) (0..n) - **Contenido:** texto libre. - **Atributos:** 3 (propios) Acepta los mismos 3 atributos que [`<param>`](https://docs.histrix.com.ar/es/schema/grabacion/#param), que es donde están documentados. ## `<paring>` Alimenta con una **condición SQL** al contenedor embebido del campo (el que abre `obj` / `linkint` / el helper). **No es el `<paring>` de `<cierraproceso>`**, que es otro mecanismo: ése mapea campos del padre al XML de cierre. - **Va dentro de:** [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo) (0..n), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field) (0..n) - **Contenido:** texto libre. - **Atributos:** 3 (propios) ### Atributos #### `destino` texto · **obligatorio** `id` del campo del contenedor embebido sobre el que se arma la condición. #### `operador` texto · opcional Operador **SQL** de la condición (`=`, `!=`, `like`, `in`…), no un operador de asignación: `+=` y `-=` no significan nada acá. Si se omite, `=`. #### `reemplazo` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` **Está invertido**: con el atributo ausente la condición ya **reemplaza** la que tuviera ese campo. El valor útil es `reemplazo="false"`, que la **acumula** en vez de reemplazarla. ## `<paring>` en `<cierraproceso>` Mapea un campo del padre a un campo del XML cierraproceso. - **Va dentro de:** [`<cierraproceso>`](https://docs.histrix.com.ar/es/schema/grabacion/#cierraproceso) (1..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) ### Atributos #### `destino` texto · **obligatorio** `id` del campo destino en el XML cierraproceso. ## `<field>` en `<importar>` Mapeo origen→destino dentro de `<importar>`. **El `id` es el campo origen y el texto del tag es el campo destino**; con el texto vacío se usa el mismo nombre para los dos. Ese texto es significativo, no un comentario: borrarlo o comentarlo rompe el mapeo. - **Va dentro de:** [`<importar>`](https://docs.histrix.com.ar/es/schema/grabacion/#importar) (0..n) - **Contenido:** texto libre. - **Atributos:** 1 (propios) ### Atributos #### `id` texto · **obligatorio** `id` del campo del padre que recibe. ------------------------------------------------------------------------------ ## Gráficos y widgets URL: https://docs.histrix.com.ar/es/schema/visualizaciones/ Series de gráficos, etiquetas de eje y widgets del escritorio. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Elementos de las vistas que no son una grilla: gráficos estadísticos y widgets. El tipo de gráfico lo define el tag `<tipo>` con un código de una o dos letras. Los tres más usados: | `<tipo>` | Resultado | | --- | --- | | `L` | [imagen: Gráfico de líneas] | | `C` | [imagen: Gráfico de columnas] | | `P` | [imagen: Gráfico de torta] | ## `<grafico>` Definición de un gráfico. Va dentro de la `<table>`/`<tabla>` de la consulta que le da los datos: suelto en la raíz del `<histrix>` no dibuja nada. Valores de `<tipo>`: `L` línea, `C` columnas, `SC` columnas también (es idéntico a `C`, no apila nada), `P` torta, `H` gráfico de cotizaciones (exige una serie llamada `_time`), más `heatmap`, `treemap` y `gauge`. **`B` no existe**: cualquier valor no reconocido se pasa crudo a la librería de gráficos, que no dibuja nada y deja el spinner girando para siempre. Mezclar tipos de serie en un mismo gráfico **sí se puede**: el `type` de cada `<serie>` gana sobre el `<tipo>` general, así que se pueden combinar columnas con una línea encima (por ejemplo importes por mes más la tendencia). - **Va dentro de:** [`<tabla>`](https://docs.histrix.com.ar/es/schema/consulta/#tabla) (0..n), [`<table>`](https://docs.histrix.com.ar/es/schema/consulta/#table) (0..n) - **Atributos:** 3 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<ancho>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#ancho) | 0..n | **No hace nada: es código muerto.** Se lee del XML pero nadie lo usa para dimensionar el gráfico, que siempre toma el ancho del contenedor. | | [`<alto>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#alto) | 0..n | Alto del gráfico. A diferencia de `<ancho>`, este sí se aplica: es la única forma de que un gráfico no salga con el alto por defecto. | | [`<tipo>`](https://docs.histrix.com.ar/es/schema/campos/#tipo) | 0..n | Tipo de gráfico. Valores válidos: `L` línea, `C` columnas, `SC` columnas (idéntico a `C`), `P` torta, `H` cotizaciones (exige una serie llamada… | | [`<etiquetas>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#etiquetas) | 0..n | Campo cuyo valor se usa como eje X (etiquetas de cada punto). | | [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) | 0..n | Campo de una serie de datos (eje Y). Repetir para múltiples series. | | [`<objective>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#objective) | 0..n | Valor meta que se dibuja como referencia sobre el gráfico (la línea de objetivo). | | [`<options>`](https://docs.histrix.com.ar/es/schema/helpers/#options) | 0..n | JSON crudo que se mergea sobre las opciones de la librería de gráficos, para llegar a cualquier setting que el motor no expone (formato de tooltip… | | [`<datos>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#datos) | 0..n | Fuente alternativa de datos (cuando no se infiere del form). | | [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) | 0..n | Título del gráfico. | | [`<titulo>`](https://docs.histrix.com.ar/es/schema/raiz/#titulo) | 0..n | Alias español de `<title>`; el motor lee las dos grafías. | | [`<subtitulo>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#subtitulo) | 0..n | Subtítulo del gráfico. | ### Atributos #### `average` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Agrega la línea de promedio de la serie sobre el gráfico. No confundirlo con el `average` de un `<field>`, que es otra cosa (promedia una columna de la grilla). #### `id` texto · **obligatorio** Identificador del gráfico. #### `pareto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Dibuja el gráfico como Pareto: las columnas ordenadas de mayor a menor más la curva de porcentaje acumulado. Sirve para el clásico "qué 20% explica el 80%". ## `<serie>` Campo de una serie de datos (eje Y). Repetir para múltiples series. El texto del tag es el nombre del campo; con `<column>` adentro se declaran varias columnas en una misma serie. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Atributos:** 1 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<column>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#column) | 0..n | Columna que aporta datos a esta serie. | ### Atributos #### `type` texto · opcional Tipo de esta serie en particular, con los mismos valores que `<tipo>`. Pisa al tipo general y es lo que permite mezclar columnas y líneas en un mismo gráfico. ## `<etiquetas>` Campo cuyo valor se usa como eje X (etiquetas de cada punto). - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<widget>` Widget embebido en el dashboard. **No es un iframe y no apunta afuera**: el contenido de `<url>` se pide por AJAX y su HTML se inyecta dentro del div del widget, y la ruta se reescribe a la API interna, así que lo que se referencia es una pantalla de la propia aplicación, no un sitio externo. - **Va dentro de:** [`<abm>`](https://docs.histrix.com.ar/es/schema/raiz/#abm) (0..n), [`<histrix>`](https://docs.histrix.com.ar/es/schema/raiz/#histrix) (0..n) - **Atributos:** 4 (propios) ### Contenido | Elemento | Veces | Descripción | | --- | --- | --- | | [`<title>`](https://docs.histrix.com.ar/es/schema/raiz/#title) | 0..n | Título visible del widget. | | [`<url>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#url) | 0..n | Pantalla interna cuyo HTML se inyecta en el div del widget (se pide por AJAX, no es un iframe). | | [`<text>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#text) | 0..n | Contenido HTML fijo del widget, para los casos en que no hay una pantalla que embeber: un texto, un aviso, un bloque de links. | | [`<iframe>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#iframe) | 0..n | **Éste sí es un iframe de verdad**, y es la forma de mostrar algo externo a la aplicación (un tablero, un mapa, una página). | ### Atributos #### `height` texto · opcional Alto del widget (CSS). Ojo: en la práctica el alto lo termina fijando `style`. #### `id` texto · **obligatorio** Identificador del widget. #### `style` texto · opcional CSS inline del div del widget. **Es lo único que efectivamente le da alto**: sin `style` el widget se dimensiona por su contenido, y un widget que carga por AJAX arranca en cero. #### `width` texto · opcional Ancho del widget (CSS). ## `<alto>` Alto del gráfico. A diferencia de `<ancho>`, este sí se aplica: es la única forma de que un gráfico no salga con el alto por defecto. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<ancho>` **No hace nada: es código muerto.** Se lee del XML pero nadie lo usa para dimensionar el gráfico, que siempre toma el ancho del contenedor. Los 87 XMLs que lo escriben (muchos con `800px`) no cambian nada. Queda declarado para que esos XMLs no den error, pero no hay que agregarlo en código nuevo. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<column>` Columna que aporta datos a esta serie. - **Va dentro de:** [`<serie>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#serie) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<datos>` Fuente alternativa de datos (cuando no se infiere del form). - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<iframe>` **Éste sí es un iframe de verdad**, y es la forma de mostrar algo externo a la aplicación (un tablero, un mapa, una página). Lo que la documentación suele atribuirle a `<url>` —apuntar afuera— en realidad se hace acá. - **Va dentro de:** [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<objective>` Valor meta que se dibuja como referencia sobre el gráfico (la línea de objetivo). El valor puede quedar guardado por el usuario desde la propia pantalla, así que lo que se declara acá es el default. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<subtitulo>` Subtítulo del gráfico. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<text>` Contenido HTML fijo del widget, para los casos en que no hay una pantalla que embeber: un texto, un aviso, un bloque de links. Alternativa a `<url>`. - **Va dentro de:** [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<url>` Pantalla interna cuyo HTML se inyecta en el div del widget (se pide por AJAX, no es un iframe). - **Va dentro de:** [`<widget>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#widget) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<options>` en `<grafico>` JSON crudo que se mergea sobre las opciones de la librería de gráficos, para llegar a cualquier setting que el motor no expone (formato de tooltip, colores, ejes secundarios). **No se valida**: un JSON mal formado rompe el gráfico entero sin mensaje de error. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ## `<tipo>` en `<grafico>` Tipo de gráfico. Valores válidos: `L` línea, `C` columnas, `SC` columnas (idéntico a `C`), `P` torta, `H` cotizaciones (exige una serie llamada `_time`), `heatmap`, `treemap` y `gauge`. **`B` no existe** aunque muchos XMLs lo escriben: un valor no reconocido se pasa crudo a la librería de gráficos, que no dibuja nada y deja el spinner girando para siempre. - **Va dentro de:** [`<grafico>`](https://docs.histrix.com.ar/es/schema/visualizaciones/#grafico) (0..n) - **Contenido:** texto libre. No acepta atributos. ------------------------------------------------------------------------------ ## Grupos de atributos URL: https://docs.histrix.com.ar/es/schema/grupos/ Los conjuntos de atributos que varios elementos comparten: identificación, UI, PDF, imagen y calendario. ------------------------------------------------------------------------------ :::note Página generada a partir de [`histrix-1.0.xsd`](https://docs.histrix.com.ar/histrix-1.0.xsd) con `scripts/gen_schema_docs.py`. Las descripciones salen del schema, que está verificado contra el código del motor. Para corregir un texto hay que corregir el XSD y volver a generar. ::: Varios elementos comparten conjuntos de atributos. El schema los declara una vez como grupo y los referencia desde cada elemento que los acepta; están documentados una sola vez, igual que en el schema. Que un atributo esté en un grupo compartido no significa que haga lo mismo en todos los elementos que lo aceptan: significa que todos lo admiten. ## pdfGrup Atributos que sólo tienen efecto al generar el PDF o la etiqueta impresa. Atributos para renderizado PDF. Aplican a `<field>`, `<label>` y `<fieldGroup>` (los de nivel documento están en el `<histrix>`). **No afectan la exportación a XLS/CSV**: la exportación no lee ningún atributo `PDF*`. **La grafía es exacta y case-sensitive: NO hay normalización de mayúsculas.** El motor busca el atributo tal como está escrito, y el fallback a minúsculas que existía está desactivado. Por eso `PDFxxx` y `pdfxxx` son atributos distintos, y cuál funciona depende del atributo: `PDFcolWidth`, `PDFwidth`, `PDFnolabel` y `PDFsize` van en camelCase; `pdfancho`, `pdffill` y `pdflineas` van en minúscula. Los únicos renombres que hace el motor son tres casos puntuales que valen **sólo** dentro de `<label>` (ver `PDFancho`) y el par `pdffill`/`PDFfill`. **33 atributos.** Lo aceptan: [`<label>`](https://docs.histrix.com.ar/es/schema/campos/#label). ### Otros #### `offsetX` texto · opcional Desplazamiento horizontal **en mm** que se suma siempre a la posición de la celda. **No es un booleano**: `offsetX="true"` aborta la impresión con un error de tipo. #### `offsetY` texto · opcional Desplazamiento vertical **en mm** que se suma siempre a la posición de la celda. **No es un booleano**: `offsetY="true"` aborta la impresión con un error de tipo. Y su valor por defecto no es 0 sino el offset superior de página del documento (3 u 8 mm según el caso), así que `offsetY="0"` no equivale a omitirlo: omitido, la celda ya arranca corrida por ese offset. #### `PDFaddPage` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", fuerza salto de página antes de renderizar este elemento. #### `PDFalign` texto · opcional · default `L` Alineación de la celda: `L` (izquierda), `R` (derecha), `C` (centro), `J` (justificada). **El default declarado acá no es el real**: con el atributo ausente la alineación la decide el tipo del campo — los numéricos salen a la derecha, y `check`, `hora` y `file` al centro. Sólo escribiendo el atributo se fuerza otra. #### `PDFbackgroundColor` texto · opcional Color de fondo de la celda. **Hex de 6 dígitos y sin `#`** (`RRGGBB`): si el valor no mide exactamente 6 caracteres se resuelve como blanco y sin ningún aviso, así que `#RRGGBB` (7 caracteres) no pinta nada. Los nombres de color tampoco andan: "orange" mide justo 6, no se descarta y se interpreta como hex basura. #### `PDFbold` [`PdfFontStyle`](https://docs.histrix.com.ar/es/schema/tipos/#pdffontstyle) · opcional Negrita. No es un booleano: selecciona a qué parte de la celda aplica (ver `PdfFontStyle`). **Sólo se consulta al imprimir fichas y etiquetas**: en las columnas de una grilla no se mira, así que ahí no tiene efecto. #### `PDFborder` texto · opcional Borde de la celda. **`PDFborder="true"` no dibuja ningún borde**: el valor viaja crudo al generador de PDF, que entiende `1` (recuadro completo) o las letras **en mayúscula** `L`, `T`, `R`, `B` — izquierda, arriba, derecha, abajo — y sus combinaciones (`LR`). Cualquier otro valor deja la celda sin borde. #### `PDFbox` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Envuelve el contenido en un box. Útil para destacar zonas. #### `PDFcellHeight` texto · opcional Alto mínimo de fila en número de líneas. Aplicarlo en una columna uniformiza el alto de toda la fila (alto = mayor de las columnas × 1,3 × tamaño de fuente). **Se ignora en los campos `tipo="check"`, `tipo="grafico"` y `tipo="file"`**, que calculan su alto por su cuenta. #### `PDFcolor` texto · opcional Color del texto de la celda. Mismo formato que `PDFbackgroundColor`: **hex de 6 dígitos y sin `#`**. Con `#` son 7 caracteres, el motor lo resuelve como blanco y el texto queda invisible; y un nombre de 6 letras como "orange" se lee como hex basura. En los dos casos, sin aviso. #### `PDFcolWidth` texto · opcional Ancho de **columna** de la tabla PDF. Número SIN unidad (ej. "20"): agregar "px" rompe el layout. Fijarlo además desactiva el reajuste automático de esa columna, así que no se ensancha para acomodar el contenido — el texto se parte en varias líneas. **No es alias de `PDFwidth` ni de `pdfancho`**: son tres anchos distintos (ver `PDFwidth`). La grafía es exacta: `PDFcolwidth` con `w` minúscula no la lee nadie. #### `pdffill` `entero` · opcional Nivel de gris del fondo de la celda, 0 (negro) a 255 (blanco). **Es la única grafía que fija el color** — toda en minúscula. Los valores en uso son 195 y 192. **No es un booleano**: el número va crudo al generador de PDF, así que un texto como "true" no rellena nada y aborta la impresión con un error de tipo. En un `<label>` se puede escribir igual: es la misma propiedad. #### `PDFfill` texto · opcional **No fija ningún color.** Su único efecto es la *presencia*: declararlo con cualquier valor **suprime el gris claro por defecto** (240,240,240) y la celda queda con el color que hubiera quedado seteado antes. Para elegir el color hay que usar `pdffill` en minúscula, que es la grafía que llega al relleno. #### `PDFfontsize` `entero` · opcional Segunda grafía aceptada para el tamaño de fuente del campo, **con `s` minúscula**: el motor toma `PDFsize` y, si no está, ésta. Preferir `PDFsize`. Ojo con la trampa: `PDFfontSize` (con `S` mayúscula) **no** se lee a nivel campo — ése es el atributo global y va en el `<histrix>`. #### `PDFfooter` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Indica que el campo es parte del footer del PDF. #### `PDFheader` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Indica que el campo/label es parte del header del PDF (se repite en cada página). #### `PDFitalic` [`PdfFontStyle`](https://docs.histrix.com.ar/es/schema/tipos/#pdffontstyle) · opcional Itálica. Mismo mecanismo que `PDFbold`: no es un booleano, elige a qué parte de la celda aplica (ver `PdfFontStyle`). **Sólo se consulta al imprimir fichas y etiquetas**; en las columnas de una grilla no tiene efecto. #### `pdflineas` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Recuadro de las celdas de una grilla **embebida** en un campo (`helper type="object"`). Viene activo: sólo el literal "false" lo apaga. Tiene efecto únicamente en campos con contenedor interno; en un campo común no hace nada. La grafía es exacta y en minúscula: `PDFlineas` no la lee nadie. Para el recuadro de la grilla principal el atributo es `PDFlines`, y va en el `<histrix>`. #### `PDFlineHeight` texto · opcional Alto de celda **absoluto en mm**, no un multiplicador: pisa el alto calculado. Un `1.2` escrito pensando que era un factor deja la celda de 1,2 mm y el texto encimado. El multiplicador de interlineado es otro atributo, `PDFheigthRel` (sic, con el typo), que este schema todavía no declara. #### `PDFnoborder` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Suprime el borde de la celda de la **etiqueta** al imprimir ficha o etiqueta, y de paso apaga su relleno. **No anula el borde del valor**: la celda del valor sigue tomando su borde de `PDFborder`. Ojo: el motor sólo mira si el atributo está presente, no su valor, así que `PDFnoborder="false"` también suprime el borde. Para no suprimirlo hay que **omitir el atributo**. La grafía es exacta: `pdfnoborder` en minúscula no la lee nadie. #### `PDFnolabel` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Omite el label del campo en el PDF — útil en etiquetas térmicas y planillas compactas. **La grafía es exacta**: `pdfnolabel` en minúscula no la lee nadie (hay 20 usos escritos así en el repo, todos inertes). Y el motor lo consulta con criterios distintos en distintos puntos de la impresión, así que `PDFnolabel="false"` no es un negador confiable: para que el label salga, omitir el atributo. #### `PDFpageBreak` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Controla el salto de página automático. "false" lo desactiva. #### `PDFrestorePosition` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Restaura la posición X/Y del cursor antes de renderizar (para componer cajas superpuestas). #### `PDFrotate` `entero` · opcional Rota el texto N grados. #### `PDFscaleX` `entero` · opcional Escala horizontal del texto (en %). #### `PDFsize` texto · opcional Tamaño de fuente en puntos de esta celda. Es **la** grafía de nivel campo; el motor acepta además `PDFfontsize` (con `s` minúscula) como segunda forma. El global del documento es `PDFfontSize` en el `<histrix>` (otro atributo). #### `pdftitulo` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Fila de títulos de una grilla **embebida** en un campo. Viene activa: sólo `pdftitulo="false"` la saca. Como `pdflineas`, sólo tiene efecto en campos con contenedor interno. #### `PDFtopMargin` `entero` · opcional **No es un margen en mm**: suma N **líneas** al alto de la fila, y sólo en campos que embeben otro contenedor (una grilla o una ficha hija). En un campo común no hace nada. #### `PDFwidth` texto · opcional Ancho de la grilla embebida de un campo, y en la vista card el ancho de la tarjeta. **No es alias de `PDFcolWidth` ni de `pdfancho`**: son tres anchos distintos — `PDFcolWidth` es el ancho de columna de la tabla PDF y `pdfancho` el de la celda del valor en ficha. La grafía es exacta: `pdfwidth` en minúscula no la lee nadie. #### `posx` texto · opcional Posición X de la celda, en mm desde el borde izquierdo de la página. Para desplazar en relativo respecto de donde iría la celda está `offsetX`, que se suma siempre. #### `posX` texto · opcional Alias camelCase de `posx`. #### `posy` texto · opcional Posición Y de la celda en mm, con **tres formas mágicas** además de la coordenada absoluta: `posy="-1"` la ubica debajo de todo lo ya impreso; `posy="0"` o el atributo ausente la deja en la misma línea que el campo anterior; `posy="+N"` (con el `+`) la ubica N mm debajo de lo ya impreso. Para desplazar en relativo también está `offsetY`. #### `posY` texto · opcional Alias camelCase de `posy`. ## idGrup Identificación del campo y pasaje de valores entre los XML de un movimiento. Atributos de identificación de campos/elementos. **6 atributos.** Lo aceptan: [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field). ### `alias` texto · opcional Alias SQL de la columna. **No es sólo un nombre alternativo: reemplaza el prefijo de tabla con el que se califica la columna**, pisando la tabla base del `<histrix>` y lo que diga `tabla`. Si el valor no es un alias de tabla realmente presente en el `FROM`, la consulta sale con SQL inválido y sin ningún aviso. Sirve para resolver colisiones de nombres en JOINs, teniendo presente que lo que se escribe es el prefijo, no el `AS`. ### `id` texto · **obligatorio** Identificador del campo. Coincide con el nombre de columna en la tabla SQL (salvo `local="true"` o `<expression>`). ### `id_cab` texto · opcional Referencia al `id` del campo cabecera del que depende este detalle. Usado en INSERT/UPDATE de grids. ### `id_padre` texto · opcional En INSERT de grid embebido: toma el valor del campo del formulario padre. Útil para propagar la PK del padre al detalle. ### `id_temp` texto · opcional En INSERT: toma el valor del campo temporal (de la tabla base del grid) en lugar del campo de la fila actual. ### `lastId` texto · opcional Trae a este campo el id autogenerado por otro movimiento. **El valor no es un booleano ni "el INSERT anterior": es el nombre del XML de movimiento** del que se toma el id, así que hay que nombrarlo exactamente. Sólo aplica a campos de XMLs de `<movimientos>`, y además de llenar el campo publica el placeholder `[__nombre__]` (el mismo nombre que se escribió) para reutilizar ese id en el resto del movimiento. ## ImagenGrup Dimensiones y escala de un campo que muestra una imagen. Atributos para campos de tipo imagen. ### `grafico` texto · opcional Sin descripción en el schema. ### `imageHeight` `entero` · opcional Sin descripción en el schema. ### `imageScale` `número` · opcional Sin descripción en el schema. ### `imageWidth` `entero` · opcional · default `100` Ancho de la imagen del campo, en píxeles. **El `default="100"` vale sólo donde el atributo se respeta**: campos `<tipo>grafico</tipo>` y dos ramas de la impresión. En campos `file` el ancho por defecto es el que calcula el motor, y una de las ramas del PDF arranca en 50. Fuera de esos casos escribirlo no cambia nada. ## KanbanGrup Atributos para campos de un tablero `tipo="kanban"`. A diferencia del grupo `calendar*`, que marca el campo por **presencia** del atributo, acá el papel se declara con el **valor** (`kanban="title"`): un único atributo por campo, con la lista de roles cerrada. **1 atributos.** Lo aceptan: [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field). ### `kanban` [`KanbanRol`](https://docs.histrix.com.ar/es/schema/tipos/#kanbanrol) · opcional Papel del campo dentro de la tarjeta: `title`, `body`, `tag`, `person`, `age`, `color` o `action`. Un campo sin este atributo no se dibuja en la tarjeta, aunque siga estando en la consulta —así se declaran el campo de estado (`statusField`) y la clave, normalmente con `noshow="true"`. `tag` y `action` admiten varios campos; el resto, uno. El tablero necesita al menos un campo con `kanban="title"`. ## CalendarGrup Mapeo de campos para la vista de calendario: cada atributo marca qué campo cumple ese rol en el evento. Atributos para campos de tipo calendario. **15 atributos.** Lo aceptan: [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field). ### `calendarCheck` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional En vistas de calendario marca el campo que se muestra como casilla de tildar al lado de cada evento en el panel de listado. Tildarla o destildarla graba 1 o 0 en ese campo del registro en el momento, sin abrir el formulario, avisa el resultado y refresca el calendario. Trampa: para saber qué registro actualizar usa el campo marcado con calendarId, sin ese campo no graba; y como se detecta por presencia, calendarCheck="false" lo prende igual. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### `calendarColor` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo cuyo valor pinta el fondo del evento. **Se evalúa por presencia**: cualquier valor lo activa, incluido `"false"`; para desactivarlo hay que omitir el atributo. ### `calendarDescription` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo cuyo valor es la descripción del evento. **Se evalúa por presencia**, como todo el grupo `calendar*`: `"false"` lo marca igual; para que no participe hay que omitir el atributo. ### `calendarEditable` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que habilita la edición del evento desde el calendario. **Se evalúa por presencia**, como todo el grupo `calendar*`: cualquier valor lo marca, incluido `"false"`; para que el campo no participe hay que omitir el atributo. ### `calendarEndDate` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que aporta la fecha de fin del evento. **Se evalúa por presencia**: `"false"` lo marca igual; para que no participe hay que omitir el atributo. `calendarStopDate` escribe **la misma** propiedad, así que declarar uno en un campo y el otro en otro deja la fecha de fin indefinida: usar uno solo. ### `calendarEndTime` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que aporta la hora de fin del evento. **Escribe la misma propiedad que `calendarStopTime`**: son dos nombres para el mismo dato, y declarar uno en un campo y el otro en otro deja la hora de fin indefinida. **Se evalúa por presencia**: `"false"` lo marca igual; para que no participe hay que omitir el atributo. ### `calendarId` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que aporta el identificador del evento. **Se evalúa por presencia**, como todo el grupo `calendar*`: `calendarId="false"` lo marca igual; para que no participe hay que omitir el atributo. ### `calendarRecurringRule` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que lleva la regla de repetición del evento. **Se evalúa por presencia**: `"false"` lo marca igual y el `default="false"` declarado no equivale a omitirlo. La única forma de que el campo no aporte la regla es no escribir el atributo. ### `calendarStartDate` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que aporta la fecha de inicio del evento. **Se evalúa por presencia**: `"false"` lo marca igual; para que no participe hay que omitir el atributo. Tiene además un fallback: si ningún campo lo declara, el calendario usa el **primer campo de tipo fecha** del XML. ### `calendarStartTime` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que aporta la hora de inicio del evento. **Se evalúa por presencia**, como todo el grupo `calendar*`: `"false"` lo marca igual; para que no participe hay que omitir el atributo. ### `calendarStopDate` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional En vistas de calendario marca el campo que tiene la fecha de fin del evento, y con eso el evento se dibuja abarcando hasta esa fecha; al arrastrar o estirar el evento, la fecha nueva se escribe en ese campo. Es exactamente lo mismo que calendarEndDate: los dos apuntan al mismo lugar interno, así que ponerlos en campos distintos es ambiguo y gana el último que aparezca en el XML. Si ningún campo lo declara, el fin se toma del primer campo de tipo fecha. Se detecta por presencia: con "false" también queda marcado. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### `calendarStopTime` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo como hora de fin del evento. **Es el mismo dato que `calendarEndTime`** (los dos escriben la misma propiedad): declarar uno en un campo y el otro en otro deja la hora de fin indefinida. Como el resto de los `calendar*` de campo, el motor sólo mira que el atributo **esté presente**, no su valor: `calendarStopTime="false"` marca el campo igual. ### `calendarSubject` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo cuyo valor es el título del evento en el calendario. **Se evalúa por presencia**: cualquier valor lo marca, incluido `"false"`, y el `default="false"` declarado no equivale a omitirlo. Para que el campo no sea el título hay que no escribir el atributo. ### `calendarSum` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional No produce ningún efecto. El motor lo reconoce y se acuerda de qué campo quedó marcado, pero después nadie usa ese dato: no totaliza nada ni muestra nada en el calendario. Para totalizar una columna el atributo vivo es suma. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### `calendarTextColor` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que aporta el color del texto del evento. Se evalúa por presencia, igual que `calendarColor`: cualquier valor lo activa, incluido `"false"`; para desactivarlo hay que omitir el atributo. ## UiFlags El conjunto más grande del schema. Lo comparten `<field>`, `<campo>`, `<fieldGroup>` y `<label>`, porque el parser copia los atributos de los tres últimos al mismo objeto de campo. Atributos de control de UI/visibilidad/estado para `<field>` y `<fieldGroup>`. Cubre: visibilidad, edición, validación, exportación, búsqueda, formato y propagación entre formularios. **164 atributos.** Lo aceptan: [`<campo>`](https://docs.histrix.com.ar/es/schema/campos/#campo), [`<field>`](https://docs.histrix.com.ar/es/schema/campos/#field), [`<fieldGroup>`](https://docs.histrix.com.ar/es/schema/campos/#fieldgroup). ### Identificación y datos #### `idName` texto · opcional Hace que la columna destino se resuelva en tiempo de ejecución: en vez de grabar en la columna que corresponde al id del campo, graba en la columna cuyo nombre sale del valor de otro campo del formulario, que es el que se nombra acá. Permite altas contra columnas variables (por ejemplo, elegir la columna del mes a impactar desde un combo). Trampas: si el campo referenciado está vacío o no existe, el campo simplemente no se graba y no hay aviso; y sólo funciona en el alta (insert/replace), en la modificación se ignora por completo. Tampoco actúa sobre campos locales, con expresión, ni de otra tabla que la base. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### Visibilidad y estado #### `noshow` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Oculta el campo en la UI: el input se renderiza con `display:none` y **queda en el DOM**, así que conserva su valor, se postea y las `<validation>` (client-side) lo siguen encontrando. **Un campo con `noshow="true"` nunca se exporta a XLS/CSV**, ni agregándole `export="true"`: el chequeo del ocultamiento es posterior e independiente. Para tener la columna en el export y no en pantalla va `colstyle="display:none;"`. La única exportación que ignora el ocultamiento es la de XML. No es lo mismo que `oculto`, que directamente no renderiza el campo. #### `oculto` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional **No es alias de `noshow`: son dos mecanismos distintos.** Con `oculto="true"` el campo no se renderiza — no llega al HTML —, se excluye del UPDATE y sale del export. Con `noshow="true"` el input se dibuja con `display:none` y sigue en el DOM. La diferencia importa porque las `<validation>` son client-side y buscan el input: con `oculto` la condición nunca dispara, con `noshow` sí. **`oculto="false"` oculta el campo igual**: cualquier valor no vacío lo activa. Para que el campo se vea hay que omitir el atributo. #### `hidden` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Renderiza el input como `type="hidden"`: **el valor se sigue posteando** y la celda y la etiqueta se dibujan igual, así que no sirve para ocultar el campo. Para eso van `noshow` (lo deja en el DOM) u `oculto` (no lo renderiza). #### `display` texto · opcional **Mueve el campo de lugar en la pantalla de consulta.** Los únicos valores que el motor reconoce son `toolbar` y `filter` (los busca como substring): el campo se renderiza en la barra de herramientas o en la barra de filtros y **deja de tener columna en la grilla**. Cualquier otro valor no hace nada. #### `muestra` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional En un `<field>` dentro de `<tabla_ex>` (la forma legacy del combo): con "true" el texto visible de la opción incluye también la clave, no sólo la descripción. El equivalente en un `<helper type="combo">` es `showKey`. #### `showValor` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **Nada que ver con combos.** Aplica a campos que embeben otro contenedor (los de `showObjTabla` / helper `type="object"`) y decide si, además de la grilla hija, se muestra el valor propio del campo. En un combo no tiene efecto: el atributo parecido que sí vive ahí es `showKey`, que va en el `<field>` del helper. #### `showInForm` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Con showInForm="false" el campo desaparece del formulario de carga (el renglón de inputs de la grilla), pero la columna sigue existiendo en la grilla y el campo sigue formando parte de la grabación y de los cálculos. Es el inverso de esconder la columna: acá se esconde el input y se deja ver el dato. Sólo tiene efecto en las grillas de ingreso y en el abm en línea; en fichas y formularios comunes se ignora en silencio. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `deshabilitado` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Campo de sólo lectura. Los campos con `<expression>` lo asumen automáticamente; `deshabilitado="false"` los fuerza editables — y en los checkbox es además el escape para poder editarlos cuando la vista deshabilitó todos los checks. **Sin `default` declarado a propósito**: el motor lo evalúa con más de un criterio según el tipo de campo, así que escribir el valor por defecto no equivale a omitir el atributo. `disabled` es la otra grafía del mismo flag y tiene **menor precedencia**: si el campo declara las dos, gana `deshabilitado`. #### `disabled` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Otra grafía de `deshabilitado`: **no se emite al HTML**, el motor la normaliza al mismo flag interno. Tiene **menor precedencia** — si el campo declara las dos, gana `deshabilitado`. #### `editable` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Es opt-**in** de la edición inline: `editable="true"` hace editable esta columna dentro de la grilla. **`editable="false"` no bloquea nada** — sólo hace algo acompañando a `linkint`, donde suprime el link. Para que un campo sea de sólo lectura va `deshabilitado`. #### `local` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Campo local: existe en el formulario pero NO se mapea a una columna SQL. **NO funciona junto con `<expression>`**: si el campo tiene expression, el motor ignora `local`. Sólo el literal `local="true"` lo hace local. **`local="false"` y el legacy `local="local"` dejan el campo en el peor estado**: sigue entrando al `SELECT` y al `WHERE` — si la columna no existe la consulta revienta con `1054 Unknown column` — pero queda excluido del INSERT, así que su valor no se graba. Para que el campo sea uno normal hay que omitir el atributo. #### `public` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", expone el valor del campo del form padre al grid hijo embebido (vía sesión PHP). Necesario para que `<if>` del grid lea el valor. #### `open` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En campos `<tipo>file</tipo>`: con "true" la celda muestra un botón para **abrir** el archivo en vez de la miniatura. Hermanos: `download` (descargar), `viewer` (visor embebido) y `svg`. #### `clear` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Con clear="false" el campo conserva el valor que tiene cuando se limpia el formulario (después de grabar, o al pedir uno nuevo), en vez de volver a vacío o a su valor por defecto. Es útil para datos que se repiten carga tras carga, como fecha o depósito. Trampa: no protege a los combos ni a las listas desplegables, que se reinician igual porque se resuelven antes de mirar este atributo. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `lazyLoad` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En una columna que muestra una grilla embebida, evita ejecutar la consulta interna mientras se dibuja el listado: deja un lugar reservado y recién trae el contenido cuando ese renglón se acerca a la pantalla (se anticipa unos 200 píxeles al scrollear). Sirve para listados de muchos renglones donde cada renglón abría su propia consulta. Consecuencia: si el renglón nunca se llega a ver, esa consulta no se hace nunca, y el contenido cargado así no está disponible al imprimir o exportar el listado. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### Clave y grabación #### `esClave` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo como clave primaria: entra al `WHERE` y al UPDATE, y su input queda obligatorio. Para claves compuestas, marcar todos los campos que la forman. Es crítico en las ayudas popup: si ninguna columna está marcada, elegir una fila no llena el campo destino. **`esClave="false"` no desactiva nada**: el campo se sigue tratando como clave. Para que no lo sea hay que omitir el atributo. #### `esclave` texto · opcional Forma legacy **en minúscula**, y no es lo mismo que `esClave`: funciona como su **negador**. Con `esClave="true" esclave="false"` el campo deja de tratarse como clave — que es el único modo de desactivarlo, porque `esClave="false"` no lo desactiva. Es una rareza heredada: en código nuevo, si el campo no es clave, no declarar `esClave`. #### `autoinc` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo como autoincremental (PK con `AUTO_INCREMENT`): el motor lo excluye del INSERT y después recupera el id generado para rellenarlo. **`autoinc="false"` no es lo mismo que omitir el atributo**: el campo queda excluido del INSERT igual — su valor no se graba, en silencio — y la recuperación del id, que exige el literal `"true"`, no corre. O sea que no se inserta ni se rellena. Para que el campo grabe como uno normal hay que omitir el atributo. #### `autoing` texto · opcional Se emite como atributo del input para que el ingreso de la fila avance solo al completar el campo (grids `ing`). Se usa junto a `<complete>`. #### `update` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` `update="false"` excluye el campo del UPDATE generado. **No lo pone read-only**: el input se sigue editando y lo que se tipea simplemente no se graba; para bloquear la edición va `deshabilitado`. La comparación es contra el literal en minúscula: `update="FALSE"` no hace nada. #### `noupdate` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional **No es el inverso de `update` y no toca el SQL** (para dejar un campo afuera del UPDATE va `update="false"`). Viaja al HTML y se evalúa **por presencia** en el browser: en un combo evita que los atributos del `<option>` elegido se propaguen a los campos homónimos del formulario. Cualquier valor lo activa, incluido `"false"`; para desactivarlo hay que omitir el atributo. #### `noEmpty` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Con `"true"` **oculta la columna entera** cuando ninguna fila del resultado tiene valor en ese campo — no suprime filas — y omite su total al pie si la suma da 0. Útil en consultas con columnas que sólo tienen sentido para ciertos filtros. #### `replace` texto · opcional **No reemplaza texto en el valor mostrado.** Es un flag (`replace="true"`) que marca al campo destino de un `<detalle>` como **clave de matching** cuando los datos vuelven de un `<importar>`: es el campo por el que el motor busca el renglón del grid que tiene que actualizar. Equivale a marcarlo `esClave` sólo para ese ida y vuelta. #### `forceCellValue` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Escape de `suma`: en un campo con `suma="true"` que se pasa como `<parameter>` a otro XML, lo que viaja es el total acumulado de la columna; con `forceCellValue="true"` viaja el valor de la fila. **Sin `suma` no hace nada**, y no tiene relación con `<expression>`. #### `rememberValue` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Conserva el valor del campo entre sesiones del mismo usuario (persistencia en perfil). #### `onClearForm` [`OnClearFormValor`](https://docs.histrix.com.ar/es/schema/tipos/#onclearformvalor) · opcional Con onClearForm="uniqid", cada vez que se limpia el formulario el campo se rellena con un identificador único nuevo (13 caracteres hexadecimales) en lugar de quedar vacío. Sirve para tokens o claves temporales que tienen que ser distintas en cada carga. Es el único valor que el motor reconoce: cualquier otro texto no hace nada. No aplica a combos ni listas desplegables, y se ejecuta aun cuando el campo tenga clear="false". **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### Validación #### `mandatory` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Vuelve obligatoria la condición de ese campo: si el campo no llegó a tener ninguna condición armada (por ejemplo, un filtro que el usuario dejó vacío), la consulta no se ejecuta —ni la de datos ni la del contador— y la pantalla queda vacía con cero registros, sin ningún mensaje. Sirve para listados pesados que no deben traer nada hasta que se elija un filtro. Dos trampas: alcanza con que el atributo esté escrito con cualquier valor para que actúe, incluso mandatory="false" (sólo lo apagan el valor 0 o el vacío, o sacar el atributo); y si el campo es local nunca genera condición, así que la pantalla queda vacía para siempre. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `validar` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Activa la validación obligatoria del campo (similar a `required`). **Sin `default` declarado a propósito**: `Data/Field:2076` trata la ausencia como validar (`== 'false'` para desactivar) y `View/UI:1079` exige "true" explícito. #### `errorMessage` texto · opcional Mensaje que aparece si la validación del campo falla. #### `mask` texto · opcional Máscara de entrada (formato `9999-9999-X`, etc.). #### `maxlength` `entero` · opcional Atributo HTML `maxlength` del input. #### `maxsize` `entero` · opcional **Es alias de `maxlength`, no del `size` del input**: limita la cantidad de caracteres que se pueden tipear. El ancho visible sale del elemento `<size>`. Usarlo creyendo que es ancho termina truncando el dato. #### `max` `entero` · opcional Valor numérico máximo permitido. #### `min` `entero` · opcional Valor numérico mínimo permitido. #### `noZero` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No valida nada: es presentación.** Con `noZero="true"` el valor 0 se muestra como celda vacía en lugar de "0". No rechaza el cero ni impide grabar. #### `cuit` texto · opcional Se copia tal cual al campo del formulario, pero nada en la interfaz lo mira: no valida ni formatea nada, así que escribirlo no cambia el comportamiento. La validación de CUIT de verdad —dígito verificador y máscara 99-99999999-9— la da el tipo de dato cuit del campo, no este atributo. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `email` texto · opcional Dirección de email asociada al campo (para botón "enviar mail"). #### `cellMaxLength` `entero` · opcional Corta el texto de la celda a N caracteres en la grilla (el valor completo se sigue guardando y viaja al formulario). Útil para columnas de observaciones que ensanchan la tabla. #### `forceSize` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Levanta el recorte automático del ancho del input en el formulario de carga de una grilla de ingreso. Sin este atributo, un campo con tamaño declarado mayor a 40 se dibuja igual con 40 de ancho en las grillas de ingreso; con forceSize="true" se respeta el tamaño declarado, con el techo general de 77 que sigue valiendo en todo lo que no sea ficha. Sólo afecta el ancho del input, no el de la columna de la grilla. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `numberPrecision` `entero` · opcional Cantidad de decimales para campos numéricos. ### SQL y consulta #### `tabla` texto · opcional Nombre de la tabla SQL a la que pertenece la columna. Requerido cuando varias tablas del JOIN tienen una columna con el mismo nombre (evita SQL ambiguo). #### `oplogico` texto · opcional Operador lógico con el que la condición de este campo se une a la **anterior**: `"and"` (default) | `"or"`. Ojo con el nombre: conecta hacia atrás, no con la condición siguiente. Efecto lateral de `"or"`: se pierde el reemplazo, así que la condición se **agrega** a la que el mismo campo ya hubiera puesto en vez de sustituirla, y el campo termina aportando dos condiciones ORadas. #### `having` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional **No es una condición: es un flag de ruteo.** Decide si la `<condicion>` de este campo va al `HAVING` o al `WHERE`. **Sólo tiene efecto si el campo tiene `<expression>`**, y el default depende del motor: en MySQL/SQLite la *ausencia* manda la condición al `HAVING` y `having="false"` la baja al `WHERE`; en **SQL Server es al revés** — hace falta `having="true"` explícito. Por eso no se declara un `default` acá. Se puede escribir en el `<field>` o en el `<expression>`, que es la forma dominante en el repo. En una `<condicion>` **no** se lee. #### `noselect` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No es UI, es SQL.** `noselect="true"` saca el campo de la lista del `SELECT` pero conserva sus `<condicion>` en el `WHERE`/`HAVING`: es la forma de filtrar por una columna sin traerla, el caso típico de los filtros sobre consultas agrupadas. Requiere el literal `"true"`. #### `fullSearch` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Cambia cómo se arma la condición **de este campo**: parte el texto buscado por espacios o comas y ANDea un `like '%palabra%'` por cada token sobre la misma columna, así que "juan perez" matchea aunque las palabras vengan en otro orden o con texto en el medio. **No tiene relación con `conBusqueda`**, que es otra función y no interviene. #### `sort` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Si "false", desactiva el ordenamiento por esta columna en la grilla. Ojo que `repeat="false"` (o `norepeat="true"`) lo desactiva también, como efecto lateral. #### `orderType` [`OrdenTipo`](https://docs.histrix.com.ar/es/schema/tipos/#ordentipo) · opcional Dirección de orden por defecto del campo: `"ASC"` | `"DESC"`. **`tipoOrden` no es un alias simétrico**: si están los dos escritos gana `tipoOrden`. Y el orden de la **tabla temporal** sólo reconoce `"DESC"` en mayúscula, así que `orderType="desc"` ordena el SQL pero deja la memoria en ascendente. Escribirlo siempre en mayúscula. #### `suma` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Totaliza la columna al pie en grillas, consultas y PDF. **Efecto lateral**: si el campo se pasa como `<parameter>` a otro XML, lo que viaja es el total acumulado y no el valor de la fila; para mandar el de la fila hay que agregar `forceCellValue="true"`. Al imprimir, el motor sólo mira si el atributo está presente, no su valor: `suma="false"` totaliza igual, y para no totalizar hay que omitirlo. #### `treeSum` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional No produce ningún efecto en el motor actual. Era el atributo con el que el árbol viejo acumulaba los importes de los hijos hacia los nodos padre; ese renderizador se reescribió y hoy la suma hacia arriba del árbol se declara con suma. Si tenés XMLs que todavía lo traen, ese campo no está sumando nada por este atributo. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `liveSum` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Le agrega una marca a la celda de esa columna, pero hoy esa marca no la usa nadie: no hay estilo asociado ni cálculo que la lea, así que el atributo no produce ningún efecto visible. Se activa con cualquier valor —incluido liveSum="false"— y se apaga sacando el atributo. Para totalizar una columna en vivo el atributo que sí funciona es suma. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `grupo` texto · opcional **No agrupa radios ni arma fieldsets.** Tiene dos usos: en un campo de la tabla, cuando el campo aporta una condición **activa el `<join grupo="…">` del mismo nombre** (JOIN condicional: la tabla se suma sólo si se filtró por ese campo); y dentro de `<filters>` agrupa los filtros de la barra. ### Estilo y presentación #### `style` texto · opcional CSS inline del campo. **No separa el `<td>` del input**: `style`, `Formstyle` y `formStyle` terminan los tres aplicados al input **y** al `<td>`, y **se concatenan sin `;` de separación** — `style="color:red"` junto con `Formstyle="width:5em"` produce `color:redwidth:5em` y se pierden las dos reglas. Conviene usar uno solo por campo; si se usan varios, cerrar cada valor con `;`. #### `colstyle` texto · opcional CSS inline de la columna en grillas. `colstyle="display:none;"` oculta la columna pero conserva el campo en el form vertical de entrada y **sí lo exporta a XLS/CSV**: es la forma de tener una columna en el export sin mostrarla en pantalla, que `noshow` no permite. En el PDF, en cambio, una columna oculta así queda excluida igual que con `noshow`, y `print="true"` no la recupera. #### `filterStyle` texto · opcional CSS inline del campo en la barra de filtros. Útil para angostar (`width:0em;`) o resaltar un filtro, pero **no queda contenido ahí**: al armar la barra el motor pisa con este valor el `style` del campo y no lo restaura, así que el mismo CSS puede reaparecer después en la celda de la grilla y en el formulario. #### `Formstyle` texto · opcional CSS inline del campo. **No es "el del input" en contraposición al `<td>` de `style`**: los dos se aplican al input y al `<td>`, y se concatenan sin `;` de separación. `formStyle` (camelCase) tampoco lo reemplaza: se suma. Ver la trampa completa en `style`. #### `formStyle` texto · opcional Tercera grafía del CSS inline del campo. **No reemplaza a `Formstyle`**: si están los dos, los valores se suman, y sin `;` de separación entre ellos. Ver `style`. #### `getStyle` texto · opcional Nombre de un campo del row cuyo valor se usa como CSS inline del campo actual (ej. `getStyle="color_celda"` aplica `style` desde la columna `color_celda` de la fila). #### `buttonStyle` texto · opcional CSS inline aplicado al botón generado por el campo (usado en `tipo="button"` o helpers tipo link). También válido a nivel `<fieldGroup>` para estilar todos sus botones. #### `imageStyle` texto · opcional En campos de archivo que se muestran como miniatura, se inyecta tal cual como estilo inline de la imagen (por ejemplo para redondear una foto de perfil). Se aplica **sólo a la miniatura**: si el campo está configurado para abrirse con botón o con visor, o si el archivo es un SVG, no llega a usarse. No confundirlo con `style`, que estiliza la celda; y no sirve para el ancho, que lo sigue definiendo el `<size>` del campo. #### `titleColor` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Sirve únicamente en la vista de árbol cuando se la pide dibujada como imagen. Marcado en un campo cuyo valor es un color en hexadecimal, ese color se usa para el título de cada nodo del dibujo. Si en cambio se usa textColor, el color va al cuerpo del nodo y el título se calcula solo, 25 tonos más oscuro; titleColor es para fijarlo a mano. Trampa: exige color="true" en el mismo campo y valor no vacío, y no tiene ningún efecto en el árbol HTML normal. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `Class` texto · opcional Clase CSS del `<td>` de la celda en la grilla. **No es alias de `clase`**, que va a la `class` del input: cambiar uno por el otro no produce el mismo HTML. #### `clase` texto · opcional Clase CSS del **input** del campo, y de la celda en columnas editables. A nivel campo **no tiene default**. No es alias de `Class`: ése va a la clase del `<td>` de la grilla. Cambiar uno por el otro no produce el mismo HTML. El mismo nombre existe además a nivel `<histrix>`, y ahí sí tiene default — en un grid `ing` vale `ParentingClass` y en otras vistas la clase por defecto de la vista. Ese default **no aplica al campo**. #### `colspan` `entero` · opcional Atributo HTML `colspan` del `<td>` contenedor. #### `rowspan` `entero` · opcional Atributo HTML `rowspan` del `<td>` que contiene el campo. #### `labelColspan` `entero` · opcional Atributo HTML `colspan` de la celda de la **etiqueta**, no la del input — para esa está `colspan`. El valor pasa crudo al HTML. **Se ignora si el campo tiene `sincelda="true"`**: ahí la etiqueta se emite sin `<td>` y las propiedades de celda no aplican. Escrito en minúscula (`labelcolspan`) no lo lee nadie: la grafía se compara exacta. #### `modpos` texto · opcional Modificador de posición de la celda. `"nobr"` evita el salto de línea (mantiene la siguiente celda en el mismo renglón en forms verticales de grids `ing`). #### `tdWidth` texto · opcional Ancho de la celda del campo. **No es CSS**: se emite como el atributo HTML `width` del `<td>` y como ancho de la columna en la grilla, así que sólo acepta píxeles o porcentaje — `tdWidth="10em"` lo ignora el navegador. #### `height` texto · opcional Alto del control. Usado en tipo `file` (image upload), `qr` (alto del código QR, default 240) y campos similares. Acepta px o valor numérico. #### `size` texto · opcional **No es el `size` del input** — ése sale del elemento `<size>`. Como atributo en minúscula sólo tiene efecto en campos `geoPoint`, donde fija el zoom/tamaño del mapa. #### `lblsize` `entero` · opcional **Ancho de la celda de la etiqueta en el PDF** de una ficha, no tamaño de fuente, y sin ningún efecto en HTML. El ancho de la celda del valor es `pdfancho`. Para el tamaño de la etiqueta va el atributo `size` del `<label>`. #### `cols` `entero` · opcional Atributo HTML `cols` para `<textarea>`. #### `color` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No dibuja un swatch**: toma el valor del campo como color y lo aplica de `background-color` al input y a la celda, con el texto encima. El valor tiene que ser un color válido para CSS. #### `pintado` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Hace que, cada vez que Histrix llena el formulario con los datos de un renglón de la grilla, el contenido de ese campo quede seleccionado (pintado), de modo que la primera tecla que toque el usuario lo reemplace en vez de agregarse. Trampa: se activa por presencia del atributo, así que pintado="false" también lo prende; para apagarlo hay que borrar el atributo. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `watermark` texto · opcional **No es el placeholder del input: es exclusivo del PDF.** Estampa el texto como marca de agua sobre la imagen de un campo `file` al imprimir; en HTML no hace nada. Si el valor coincide con el `id` de otro campo del XML, se usa el **valor** de ese campo en lugar del texto literal, así que la marca puede salir de un dato de la fila. #### `prefijo` texto · opcional Texto antepuesto al valor del campo en render. También aceptado como elemento `<prefijo>`. #### `icon` texto · opcional Sólo en `<tipo>button</tipo>`: clase de icono del botón (ej. `ui-icon-search`). Junto con `text`, `style`, `tooltip` y `name` es uno de los atributos que el campo-botón pasa al botón que genera. #### `text` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional Sólo en `<tipo>button</tipo>`: con "false" el botón muestra únicamente el icono, sin texto. #### `tooltip` texto · opcional Tooltip del campo. Dos caminos, los dos a nivel `<field>`: en `tipo="button"` se pasa al botón (junto con `icon`, `text`, `style` y `name`), y en la grilla sale como el `title` de la celda — o sea que escribir `title="…"` en el `<field>` termina también acá. **No va en el `<histrix>`**: ahí no lo lee nadie, aunque haya ~716 XMLs con `<histrix tooltip="false">` que no hacen nada. #### `inputType` texto · opcional Fuerza el control con el que se dibuja el campo sin cambiarle el tipo de dato. Los valores que cambian algo son `textArea` (caja multilínea) y `select` (lista desplegable); cualquier otro cae en el input común. **Es la opción de menor prioridad** y la pisan varias cosas: si el campo tiene combo u opciones pasa a lista, si su tipo ya impone un control (archivo, fecha) gana el tipo, y si el `<size>` es 100 o más el motor lo pasa a multilínea por su cuenta. El valor no queda en el HTML, así que no hay rastro en el input para diagnosticar. #### `multiple` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Permite múltiples valores (en selects o file inputs). #### `break` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No es un salto de línea, es un corte de control.** `break="true"` convierte el campo en campo de corte del listado: cada vez que su valor cambia entre filas se cierra el grupo y se emiten los subtotales y promedios parciales — agrupando las filas en la grilla y en el PDF. El salto de línea lo controla `modpos`. #### `sincelda` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Si "true", el campo se renderiza SIN su `<td>` contenedor. Útil para juntar inputs en la misma celda. #### `transparent` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Acompaña a color="true" (o a un campo de tipo color): además de pintar el fondo de la celda y del input con el color que trae el valor, pinta el texto de ese mismo color, así que el código hexadecimal queda invisible y se ve solamente el recuadro pintado. Aplica tanto en la columna de la grilla como en el input del formulario. Trampa: solo se activa escribiendo "true", y si el campo no tiene color="true" (ni es de tipo color) no hace absolutamente nada. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `avatar` texto · opcional En campos de archivo o imagen: nombre de otro campo de la misma consulta que actúa de reemplazo cuando el archivo no existe. En vez de dejar la celda vacía dibuja un círculo con las iniciales del texto de ese campo, del tamaño que indique el `<size>`. Sólo actúa en la celda de la grilla o listado, y sólo cuando falta la imagen: si el archivo existe se muestra la foto y el atributo se ignora. #### `svg` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En campos de archivo cambia la forma de insertar la imagen en la grilla o el formulario: la marca como contenido SVG y la pide sin el parámetro de ancho, así que sale en su tamaño natural en lugar de escalada al ancho del campo. Como toma ese camino alternativo, ese render pierde las clases de zoom, el texto alternativo y el imageStyle del campo. Trampa: es hermano de download, open y viewer, y cualquiera de esos tres gana si está puesto, dejando a svg sin efecto. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. ### Interacción entre campos #### `activa` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Marca el campo como **controlador**: habilita o deshabilita en el browser los campos que lo referencian con `activador`. No recalcula valores, y si ningún campo le apunta con `activador` no hace nada. #### `activador` texto · opcional `id` del campo del que depende **este** campo: nace deshabilitado mientras el campo referenciado no valga exactamente `1` (con `"S"`, `"true"` o `"X"` queda deshabilitado). Para que se habilite en vivo al cambiar el otro campo, ese campo tiene que llevar `activa="true"`. #### `habilita` texto · opcional **La dirección es la inversa de lo que sugiere el nombre.** El valor es el `id` del campo **controlador**, y el que se deshabilita es **este** campo: con `habilita="pagado"`, este campo queda deshabilitado mientras `pagado` valga falso. Escribirlo al revés deshabilita el campo equivocado. Se resuelve en el servidor al renderizar y sobre el último valor grabado del controlador — no hay reacción en el browser cuando el controlador cambia. Cuentan como falso sólo `0`, `"0"` y `"false"`. #### `desactiva` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Inverso de `activa` sobre el campo **controlador**: en vez de habilitar, deshabilita en el browser los campos que lo referencian con `activador`. **`habilita` no participa de este mecanismo.** #### `copia` texto · opcional **La dirección es la inversa de lo que sugiere el nombre.** El valor es el `id` del campo **destino**: al cambiar este campo, su valor se copia **hacia** el campo nombrado. Escribirlo esperando traer el valor del otro campo no copia nada. #### `onRefresh` texto · opcional Comportamiento al refrescar la fila/form. Ej: "focus" devuelve el foco al campo después del refresco. #### `repeat` texto · opcional **Son dos atributos distintos con el mismo nombre, según el tag donde se escriba.** Este `attributeGroup` lo comparten `<field>` y `<fieldGroup>`, así que la declaración es una sola pero la semántica no: - En `<fieldGroup repeat="N">` = **loop**: clona el grupo N veces. El valor puede ser un número o el `id` de un campo que contenga el número; dentro del grupo queda disponible el sufijo `__repeat__`. - En `<field repeat="false">` = **no repetir el valor** en filas consecutivas iguales de la grilla, y además desactiva el ordenamiento de esa columna. Es equivalente a `norepeat="true"`. Un número en un `<field>` no hace nada: sólo se compara contra el literal "false". #### `norepeat` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional En grillas y en el PDF, no vuelve a imprimir el valor de la columna en filas consecutivas que lo repiten: sólo se ve en el primer renglón de cada bloque. Efecto lateral: **también desactiva el ordenamiento de esa columna**. `repeat="false"` en el `<field>` es la otra forma de escribir lo mismo. #### `autocomplete` [`ModoAutocompletado`](https://docs.histrix.com.ar/es/schema/tipos/#modoautocompletado) · opcional **No es el `autocomplete` de HTML: es el modo del helper de ayuda del campo.** Valores con efecto: `"true"` (autocompletar mientras se tipea) y `"full"` (autocompletar más botón que abre el popup de ayuda). `"on"` y `"off"` caen al comportamiento por defecto: no prenden ni apagan nada. Alias español: `autocompletar`. #### `autominchars` `entero` · opcional Cantidad mínima de caracteres antes de disparar el autocompletado (default 3). #### `helpButton` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **Al revés de lo que sugiere el nombre: oculta el input del campo** y convierte el botón del helper de ayuda en un botón etiquetado que abre el popup. Si el campo no tiene helper de ayuda, lo único que hace es esconder el input y dejarlo sin forma de cargarse. #### `editableSelect` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional En combos: permite tipear texto libre además de elegir de la lista. **Trampa: `editableSelect="false"` lo activa igual**, y el `default="false"` declarado no equivale a omitirlo. La única forma de tener un combo cerrado es no escribir el atributo. #### `selectExpand` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Renderiza el combo como listbox de 5 filas visibles (`size="5"` en el `<select>`), **siempre, no al hacer foco**: la lista queda desplegada todo el tiempo y ocupa el alto de 5 opciones. #### `ignoreOption` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` **No ignora la opción vacía del combo: hace lo contrario de descartar el valor.** Cuando el valor guardado no figura entre las opciones, con `"true"` se muestra ese valor crudo en la celda en vez de dejarla vacía. Sirve para no perder de vista datos históricos cuyo código ya no está en la tabla de opciones. #### `enablecopy` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional **No agrega ningún botón de copiar.** En campos con `<expression>` o deshabilitados evita el atributo HTML `disabled` y deja el input en `readonly`, que es lo que permite seleccionar el texto con el mouse para copiarlo. ### Enlaces #### `linkdes` texto · opcional Texto descriptivo del link cuando el campo es renderizado como enlace. #### `linkWidth` texto · opcional Ancho de la ventana que abre el `linkint` de este campo. Hay dos formas de setear lo mismo y al motor le da igual cuál se use: `linkWidth` en el `<field>`, o `width` dentro de un `<helper type="link">`. **Se ignora si el campo tiene `linktab="true"`**: con eso el link abre en una pestaña del navegador y no se le pasa ni ancho ni alto. #### `linkHeight` texto · opcional Alto de la ventana que abre el `linkint` de este campo. Mismo mecanismo y misma excepción que `linkWidth`: con `linktab="true"` no se aplica. #### `linkmodal` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Si "true", el link del campo abre en modal en vez de nueva pestaña. #### `linktab` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", el link del campo abre en nueva tab del navegador. #### `download` texto · opcional **Es un booleano, no un nombre de archivo.** Con `download="true"` la celda de un campo `file` muestra un botón de descarga en lugar de la miniatura. Tiene hermanos con la misma mecánica que el XSD todavía no declara: `open`, `viewer` y `svg`. #### `viewer` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En campos `<tipo>file</tipo>`: con "true" la celda muestra un botón que abre el archivo en el **visor embebido** en vez de la miniatura. ### Árbol #### `Arbol` texto · opcional Rol del campo en una estructura jerárquica. Valores reales: "padre" (columna que apunta al nodo padre), "hijo" (clave del nodo, la que se usa para recursionar), y para árboles nested-set "left" | "right" | "order" (con fallback a las columnas `lft`/`rgt` si no se declaran). **Preferir la grafía en minúscula `arbol`, no ésta.** Escribiendo `arbol` el motor setea *las dos* propiedades y quedan contentos todos los lectores. Escribiendo `Arbol` sólo queda la mayúscula, y entonces fallan los lectores que buscan la minúscula: el treemap y el organigrama (donde además se usan valores numéricos por nivel) y la vista de árbol. En el repo hay 0 usos de `Arbol=` y 71 de `arbol=`. #### `arbol` texto · opcional **Grafía recomendada** para el rol del campo en el árbol (mismos valores que `Arbol`). Es la única que funciona en todos los caminos: escrita así, el motor setea *además* la propiedad con mayúscula, así que la leen tanto la construcción del árbol y de la consulta (que buscan la mayúscula) como los gráficos y la vista de árbol (que buscan la minúscula). La normalización es unidireccional: al revés no funciona. #### `nodeTitle` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En un `tipo="arbol"`, usa este campo como título de cada nodo **en el gráfico** del árbol, no en el árbol HTML. Pisa el default, que es el campo `esClave` — o sea que sin este atributo cada caja del gráfico se rotula con el id. Se ve sólo al abrir el botón "vista de árbol", que aparece únicamente cuando la vista es un árbol. Requiere el literal `"true"`. ### Exportación #### `export` [`BoolTrueFalse`](https://docs.histrix.com.ar/es/schema/tipos/#booltruefalse) · opcional **Sólo puede excluir, nunca incluir.** `export="false"` saca el campo del XLS/CSV; `export="true"` no agrega nada, porque el ocultamiento se chequea después y por separado: un campo con `noshow="true"` u `oculto="true"` **nunca** se exporta, ni con `export="true"`. Para tener la columna en el export y no en pantalla va `colstyle="display:none;"`. La única exportación que ignora el ocultamiento es la de XML. #### `xlsFormat` texto · opcional Formato de celda aplicado al exportar a planilla, en el format string de la planilla (ej. `"#.##0,00"`). Sobreescribe el formato que el motor elige según el `<tipo>` del campo. #### `xmlField` texto · opcional · default `field` Nombre del tag XML usado al exportar este campo con `tipo="exportXML"`. Default: "field". #### `xmlCdata` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` En la exportación a XML, `xmlCdata="false"` emite el valor del campo **crudo**, sin envolverlo en `<![CDATA[…]]>`. El motor envuelve por defecto y **sólo reacciona al literal `"false"`**: con `"true"` o cualquier otro valor el CDATA se mantiene, así que escribirlo en positivo es redundante. Se usa cuando el campo ya contiene XML anidado y el CDATA lo escaparía, dejando los tags como texto en la salida. #### `rss` texto · opcional **No es una URL: es el nombre del elemento del `<item>` que este campo alimenta** cuando el contenedor se exporta como feed RSS. Valores útiles: `title`, `description`, `link`, `pubDate`. El mapeo va del campo al feed, no del feed al campo. #### `htmlspecialchars` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional Con "true" escapa el valor del campo al mostrarlo, de modo que el HTML que venga en el dato se vea como texto en vez de interpretarse. Requiere el literal "true". ### Imagen y PDF #### `PDFimg` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional En la impresión PDF de fichas, tarjetas y etiquetas hace que el contenido del campo se dibuje como imagen dentro de la celda en lugar de imprimirse como texto (el texto de la celda pasa a ser la palabra "Imagen"). Sólo el valor "true" lo activa. El ancho se saca de un parámetro ancho que tiene que venir dentro del propio valor del campo, como en los enlaces a miniaturas; si no viene, la imagen sale a su tamaño natural y normalmente desborda la celda. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `PDFtitle` texto · opcional Texto que se imprime como renglón de título, con fondo, arriba de la grilla embebida de un campo cuando el comprobante sale en PDF; además se reserva un renglón extra de alto para ese título. Sólo aplica a campos declarados como tabla embebida, y hay una condición fácil de pasar por alto: el título se dibuja únicamente si el campo también trae declarado showValor; el alto extra, en cambio, se reserva siempre, así que sin showValor queda un renglón vacío. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `pdfancho` texto · opcional Ancho de la celda del **valor** en el layout vertical del PDF de una ficha. El ancho de la **etiqueta** es `lblsize`. No tiene nada que ver con `PDFcolWidth`, que es el ancho de columna de una tabla PDF. Tres formas de setear la misma propiedad: este atributo en el `<field>`, el tag hijo `<pdfancho>` y el atributo `PDFancho` del `<label>`. **`PDFancho` escrito en el `<field>` no lo lee nadie** — hay 250 usos así en el repo que no hacen nada. #### `imageWidth` `entero` · opcional · default `100` Ancho de la imagen del campo, en píxeles. **El `default="100"` vale sólo donde el atributo se respeta**: campos `<tipo>grafico</tipo>` y dos ramas de la impresión. En campos `file` el ancho por defecto es el que calcula el motor, y una de las ramas del PDF arranca en 50. Fuera de esos casos escribirlo no cambia nada. #### `imageHeight` `entero` · opcional Sin descripción en el schema. #### `imageScale` `número` · opcional Sin descripción en el schema. #### `grafico` texto · opcional Sin descripción en el schema. ### Calendario #### `calendarAllDay` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Marca el campo que indica si el evento ocupa todo el día. Como el resto de los `calendar*` de campo, se evalúa por presencia: cualquier valor lo marca. #### `seconds` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` En campos de hora, incluye los segundos en el formato visible. **Trampa: escribir el valor documentado como default apaga la función.** El motor arranca con los segundos prendidos por un `true` booleano interno y compara por identidad estricta; cualquier valor escrito en el XML llega como texto y ya no coincide, así que `seconds="true"` **deja de imprimir los segundos** igual que `seconds="false"`. Para tener segundos hay que omitir el atributo. #### `defaultValue` `entero` · opcional Escrito con V mayúscula actúa sobre el encabezado de la columna, no sobre el campo: el valor se publica en el encabezado y, en columnas de tipo check que muestran el tilde de "marcar todos", defaultValue="1" hace que ese tilde del encabezado arranque marcado. Dos advertencias: que arranque marcado no marca los renglones (los renglones se marcan sólo cuando el usuario clickea el tilde), y únicamente el valor 1 lo activa. Ojo con la confusión de mayúsculas: defaultvalue todo en minúscula es otro atributo distinto, que sí llega al campo del formulario y lo rellena con ese valor al limpiar el formulario o al salir del campo dejándolo vacío. **Ningún XML del repo lo usa**: es una función viva del motor que nadie descubrió, así que no hay ningún uso real contra el que contrastar este comportamiento. #### `defaultvalue` texto · opcional Valor por defecto que se emite al input y que el formulario usa al limpiarse. No confundir con el elemento `<valor>`, que fija el valor inicial del campo server-side. ### Otros #### `import` texto · opcional **Es un opt-out booleano, no un modo de importación.** El único valor con efecto es `import="false"`, que deja el campo afuera de la importación desde archivo; cualquier otro valor, y la ausencia, lo dejan participando. #### `offsetX` texto · opcional Desplazamiento horizontal **en mm** que se suma siempre a la posición de la celda. **No es un booleano**: `offsetX="true"` aborta la impresión con un error de tipo. #### `offsetY` texto · opcional Desplazamiento vertical **en mm** que se suma siempre a la posición de la celda. **No es un booleano**: `offsetY="true"` aborta la impresión con un error de tipo. Y su valor por defecto no es 0 sino el offset superior de página del documento (3 u 8 mm según el caso), así que `offsetY="0"` no equivale a omitirlo: omitido, la celda ya arranca corrida por ese offset. #### `PDFaddPage` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Si "true", fuerza salto de página antes de renderizar este elemento. #### `PDFalign` texto · opcional · default `L` Alineación de la celda: `L` (izquierda), `R` (derecha), `C` (centro), `J` (justificada). **El default declarado acá no es el real**: con el atributo ausente la alineación la decide el tipo del campo — los numéricos salen a la derecha, y `check`, `hora` y `file` al centro. Sólo escribiendo el atributo se fuerza otra. #### `PDFbackgroundColor` texto · opcional Color de fondo de la celda. **Hex de 6 dígitos y sin `#`** (`RRGGBB`): si el valor no mide exactamente 6 caracteres se resuelve como blanco y sin ningún aviso, así que `#RRGGBB` (7 caracteres) no pinta nada. Los nombres de color tampoco andan: "orange" mide justo 6, no se descarta y se interpreta como hex basura. #### `PDFbold` [`PdfFontStyle`](https://docs.histrix.com.ar/es/schema/tipos/#pdffontstyle) · opcional Negrita. No es un booleano: selecciona a qué parte de la celda aplica (ver `PdfFontStyle`). **Sólo se consulta al imprimir fichas y etiquetas**: en las columnas de una grilla no se mira, así que ahí no tiene efecto. #### `PDFborder` texto · opcional Borde de la celda. **`PDFborder="true"` no dibuja ningún borde**: el valor viaja crudo al generador de PDF, que entiende `1` (recuadro completo) o las letras **en mayúscula** `L`, `T`, `R`, `B` — izquierda, arriba, derecha, abajo — y sus combinaciones (`LR`). Cualquier otro valor deja la celda sin borde. #### `PDFbox` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Envuelve el contenido en un box. Útil para destacar zonas. #### `PDFcellHeight` texto · opcional Alto mínimo de fila en número de líneas. Aplicarlo en una columna uniformiza el alto de toda la fila (alto = mayor de las columnas × 1,3 × tamaño de fuente). **Se ignora en los campos `tipo="check"`, `tipo="grafico"` y `tipo="file"`**, que calculan su alto por su cuenta. #### `PDFcolor` texto · opcional Color del texto de la celda. Mismo formato que `PDFbackgroundColor`: **hex de 6 dígitos y sin `#`**. Con `#` son 7 caracteres, el motor lo resuelve como blanco y el texto queda invisible; y un nombre de 6 letras como "orange" se lee como hex basura. En los dos casos, sin aviso. #### `PDFcolWidth` texto · opcional Ancho de **columna** de la tabla PDF. Número SIN unidad (ej. "20"): agregar "px" rompe el layout. Fijarlo además desactiva el reajuste automático de esa columna, así que no se ensancha para acomodar el contenido — el texto se parte en varias líneas. **No es alias de `PDFwidth` ni de `pdfancho`**: son tres anchos distintos (ver `PDFwidth`). La grafía es exacta: `PDFcolwidth` con `w` minúscula no la lee nadie. #### `pdffill` `entero` · opcional Nivel de gris del fondo de la celda, 0 (negro) a 255 (blanco). **Es la única grafía que fija el color** — toda en minúscula. Los valores en uso son 195 y 192. **No es un booleano**: el número va crudo al generador de PDF, así que un texto como "true" no rellena nada y aborta la impresión con un error de tipo. En un `<label>` se puede escribir igual: es la misma propiedad. #### `PDFfill` texto · opcional **No fija ningún color.** Su único efecto es la *presencia*: declararlo con cualquier valor **suprime el gris claro por defecto** (240,240,240) y la celda queda con el color que hubiera quedado seteado antes. Para elegir el color hay que usar `pdffill` en minúscula, que es la grafía que llega al relleno. #### `PDFfontsize` `entero` · opcional Segunda grafía aceptada para el tamaño de fuente del campo, **con `s` minúscula**: el motor toma `PDFsize` y, si no está, ésta. Preferir `PDFsize`. Ojo con la trampa: `PDFfontSize` (con `S` mayúscula) **no** se lee a nivel campo — ése es el atributo global y va en el `<histrix>`. #### `PDFfooter` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Indica que el campo es parte del footer del PDF. #### `PDFheader` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Indica que el campo/label es parte del header del PDF (se repite en cada página). #### `PDFitalic` [`PdfFontStyle`](https://docs.histrix.com.ar/es/schema/tipos/#pdffontstyle) · opcional Itálica. Mismo mecanismo que `PDFbold`: no es un booleano, elige a qué parte de la celda aplica (ver `PdfFontStyle`). **Sólo se consulta al imprimir fichas y etiquetas**; en las columnas de una grilla no tiene efecto. #### `pdflineas` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Recuadro de las celdas de una grilla **embebida** en un campo (`helper type="object"`). Viene activo: sólo el literal "false" lo apaga. Tiene efecto únicamente en campos con contenedor interno; en un campo común no hace nada. La grafía es exacta y en minúscula: `PDFlineas` no la lee nadie. Para el recuadro de la grilla principal el atributo es `PDFlines`, y va en el `<histrix>`. #### `PDFlineHeight` texto · opcional Alto de celda **absoluto en mm**, no un multiplicador: pisa el alto calculado. Un `1.2` escrito pensando que era un factor deja la celda de 1,2 mm y el texto encimado. El multiplicador de interlineado es otro atributo, `PDFheigthRel` (sic, con el typo), que este schema todavía no declara. #### `PDFnoborder` [`BoolPresencia`](https://docs.histrix.com.ar/es/schema/tipos/#boolpresencia) · opcional Suprime el borde de la celda de la **etiqueta** al imprimir ficha o etiqueta, y de paso apaga su relleno. **No anula el borde del valor**: la celda del valor sigue tomando su borde de `PDFborder`. Ojo: el motor sólo mira si el atributo está presente, no su valor, así que `PDFnoborder="false"` también suprime el borde. Para no suprimirlo hay que **omitir el atributo**. La grafía es exacta: `pdfnoborder` en minúscula no la lee nadie. #### `PDFnolabel` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Omite el label del campo en el PDF — útil en etiquetas térmicas y planillas compactas. **La grafía es exacta**: `pdfnolabel` en minúscula no la lee nadie (hay 20 usos escritos así en el repo, todos inertes). Y el motor lo consulta con criterios distintos en distintos puntos de la impresión, así que `PDFnolabel="false"` no es un negador confiable: para que el label salga, omitir el atributo. #### `PDFpageBreak` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Controla el salto de página automático. "false" lo desactiva. #### `PDFrestorePosition` [`BoolEstricto`](https://docs.histrix.com.ar/es/schema/tipos/#boolestricto) · opcional · default `false` Restaura la posición X/Y del cursor antes de renderizar (para componer cajas superpuestas). #### `PDFrotate` `entero` · opcional Rota el texto N grados. #### `PDFscaleX` `entero` · opcional Escala horizontal del texto (en %). #### `PDFsize` texto · opcional Tamaño de fuente en puntos de esta celda. Es **la** grafía de nivel campo; el motor acepta además `PDFfontsize` (con `s` minúscula) como segunda forma. El global del documento es `PDFfontSize` en el `<histrix>` (otro atributo). #### `pdftitulo` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` Fila de títulos de una grilla **embebida** en un campo. Viene activa: sólo `pdftitulo="false"` la saca. Como `pdflineas`, sólo tiene efecto en campos con contenedor interno. #### `PDFtopMargin` `entero` · opcional **No es un margen en mm**: suma N **líneas** al alto de la fila, y sólo en campos que embeben otro contenedor (una grilla o una ficha hija). En un campo común no hace nada. #### `PDFwidth` texto · opcional Ancho de la grilla embebida de un campo, y en la vista card el ancho de la tarjeta. **No es alias de `PDFcolWidth` ni de `pdfancho`**: son tres anchos distintos — `PDFcolWidth` es el ancho de columna de la tabla PDF y `pdfancho` el de la celda del valor en ficha. La grafía es exacta: `pdfwidth` en minúscula no la lee nadie. #### `posx` texto · opcional Posición X de la celda, en mm desde el borde izquierdo de la página. Para desplazar en relativo respecto de donde iría la celda está `offsetX`, que se suma siempre. #### `posX` texto · opcional Alias camelCase de `posx`. #### `posy` texto · opcional Posición Y de la celda en mm, con **tres formas mágicas** además de la coordenada absoluta: `posy="-1"` la ubica debajo de todo lo ya impreso; `posy="0"` o el atributo ausente la deja en la misma línea que el campo anterior; `posy="+N"` (con el `+`) la ubica N mm debajo de lo ya impreso. Para desplazar en relativo también está `offsetY`. #### `posY` texto · opcional Alias camelCase de `posy`. #### `print` [`BoolDefaultActivo`](https://docs.histrix.com.ar/es/schema/tipos/#booldefaultactivo) · opcional · default `true` `print="false"` excluye el campo del PDF. **`print="true"` no puede forzar lo contrario**: las exclusiones son independientes y se suman, así que un campo con `noshow`, `oculto` o `colstyle="display:none;"` no se imprime aunque lleve `print="true"`. #### `tagGroup` texto · opcional En un campo `<tipo>tags</tipo>`: nombre del grupo de tags del que sale la lista de sugerencias y donde se guardan los nuevos. Sin él el campo comparte el grupo por defecto con todos los demás. ============================================================================== # API REST ============================================================================== ------------------------------------------------------------------------------ ## Referencia de la API URL: https://docs.histrix.com.ar/es/api/ Recursos, métodos y parámetros de la API REST de Histrix. ------------------------------------------------------------------------------ Histrix expone una API REST que permite operar todas las aplicaciones instaladas. Cada XML es un recurso: se lo puede consultar, insertar, modificar, borrar, exportar y además pedir su estructura (*schema*) para construir un cliente propio. La API es autodescriptiva: recorriéndola desde `/api/` con un navegador se obtienen los recursos disponibles en cada nivel. Todas las rutas de datos requieren un token de acceso. Ver [Autenticación y OIDC](https://docs.histrix.com.ar/es/autenticacion/). ## Convenciones - La base de todas las rutas es `/api`. La base de datos se indica en la ruta: `/api/db/{db}/...` - El token se envía en la cabecera `Authorization: Bearer {token}`. - El formato de respuesta predeterminado es JSON. El parámetro `requestFormat` acepta `application/json`, `application/xml` y `application/php`. - Las rutas que aceptan una ruta de XML la reciben como resto de la URL, con su directorio: `app/contabilidad/man/ctbconceptos_crud.xml`. ## Descubrimiento | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/` | Recursos disponibles | | GET | `/api/info` | Nombre y versión del framework y de la API | | GET | `/api/about` | Información de la instalación | | GET | `/api/version` | Versión del motor | | GET/POST | `/api/help` | Parámetros aceptados | | GET | `/api/db` | Bases disponibles | | GET | `/api/db/{db}` | Recursos de la base | | GET | `/api/db/{db}/config` | Configuración de la base | Ejemplo de `/api/db`: ```json { "cliente1": { "id": "cliente1", "name": "Cliente Uno", "description": "Base productiva" }, "cliente2": { "id": "cliente2", "name": "Cliente Dos", "description": "Base de pruebas" } } ``` ## Sesión y usuario | Método | Ruta | Descripción | | --- | --- | --- | | GET/POST | `/api/db/{db}/session` | Inicia sesión de aplicación | | DELETE | `/api/session/` | Cierra la sesión | | GET | `/api/db/{db}/me` | Datos del usuario del token | | GET | `/api/db/{db}/users/` | Usuarios de la base | | POST | `/api/db/{db}/location/` | Registra la ubicación del usuario | | POST | `/api/db/{db}/change-password/` | Cambia la contraseña | | POST | `/api/resetpassword/` | Solicita el reseteo de contraseña | ## Menú y favoritos | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/menu/[{id}]` | Árbol de menú del usuario, o un ítem | | PUT | `/api/db/{db}/menu/security/{menuid}` | Permisos del ítem de menú | | GET | `/api/db/{db}/favorites/` | Favoritos del usuario | | PUT | `/api/db/{db}/favorites/` | Guarda favoritos | ```bash curl --header "Authorization: Bearer $TOKEN" \ https://servidor/api/db/cliente/menu/ ``` ```json { "description": "Nested Tree Menu", "parameters": { "id": "menu id" }, "tree": [ { "id": "274", "title": "CONTABILIDAD", "childs": [ { "id": "21", "title": "PLAN DE CUENTAS", "uri": "/app/contabilidad/cuentas_tree.xml" } ] } ] } ``` :::caution Si `tree` viene vacío con HTTP 200, revisar `parameters.login` en la respuesta: un token válido pero sin usuario asociado devuelve un menú vacío sin error. El otro motivo habitual es que los ítems de `HTXMENU` no tengan `web_version = 1`. ::: ## Aplicaciones sin estado Estas rutas operan directamente sobre un XML, sin crear una instancia persistente. Son las adecuadas para integraciones. | Método | Ruta | Descripción | | --- | --- | --- | | OPTIONS | `/api/db/{db}/app/{xml}` | Estructura del contenedor | | GET | `/api/db/{db}/app/{xml}` | Consulta datos | | POST | `/api/db/{db}/app/{xml}` | Inserta | | PUT | `/api/db/{db}/app/{xml}` | Modifica | | DELETE | `/api/db/{db}/app/{xml}` | Borra | | PATCH | `/api/db/{db}/app/{xml}` | Procesa un lote de registros | | GET | `/api/db/{db}/schema/{xml}` | Schema en formato de cliente | | GET | `/api/db/{db}/schema/field/{field}/{xml}` | Schema de un campo | | GET | `/api/db/{db}/nodes/{xml}` | Nodos de un XML tipo árbol | | GET | `/api/db/{db}/export/{formato}/{xml}` | Exporta | | GET | `/api/db/{db}/export/pdf/{xml}` | Genera el PDF | | GET | `/api/db/{db}/print/{xml}` | Imprime | | GET/POST | `/api/db/{db}/pdf/{xml}` | Genera el PDF | | GET/POST | `/api/db/{db}/json/{instance}` | Datos en formato DataTables | ### OPTIONS: estructura del contenedor ```bash curl --header "Authorization: Bearer $TOKEN" \ -X OPTIONS https://servidor/api/db/cliente/app/general/iva_crud.xml ``` ```json { "resources": { "GET": "Get Data", "OPTIONS": "App Info", "EXPORT": "Export Data", "POST": "insert Data", "PUT": "Update Data", "DELETE": "Delete Data" }, "dataContainer": { "titulo": "Categorias de IVA", "tipo": "abm", "TablaBase": "GEN_IVA", "tablas": { "GEN_IVA": { "nombreTabla": "GEN_IVA", "campos": { "id_iva": { "NombreCampo": "id_iva", "Etiqueta": "código", "TipoDato": "varchar", "autoinc": "true", "noshow": "true" } } } } } } ``` `OPTIONS` devuelve la representación interna completa del contenedor. Para construir un cliente conviene usar `/schema/{xml}`, que entrega una versión normalizada y estable: tipos, etiquetas, estilos (`form_style`, `label_style`), opciones de combos, parámetros de los helpers de tipo `link`, configuración de paginación (`page_size`, `max_limit`) y el indicador `preFetch`. :::note Un cliente propio debe respetar `preFetch`: cuando es `false` el formulario arranca vacío y no corresponde pedir datos. Los campos de trabajo de una grilla que no son columnas de la tabla necesitan `local="true"` en el XML; sin eso, el `GET` falla con error 1054 de columna desconocida. ::: ### GET: consulta ```bash curl --header "Authorization: Bearer $TOKEN" \ -X GET https://servidor/api/db/cliente/app/general/iva_crud.xml ``` ```json { "data": [ { "id_iva": "1", "abreviacion_iva": "R.Insc.", "nombre_iva": "Responsable Inscripto", "letra": "A" }, { "id_iva": "3", "abreviacion_iva": "Exe", "nombre_iva": "Exento", "letra": "B" } ] } ``` **Filtro por campo.** Cualquier campo declarado en el XML se puede pasar como parámetro de query: ```bash curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/app/general/iva_crud.xml?id_iva=1" ``` **Límite simple.** `_limit` fija la cantidad de registros; `_limit=0` elimina los límites preestablecidos en el XML. Para recorrer un resultado largo conviene la paginación, que se describe [más abajo](https://docs.histrix.com.ar/es/api/#paginación): ```bash curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/app/general/iva_crud.xml?_limit=3" ``` **Rangos y operadores.** Se combinan tres arreglos paralelos: ``` _f[] campo _o[] operador (=, !=, >=, <=, like) _v[] valor ``` ```bash curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/app/general/iva_crud.xml?_f[]=id_iva&_o[]=>=&_v[]=3&_f[]=id_iva&_o[]=<&_v[]=5" ``` ### Paginación `GET /app/{xml}` acepta dos estilos de paginación, y los dos se traducen internamente a `LIMIT`/`OFFSET`: | Estilo | Parámetros | Ejemplo | | --- | --- | --- | | Desplazamiento | `limit`, `offset` | `?limit=20&offset=40` | | Página | `page`, `page_size` | `?page=3&page_size=20` | Cuando llegan los dos, `page`/`page_size` tiene prioridad sobre `limit`/`offset`. Si no llega ninguno se usa el default del XML: el atributo `limit=` —o `paginar=`— del `<histrix>`. **La paginación es opcional.** Si no hay parámetros por query y el XML tampoco define un límite, la respuesta es la de siempre: `{"data": [...]}` con todas las filas y sin bloque `pagination`. Un cliente que ya funcionaba no cambia. ```bash curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/app/ventas/qry/ventas_qry.xml?limit=2" ``` ```json { "data": [ { "id_venta": "1", "cliente": "ACME", "total": "1500.00" }, { "id_venta": "2", "cliente": "Otra S.A.", "total": "2300.00" } ], "pagination": { "limit": 2, "offset": 0, "count": 2, "has_more": true, "next": "https://servidor/api/db/cliente/app/ventas/qry/ventas_qry.xml?limit=2&offset=2" } } ``` El bloque `pagination` trae: | Campo | Contenido | | --- | --- | | `limit` | Filas por página efectivamente aplicadas | | `offset` | Filas salteadas | | `count` | Filas devueltas en esta página | | `has_more` | Si hay más resultados | | `next` | URL completa de la página siguiente, o `null` si no hay más | | `page`, `page_size` | Solo en el estilo por página | | `total`, `total_pages` | Solo si se pidió `with_total` | **Recorrer todo el resultado** es seguir `next` hasta que venga `null`. La URL ya conserva los filtros y el orden del pedido original, así que no hay que rearmar el query: ```bash url="https://servidor/api/db/cliente/app/ventas/qry/ventas_qry.xml?limit=100&cliente=ACME" while [ -n "$url" ] && [ "$url" != "null" ]; do page=$(curl -s --header "Authorization: Bearer $TOKEN" "$url") echo "$page" | jq '.data[]' url=$(echo "$page" | jq -r '.pagination.next // ""') done ``` **Total exacto.** Contar el total cuesta una consulta más, así que no se hace salvo que se pida con `with_total=1` (o `with_total=true`). Con eso la respuesta agrega `total` y `total_pages`: ```bash curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/app/ventas/qry/ventas_qry.xml?page=1&page_size=50&with_total=1" ``` ```json "pagination": { "limit": 50, "offset": 0, "count": 50, "page": 1, "page_size": 50, "total": 213, "total_pages": 5, "has_more": true, "next": "https://servidor/api/db/cliente/app/ventas/qry/ventas_qry.xml?page=2&page_size=50&with_total=1" } ``` :::caution Sin `with_total`, `has_more` es una inferencia: vale `true` cuando la página vino llena, es decir cuando la cantidad de filas devueltas llega al `limit` pedido. Si el total es múltiplo exacto del tamaño de página, la última página devuelve `has_more: true` y un `next` que responde con cero filas. Recorrer hasta que `data` venga vacío —o pedir `with_total=1`, que vuelve el dato exacto— resuelve el caso. ::: **Tope.** El máximo es de 200 filas por página. Un `limit` o un `page_size` mayor no falla: se recorta a 200, y el valor aplicado es el que informa `pagination.limit`. **Conocer el tamaño de página antes de pedir datos.** El schema del XML lo expone, para que un cliente no tenga que inferirlo a fuerza de requests: ```bash curl --header "Authorization: Bearer $TOKEN" \ "https://servidor/api/db/cliente/schema/ventas/qry/ventas_qry.xml" ``` ```json "pagination": { "enabled": true, "page_size": 100, "offset": 0, "max_limit": 200 } ``` :::note La paginación no se aplica a las peticiones en modo DataTables (`_dt`), que usan su propio mecanismo con `start`, `length` y `recordsTotal`. Tampoco reemplaza a `_limit`, que sigue funcionando como límite simple sin bloque `pagination`. ::: ### POST: inserción El cuerpo lleva en `data` un arreglo JSON de objetos campo/valor: ```bash curl --header "Authorization: Bearer $TOKEN" -X POST \ -d 'data=[{"nombre_iva": "TEST", "letra": "X"}]' \ https://servidor/api/db/cliente/app/general/iva_crud.xml ``` ### PUT: modificación Además de `data`, se envía `keys` con los campos que identifican el registro: ```bash curl --header "Authorization: Bearer $TOKEN" -X PUT \ -d 'data=[{"nombre_iva": "TEST 2"}]' \ -d 'keys=[{"id_iva": 7}]' \ https://servidor/api/db/cliente/app/general/iva_crud.xml ``` ### DELETE: borrado ```bash curl --header "Authorization: Bearer $TOKEN" -X DELETE \ -d 'keys=[{"id_iva": 7}]' \ https://servidor/api/db/cliente/app/general/iva_crud.xml ``` ### PATCH: proceso por lote Ejecuta la lógica de grabación del XML —incluidos sus movimientos— sobre un arreglo de registros: ```bash curl --header "Authorization: Bearer $TOKEN" -X PATCH \ -d 'jsonData=[{"clave": "valor"}, {"clave": "otro valor"}]' \ https://servidor/api/db/cliente/app/general/iva_crud.xml ``` ## Instancias Una instancia es un contenedor vivo en la sesión: mantiene filtros, campos calculados y filas temporales. Es el modelo que usa la interfaz web y el necesario para reproducir formularios de ingreso con grillas. | Método | Ruta | Descripción | | --- | --- | --- | | GET/POST | `/api/db/{db}/instance/xml/{xml}` | Crea la instancia | | GET | `/api/db/{db}/instance/{instance}` | Lee datos | | PUT | `/api/db/{db}/instance/{instance}` | Actualiza datos | | DELETE | `/api/db/{db}/instance/{instance}` | Destruye la instancia | | DELETE | `/api/db/{db}/instances/` | Destruye varias instancias | | PUT | `/api/db/{db}/instance/{instance}/set/[{id}]` | Actualiza un campo | | POST | `/api/db/{db}/instance/{instance}/field/{field}/` | Refresca un campo | | PUT | `/api/db/{db}/instance/{instance}/field/{field}/` | Asigna valor a un campo | | POST | `/api/db/{db}/{instance}/fields/{source}/` | Refresca los campos dependientes de uno | | POST | `/api/db/{db}/instance/{instance}/filter/` | Aplica filtros | | GET | `/api/db/{db}/instance/{instance}/page/{page}` | Página de resultados | | GET | `/api/db/{db}/instance/{instance}/refresh/` | Refresca la vista | | PUT | `/api/db/{db}/instance/{instance}/table/` | Graba filas de la grilla | | PUT | `/api/db/{db}/instance/{instance}/data/[{row}]` | Actualiza una fila | | DELETE | `/api/db/{db}/instance/{instance}/data/[{row}]` | Borra una fila | | PUT | `/api/db/{db}/instance/{instance}/row/[{row}]` | Refresca una fila | | PUT | `/api/db/{db}/instance/{instance}/order/` | Reordena | | PUT | `/api/db/{db}/instance/{instance}/swap/{origen}/{destino}` | Intercambia filas | | POST | `/api/db/{db}/instance/{instance}/process/[{vars}]` | Ejecuta la grabación | | PUT | `/api/db/{db}/instance/{instance}/reset/` | Reinicia los datos | | GET | `/api/db/{db}/instance/{instance}/tree/` | Vista de árbol | | GET | `/api/db/{db}/instance/{instance}/nodes/` | Nodos del árbol | | GET | `/api/db/{db}/instance/{instance}/events/` | Eventos de calendario | | GET | `/api/db/{db}/instance/{instance}/print/` | PDF de la instancia | | GET | `/api/db/{db}/instance/{instance}/debug/` | Estado del contenedor | | DELETE | `/api/db/{db}/instance/{instance}/debug/` | Cancela la consulta en curso | ### Ayudas y autocompletado Los popups de ayuda y los autocompletados de un campo se sirven **desde la instancia del formulario padre**, no pidiendo el XML de la ayuda por separado: ``` GET /api/db/{db}/instance/{instance}/field/{field}/help/ autocompletado POST /api/db/{db}/instance/{instance}/field/{field}/help/ grilla de ayuda ``` Esa ruta aplica las condiciones que el padre le impone al helper. Pedir el XML de la ayuda por `app/` ignora esas condiciones y suele devolver cero filas. ### Seguridad por registro y por campo | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/metadata/{instance}/{id}` | Seguridad del registro | | GET | `/api/db/{db}/instance/{instance}/privacy/[{rowid}]` | Formulario de privacidad | | PUT | `/api/db/{db}/instance/{instance}/privacy/{rowid}` | Cambia la privacidad | | GET | `/api/db/{db}/instance/{instance}/field/{field}/security/` | Permisos del campo | | PUT | `/api/db/{db}/instance/{instance}/field/{field}/security/` | Actualiza permisos | ## Exportación e importación | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/instance/{instance}/export/` | Formulario de exportación | | GET | `/api/db/{db}/instance/{instance}/export/{formato}/` | Exporta en el momento | | GET | `/api/db/{db}/instance/{instance}/export/start/{formato}/` | Encola la exportación | | GET | `/api/db/{db}/export-job/status/{jobId}` | Estado del trabajo | | GET | `/api/db/{db}/export-job/download/{jobId}` | Descarga el resultado | | GET | `/api/db/{db}/instance/{instance}/import/` | Formulario de importación | | PUT | `/api/db/{db}/instance/{instance}/import/` | Guarda la importación | | POST | `/api/db/{db}/instance/{instance}/import/{path}` | Importa un archivo | Las exportaciones grandes se resuelven de forma asíncrona: `export/start/{formato}/` devuelve un `jobId` que se consulta con `export-job/status/{jobId}` hasta que termina y luego se descarga con `export-job/download/{jobId}`. Ver [Exportación de datos](https://docs.histrix.com.ar/es/exportar/). ## Archivos | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/dir[/{ruta}]` | Contenido de un directorio | | GET | `/api/db/{db}/files/{archivo}` | Descarga | | POST | `/api/db/{db}/files/{archivo}` | Subida | | DELETE | `/api/db/{db}/files/{archivo}` | Borrado | | GET | `/api/db/{db}/thumb[/{ruta}]` | Miniatura | | GET | `/api/db/{db}/view[/{ruta}]` | Visor | | PUT | `/api/db/{db}/save/{xml}` | Guarda el archivo XML (editor) | | GET | `/api/db/{db}/barcode` | Genera un código de barras | Subida de un archivo: ```bash curl --header "Authorization: Bearer $TOKEN" \ -F "file=@perfil.jpg;filename=perfil.jpg;type=image/jpeg" \ https://servidor/api/db/cliente/files/clientes/perfil.jpg ``` El backend de archivos puede ser local o S3. Cuando es S3, el tag `<path>` del montaje actúa como prefijo raíz, lo que permite que varias bases compartan un bucket separadas por subdirectorio. ## Impresión | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/print/file/{id}` | Descarga el trabajo de impresión | | POST | `/api/db/{db}/print/done/{id}` | Marca el trabajo como impreso | | POST | `/api/db/{db}/print/error/{id}` | Marca el trabajo con error | | GET | `/api/qztray/sign` | Firma para QZ Tray | | GET | `/api/qztray/cert` | Certificado de QZ Tray | La impresión directa a impresoras locales (térmicas, fiscales, etiquetas) se hace a través de QZ Tray: el navegador pide la firma al servidor y envía el trabajo a la impresora. ## Configuración y parámetros | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/settings/[{sección}]` | Lee la configuración | | PUT | `/api/db/{db}/settings/[{sección}]` | Actualiza la configuración | | POST | `/api/db/{db}/settings/[{sección}]` | Crea una opción | | GET | `/api/db/{db}/useroption/{clave}` | Opción del usuario | | POST | `/api/db/{db}/useroption/{clave}` | Guarda opción del usuario | | DELETE | `/api/db/{db}/useroption/{clave}` | Borra opción del usuario | | GET | `/api/db/{db}/parameters/panel/{xmlPath}` | Panel de parámetros | | PUT | `/api/db/{db}/parameters/` | Guarda parámetros | | GET | `/api/db/{db}/parameters/values` | Valores de los parámetros | ## Tareas programadas y autoinicio | Método | Ruta | Descripción | | --- | --- | --- | | GET/POST/PUT/DELETE | `/api/db/{db}/crontab/[{id}]` | Tareas programadas | | GET/POST/PUT/DELETE | `/api/db/{db}/autoinit/[{id}]` | Programas de autoinicio | | GET/POST | `/api/db/{db}/sysmon/` | Monitor del sistema | | GET | `/api/db/{db}/tasks/` | Tareas del usuario | ## Mensajería y notificaciones | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/user/notifications/` | Notificaciones | | DELETE | `/api/db/{db}/user/notifications/` | Borra todas | | GET | `/api/db/{db}/user/notifications/config` | Configuración | | PUT | `/api/db/{db}/user/notifications/config` | Guarda configuración | | GET | `/api/db/{db}/user/messages/` | Mensajes | | POST | `/api/db/{db}/user/message/[{id}]` | Envía un mensaje | | DELETE | `/api/db/{db}/user/message/{id}` | Borra un mensaje | | GET | `/api/db/{db}/mail/` | Correo del usuario | | GET | `/api/db/{db}/sendmail/[{instance}]` | Formulario de envío | ## Assets y etiquetas | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/js/{db}` | Bundle de JavaScript | | GET | `/api/css/{db}` | Bundle de CSS | | GET | `/api/images/{imagen}` | Imagen del tema | | GET | `/api/db/{db}/tags/{grupo}[/{tag}]` | Lee etiquetas | | POST | `/api/db/{db}/tags/{grupo}[/{tag}]` | Asigna etiquetas | ## Recursos públicos | Método | Ruta | Descripción | | --- | --- | --- | | GET | `/api/db/{db}/pub/[{token}]` | Recurso público por token | | GET | `/api/db/{db}/encuesta/{token}` | Encuesta | | POST | `/api/db/{db}/encuesta/{token}` | Respuesta de la encuesta | | GET/POST | `/api/db/{db}/registration/` | Registro de usuarios | | POST | `/api/db/{db}/confirm-registration/` | Confirma el registro | Cualquier XML ubicado bajo `xml/public/` se sirve **sin token**. Es el mecanismo para publicar galerías, catálogos o endpoints de lectura hacia afuera; conviene combinarlo con un `dataSource` que controle exactamente qué devuelve. :::caution Los endpoints de descubrimiento OIDC viven en `/api/db/{db}/.well-known/...`, es decir fuera de la raíz del sitio. Varios proxies bloquean por defecto `.well-known` cuando no está en la raíz y responden 403. Si el discovery falla con 403, revisar la configuración del proxy antes que la de Histrix. ::: ------------------------------------------------------------------------------ ## Autenticación y OIDC URL: https://docs.histrix.com.ar/es/autenticacion/ Obtención de tokens, flujos OAuth 2.0 soportados, realms por perfil y endpoints OpenID Connect. ------------------------------------------------------------------------------ La API de Histrix se autentica con OAuth 2.0. Cada base de datos es un emisor independiente: tiene sus propios clientes, sus propios usuarios y su propio par de claves de firma. ## Flujos soportados | Grant type | Uso | | --- | --- | | `password` | Aplicaciones propias que piden usuario y contraseña | | `client_credentials` | Integraciones máquina a máquina, sin usuario | | `authorization_code` | Login delegado con OpenID Connect (con o sin PKCE) | | `refresh_token` | Renovación de un token de acceso vencido | Parámetros de configuración del servidor: - Vida del *access token*: 24 horas. - Vida del `id_token`: 1 hora. - Cada renovación emite un *refresh token* nuevo. - El flujo implícito está deshabilitado; solo `authorization_code`. - `state` es obligatorio y el `redirect_uri` debe coincidir en forma exacta. - PKCE está permitido (`S256` y `plain`) pero no es obligatorio. ## Obtener un token ```bash curl -u TestClient:TestSecret \ https://servidor/api/db/cliente/token \ -d 'grant_type=password&username=usuario&password=clave&client_id=TestClient' ``` - `TestClient` y `TestSecret` son las credenciales del cliente OAuth registrado en la base (tabla `oauth_clients`), no las del usuario. - `grant_type=password` envía las credenciales del usuario final; con `client_credentials` no se envían `username` ni `password`. Respuesta: ```json { "access_token": "f446bc61ebb06653cd86309f2e3f49b9481cf6a3", "expires_in": 86400, "token_type": "Bearer", "scope": "web openid offline_access", "refresh_token": "4e40020c4fd2c6ccd968ed69152b75bbb9460944" } ``` El token se envía en todas las llamadas siguientes: ```bash curl --header "Authorization: Bearer f446bc61ebb06653cd86309f2e3f49b9481cf6a3" \ https://servidor/api/db/cliente/menu/ ``` ## Realms: qué perfiles pueden entrar por cada canal Un usuario no puede autenticarse por cualquier canal: su perfil declara en `HTXPROFILES.realm` la lista de realms habilitados, separados por coma. El login valida el realm pedido con `FIND_IN_SET`. El realm que se exige en un `password` grant **lo determina el cliente OAuth**: es el primer valor del campo `oauth_clients.scope`. Si el cliente no tiene scope configurado, se usa `web`. Por eso el orden del scope importa: ``` web openid offline_access correcto openid web offline_access rompe el password grant en silencio ``` Con `openid` primero, Histrix pide un realm llamado `openid`, que ningún perfil declara, y el login falla con credenciales válidas. :::caution Actualizar una instalación anterior a mayo de 2026 exige agregar a mano la columna `HTXPROFILES.realm`. Sin esa columna el login devuelve 500 para todos los usuarios, incluido el administrador, y no hay forma de entrar a corregirlo desde la interfaz. ::: ## OpenID Connect Cada base publica sus endpoints de descubrimiento: | Método | Ruta | | --- | --- | | GET | `/api/db/{db}/.well-known/openid-configuration` | | GET | `/api/db/{db}/.well-known/jwks.json` | | GET/POST | `/api/db/{db}/authorize` | | GET/POST | `/api/db/{db}/token` | | GET | `/api/db/{db}/userinfo` | El *issuer* es `{esquema}://{host}/api/db/{db}`, y respeta `X-Forwarded-Proto` y `X-Forwarded-Host` cuando hay proxy inverso. Respuesta del discovery: ```json { "issuer": "https://servidor/api/db/cliente", "authorization_endpoint": "https://servidor/api/db/cliente/authorize", "token_endpoint": "https://servidor/api/db/cliente/token", "userinfo_endpoint": "https://servidor/api/db/cliente/userinfo", "jwks_uri": "https://servidor/api/db/cliente/.well-known/jwks.json", "response_types_supported": ["code"], "grant_types_supported": ["authorization_code", "refresh_token", "client_credentials", "password"], "id_token_signing_alg_values_supported": ["RS256"], "scopes_supported": ["openid", "profile", "email"], "claims_supported": ["sub", "name", "given_name", "family_name", "email"], "token_endpoint_auth_methods_supported": ["client_secret_post", "client_secret_basic"], "code_challenge_methods_supported": ["S256", "plain"] } ``` ### Claves de firma Los `id_token` se firman con RS256. Cada base tiene su propio par RSA de 2048 bits en `database/.oidc/{db}/`, generado de forma perezosa: un cliente que no usa OIDC nunca dispara la generación ni escribe en el filesystem. :::caution Las claves las tiene que generar el proceso de PHP que atiende el sitio (php-fpm o Apache). Si se pre-generan desde la línea de comandos como root, el propietario queda mal y `jwks.json`, `userinfo` y `authorize` responden 500. ::: ### Bloqueo de `.well-known` en el proxy Los endpoints de descubrimiento no están en la raíz del sitio sino bajo `/api/db/{db}/`. Varios proxies (Caddy, Nginx) traen reglas que solo permiten `.well-known` en la raíz y devuelven 403 en cualquier otra ubicación. Si el discovery o el JWKS fallan con 403, el problema está en el proxy. ## Rutas sin autenticación Dos casos no requieren token: - **XML públicos.** Cualquier XML cuya ruta empiece con `public/` se sirve sin `Authorization`. Es el mecanismo para publicar catálogos, galerías o endpoints de lectura hacia afuera. - **Recursos por token de un solo uso.** `/api/db/{db}/pub/{token}`, las encuestas y el circuito de registro y confirmación de usuarios. ## Diagnóstico | Síntoma | Causa habitual | | --- | --- | | 401 con credenciales correctas | `oauth_clients.scope` empieza con algo distinto de `web`, o el perfil no tiene ese realm en `HTXPROFILES.realm` | | 500 en todo login | Falta la columna `HTXPROFILES.realm` | | `tree: []` con HTTP 200 en `/menu/` | El token no tiene usuario asociado: revisar `parameters.login` en la respuesta | | 500 en `jwks.json` o `userinfo` | Propietario incorrecto de `database/.oidc/{db}/` | | 403 en `.well-known/*` | Regla del proxy inverso | | Menú vacío tras actualizar | `HTXMENU.web_version` distinto de 1 | ============================================================================== # Calidad ============================================================================== ------------------------------------------------------------------------------ ## Testing URL: https://docs.histrix.com.ar/es/testing/ Tests unitarios con PHPUnit, tests de extremo a extremo con Playwright y tests de aceptación con Codeception. ------------------------------------------------------------------------------ El motor se prueba con tres herramientas, cada una con un alcance distinto: | Herramienta | Alcance | Ubicación | | --- | --- | --- | | PHPUnit | Tests unitarios del motor | `tests/unit/` | | Playwright | Flujos de extremo a extremo en el navegador | `tests/e2e/` | | Codeception | Tests de aceptación por base de cliente | `database/{base}/tests/` | ## Tests unitarios (PHPUnit) Los tests unitarios cubren el motor y están organizados por namespace, en espejo de `src/`: `tests/unit/Data/`, `tests/unit/Parser/`, `tests/unit/Controller/`, etc. ```bash vendor/bin/phpunit ``` O a través de Composer: ```bash composer test ``` La configuración está en `phpunit.xml`: bootstrap en `tests/unit/_bootstrap.php`, suite única `HistrixTestSuit` sobre `./tests/unit/`, y reporte Allure en `build/allure-results`. Para correr un subconjunto: ```bash vendor/bin/phpunit tests/unit/Data/ vendor/bin/phpunit --filter testNombreDelMetodo ``` En una instalación con Docker, el repositorio está montado en `/var/www/html`: ```bash docker exec -it histrix vendor/bin/phpunit tests/unit/Parser/ ``` ### Base de tests Los tests que tocan la base usan un schema propio (`htx_test`). Cuando una migración agrega una columna, la base de tests también tiene que recibirla: si un test falla por una columna que no existe, la corrección va en el schema —con su migración— y no adaptando el test al schema viejo. Un caso recurrente: los tests que crean usuarios fallan con error 1452 de clave foránea cuando `HTXPROFILES` no tiene el perfil `0` que el valor por omisión de `HTXUSERS.Id_perfil` espera. Se resuelve sembrando ese perfil: ```sql SET SESSION sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; INSERT INTO HTXPROFILES (Id_perfil, perfil) VALUES (0, 'Deshabilitado'); ``` ## Tests de extremo a extremo (Playwright) Los tests de `tests/e2e/` recorren flujos completos en un navegador real: login, apertura de programas, grabación y verificación de efectos. ```bash npx playwright test npx playwright test tests/e2e/profiling.spec.ts npx playwright test --headed ``` La configuración está en `playwright.config.ts`: directorio `./tests/e2e`, `baseURL` `http://localhost`, proyecto `chromium` y timeout de 30 segundos. Un test típico define su base y credenciales, hace login y opera la interfaz: ```ts import { test, expect, Page } from '@playwright/test'; const DB = 'mi_base'; const BASE_URL = 'http://localhost'; async function login(page: Page) { await page.goto(BASE_URL + '/?base=' + DB); await page.selectOption('#db', DB); await page.fill('#username', 'histrix'); await page.fill('#password', 'clave'); await page.click('button[name="ingreso"]'); } ``` :::note Los módulos funcionales tienen su propia suite de Playwright en su repositorio, que verifica que un cambio no rompa pantallas (render y grabación). No es un test de contrato del motor: fija la versión del motor por commit. ::: ## Tests de aceptación (Codeception) Los tests de aceptación por base validan el resultado final de lo que interpreta Histrix: el formulario generado y sus interacciones. :::caution Codeception ya no forma parte de las dependencias instaladas por omisión. Los comandos `histrix test` y `histrix xmltest` requieren instalarlo primero: ```bash composer require --dev codeception/codeception vendor/bin/codecept build composer dumpautoload ``` ::: ### Configuración de la base En `database/config.xml`, dentro de la base a testear: ```xml <testuser>histrix</testuser> <testpass>XXXXXXXX</testpass> <testurl>http://xxx.xxx.xxx.xxx</testurl> <testhost>xxx.xxx.xxx.xxx</testhost> ``` | Tag | Contenido | | --- | --- | | `testuser` | Usuario con el que se ingresa al sistema | | `testpass` | Contraseña de ese usuario | | `testurl` | URL del servidor Histrix a usar | | `testhost` | IP del servidor de Selenium | El directorio de la base debe tener esta estructura: ``` database/{base}/ xml/ tests/ acceptance.suite.dist.yml se genera automáticamente _output/ acceptance/ _bootstrap.php se genera automáticamente PedidoInternoCest.php ``` ### Ejemplo El nombre de la clase termina en `Cest` y el de cada método de prueba empieza con `test`: ```php <?php class PedidoInternoCest { private $numeroPedido; public function _before(\Step\Acceptance\Admin $I) { } public function _after(AcceptanceTester $I) { } public function testEmisionPedido(\Step\Acceptance\Admin $I) { $I->loadXml('pedidoint_simple_ing.xml', 'pedidoint/', 'Emision Pedido'); $I->fillField('artcod', 'ES001'); $I->fillField('cant', '10'); $I->fillField('movref', 'texto de referencia'); $I->click('Crear'); $I->waitForText('KGS='); $numero = $I->grabValueFrom('nrocom'); $this->numeroPedido = $numero; $I->click('Procesar'); $I->wait(3); $I->seeInDatabase('PEDIDOINT', [ 'nrocom' => $numero, 'fechaemi' => date('Y-m-d'), 'artcod' => 'ES001', ]); $I->waitForElement('.pdfFrame', 10); $I->click('.ui-dialog-titlebar-close'); $I->click('.closetab'); } } ``` ### Helpers propios Además de los métodos del WebDriver de Codeception, hay tres específicos de Histrix: ```php // Carga un XML en Histrix, haciendo login si hace falta $I->loadXml('archivo.xml', 'ruta/al/archivo', 'título de la solapa'); // Selecciona la fila que contenga esos valores en cualquiera de sus celdas $I->clickRowContains(['valor 1', 'valor 2']); // Selecciona una pestaña interna del formulario por su título $I->clickFormTab('título del tab'); ``` ### Ejecución ```bash php histrix test {base} [ArchivoCest.php] [entorno] php histrix xmltest {archivo} {base} ``` El entorno define qué configuración de navegador usar: - `chrome` (valor por omisión): busca un servidor Selenium en la dirección declarada en `config.xml`. - `chrome-local`: usa el Chrome de la máquina; requiere `chromedriver`. ```bash php histrix test mi_base miTestCest.php chrome-local ``` ## Referencias - PHPUnit: <https://phpunit.de/> - Playwright: <https://playwright.dev/> - Codeception WebDriver: <https://codeception.com/docs/modules/WebDriver> ============================================================================== # Ayuda ============================================================================== ------------------------------------------------------------------------------ ## Usar la docs con un asistente URL: https://docs.histrix.com.ar/es/asistentes/ Los archivos de texto que publica el sitio para asistentes de IA y cómo configurarlos en Claude Code y en Claude de escritorio. ------------------------------------------------------------------------------ El sitio publica su contenido en dos archivos de texto plano, pensados para dárselos a un asistente como material de referencia. | Archivo | Peso | Para qué | | --- | --- | --- | | [llms-full.txt](https://docs.histrix.com.ar/llms-full.txt) | 677 KB, unos 170.000 tokens | La documentación completa, con la URL de cada página | | [llms.txt](https://docs.histrix.com.ar/llms.txt) | 6 KB | Sólo el índice: título, descripción y URL de cada página | Los dos se generan en cada publicación, así que están siempre al día. El primero incluye la referencia completa del schema, que es el 80 % de su tamaño: los 116 elementos y 444 atributos con su descripción. :::caution 170.000 tokens es casi una ventana de contexto entera. Pegar el archivo completo en una conversación funciona, pero deja poco espacio para el trabajo y hay que repetirlo en cada sesión. Las tres recetas de abajo evitan eso. ::: ## Claude de escritorio y claude.ai Conviene cargarlo una vez como conocimiento de un proyecto, en lugar de adjuntarlo en cada conversación: 1. Crear un proyecto (**Projects → New project**). 2. Descargar `llms-full.txt` y subirlo al conocimiento del proyecto. 3. En las instrucciones del proyecto, escribir algo así: > Las respuestas sobre Histrix se basan en el archivo de documentación del > proyecto. Al citar un atributo o un tag, incluir la URL de la página de donde > sale. Si el archivo no dice algo, decir que no está documentado en lugar de > inferirlo del nombre. A partir de ahí, cada conversación del proyecto busca en el archivo sin gastar contexto en cargarlo entero. Cuando se publique una versión nueva de la documentación hay que volver a subir el archivo: el conocimiento del proyecto es una copia, no un enlace. ## Claude Code La forma que menos contexto gasta es dejar el archivo en el repositorio y decirle cuándo consultarlo. Desde la raíz del proyecto: ```bash curl -o docs/histrix-docs.txt https://docs.histrix.com.ar/llms-full.txt ``` Y en el `CLAUDE.md` del repositorio: ```markdown ## Referencia de Histrix `docs/histrix-docs.txt` tiene la documentación completa del framework: los 116 tags y 444 atributos del schema, la API REST y la operación. Antes de usar un tag o atributo del que no estés seguro, buscalo ahí: grep -n "nombreDelAtributo" docs/histrix-docs.txt Si no aparece, el motor no lo lee: no lo escribas. Las descripciones dicen lo que el motor hace, que muchas veces no es lo que el nombre sugiere. ``` :::caution No conviene importarlo con la sintaxis `@docs/histrix-docs.txt` en el `CLAUDE.md`: eso carga los 170.000 tokens en cada sesión, incluso en las que no tocan un XML. La idea de la instrucción anterior es que el archivo se consulte a demanda. ::: Para actualizarlo, el mismo `curl`. Si el archivo se versiona en el repositorio, el `diff` muestra además qué cambió en la documentación. ## Consulta puntual, sin instalar nada Sirve para una pregunta suelta, en cualquier asistente con acceso a internet: ``` Leé https://docs.histrix.com.ar/llms.txt y después la página que corresponda para responder: ¿qué hace exactamente esClave="false"? ``` El índice pesa 6 KB, así que el asistente puede leerlo entero y decidir qué página pedir. Para el ejemplo de arriba iría a la [referencia de campos](https://docs.histrix.com.ar/es/schema/campos/). ## Qué pedirle Las descripciones del schema están verificadas contra el código del motor, así que hay tres preguntas que este material responde bien y que de otro modo se contestan adivinando: - **¿Este atributo existe?** Si no está en la [lista de atributos](https://docs.histrix.com.ar/es/schema/atributos/), el motor no lo lee. La documentación anterior a esta describía una veintena que no hacían nada. - **¿Qué hace exactamente `="false"`?** No hay una respuesta única: el motor evalúa los booleanos con [cuatro criterios distintos](https://docs.histrix.com.ar/es/schema/tipos/), y en varios atributos escribir `false` **activa** la función. - **¿Dónde va este tag?** El [índice de elementos](https://docs.histrix.com.ar/es/schema/elementos/) dice qué admite cada elemento, con la cantidad de veces que puede aparecer. Conviene pedirle que cite la URL de donde saca cada afirmación: es lo que permite verificarla en un clic. ------------------------------------------------------------------------------ ## Snippets URL: https://docs.histrix.com.ar/es/snippets/ Fragmentos de XML reutilizables: validaciones de campos, numeradores y datos del usuario. ------------------------------------------------------------------------------ Fragmentos listos para copiar, agrupados por el problema que resuelven. ## Comparar dos fechas La función `aFecha` convierte un string con formato `dd/mm/aaaa` en fecha, lo que permite compararla con otra: ~~~xml <field id="vencimiento_movimiento"> <label modpos="nobr">Fecha Emisión</label> <tipo>date</tipo> <valor>today</valor> <jseval actxml="false">aFecha(\'vencimiento_movimiento\') >= aFecha(\'fecha_ultima\')</jseval> </field> <field id="fecha_ultima" local="true" deshabilitado="true" sincelda="true"> <label modpos="nobr">Ultima</label> <parametro id="numerador_fecha.xml" retorna="fecha_ultima"/> </field> ~~~ ## Validar una dirección de correo ~~~xml <field id="email_cuenta"> <label colspan="5">Correo electrónico</label> <size>40</size> <jsfunction event="onblur"> <![CDATA[ var RE=/^[^\s@]+@[^\s@]+\.[^\s@]+$/; if(this.value != '' && !RE.test(this.value)) { alert('E-mail No Válido'); email_cuenta.focus(); } ]]> </jsfunction> </field> ~~~ ## Validar un importe positivo ~~~xml <field id="limite_credito"> <label modpos="nobr">Límite de crédito</label> <tipo>numeric</tipo> <size>15</size> <jsfunction event="onchange"> <![CDATA[ var $limite_credito = limite_credito.value; if(isNaN(parseFloat($limite_credito)) || ($limite_credito < 0) ) { alert('El campo "Límite de crédito" sólo acepta valores numéricos positivos.'); limite_credito.value = null; limite_credito.focus(); } ]]> </jsfunction> </field> ~~~ ## Validar que la baja no sea anterior al alta ~~~xml <field id="baja_cuenta"> <label modpos="nobr">Fecha de baja</label> <tipo>date</tipo> <help> dd/mm/yyyy</help> <jsfunction event="onchange"> <![CDATA[ var $alta_cuenta = alta_cuenta.value; var $baja_cuenta = baja_cuenta.value; if(aFecha($baja_cuenta) < aFecha($alta_cuenta)) { alert('La fecha de baja no puede ser menor que la fecha de alta.'); baja_cuenta.value = null; baja_cuenta.focus(); } ]]> </jsfunction> </field> ~~~ ## Validar que una fecha no sea futura ~~~xml <field id="fecha_nacimiento"> <label modpos="nobr">Fecha de nacimiento</label> <tipo>date</tipo> <help> dd/mm/yyyy</help> <jsfunction event="onchange"> <![CDATA[ var $fecha_actual = new Date(); $dia_actual = $fecha_actual.getDate(); $mes_actual = $fecha_actual.getMonth() + 1; $mes_actual = $mes_actual < 10 ? '0' + $mes_actual : $mes_actual; $anio_actual = $fecha_actual.getFullYear(); var $fecha_actual = $dia_actual + '/' + $mes_actual + '/' + $anio_actual; var $fecha_nacimiento = fecha_nacimiento.value; if(aFecha($fecha_nacimiento) >= aFecha($fecha_actual)) { alert('Ha ingresado una fecha de nacimiento no válida.'); fecha_nacimiento.value = null; fecha_nacimiento.focus(); } ]]> </jsfunction> </field> ~~~ ## Validar un CUIT ~~~xml <field id="cuit_cuenta"> <label modpos="nobr">Nro. de CUIT</label> <help>XX-XXXXXXXX-X</help> <jsfunction event="onchange"> <![CDATA[ var RE=/^(20|23|27|30|33)-[0-9]{8}-[0-9]$/; if(this.value != '' && !RE.test(this.value)) { alert('Ha ingresado un número de CUIT no válido. Formato XX-XXXXXXXX-X'); cuit_cuenta.value = null; cuit_cuenta.focus(); } ]]> </jsfunction> <size>15</size> </field> ~~~ ## Forzar el numerador de página al imprimir El atributo `pageNumber` toma el valor inicial del numerador desde un campo del XML: ~~~xml <?xml version="1.0" encoding="UTF-8"?> <histrix tipo="consulta" _PDFlineColor="255,255,255" PDFfontSize="9" PDForientation="L" sinFecha="true" pageNumber="numerator"> <title>Movimientos Campo con el valor de inicio del numerador ~~~ ## Obtener el usuario conectado `[__user__]` resuelve el usuario de la sesión dentro de una expresión; para el id numérico se lee la variable de sesión con `eval="true"`: ~~~xml
[__user__] $_SESSION['idUser'] ~~~ ------------------------------------------------------------------------------ ## Problemas frecuentes URL: https://docs.histrix.com.ar/es/problemasfrecuentes/ Síntomas habituales, su causa real y cómo resolverlos. ------------------------------------------------------------------------------ Cada entrada parte del síntoma observable, porque es lo único que se tiene al principio. La regla general es diagnosticar antes de editar: pedir el error real de la consola del navegador, el log del servidor web o el SQL generado, y recién entonces corregir. ## Errores de permisos en los logs Al iniciar sesión aparece: [imagen: Error de permisos en el log] ``` There is no existing directory at "/usr/share/histrix/database/{base}/log/{año}/{mes}" and it could not be created: Permission denied ``` Los logs se organizan por año y mes, y el directorio del mes se crea al vuelo. Cuando el proceso web no tiene permiso de escritura, el primer acceso de cada mes falla. ```bash cd /usr/share/histrix/database/{base}/log chmod 777 . mkdir -p 2026/01 chmod 777 2026 2026/01 ``` ## `Class 'NombreDeLaClase' not found` El XML se ejecuta pero no hace nada de lo que define su `dataSource`, o la request falla con ese error. Las clases se cargan por *classmap* de Composer, y el mapa quedó desactualizado tras crear, mover o renombrar la clase: ```bash composer dumpautoload ``` En una instalación con Docker el comando corre dentro del contenedor: ```bash docker exec -it histrix composer dumpautoload ``` ## Un cambio en un XML no se ve Histrix reparsea los XML en cada request: los cambios se ven recargando la página con `Ctrl+F5`. No hace falta limpiar OPcache ni reiniciar el servidor web. Lo que sí tiene caché son los *bundles* de JavaScript y CSS. En una instalación con Apache y `PrivateTmp`, el caché no está en `/tmp/histrix/` del host, así que borrar ese directorio no tiene efecto; hay que reiniciar el servicio: ```bash sudo systemctl restart apache2 ``` En Docker: ```bash docker exec histrix sh -c 'rm -rf /tmp/histrix/*' ``` ## `jQuery is not defined`, o CSS que llega como `text/html` Las respuestas de `/api/js/{db}` o `/api/css/{db}` vienen con el tipo MIME equivocado o incompletas. Son dos causas que suelen darse juntas: 1. Falta un archivo de vendor declarado en el *bundle*. El de CSS falla con 500 y el de JavaScript se genera sin jQuery. 2. El caché de Assetic quedó guardado con el resultado roto. Se corrige quitando del bundle el archivo faltante y borrando el caché de assets del contenedor o reiniciando el servicio web. ## El menú aparece vacío `GET /api/db/{db}/menu/` devuelve HTTP 200 con `tree: []`. Antes de revisar permisos de perfil, mirar `parameters.login` en la respuesta: si viene vacío, el token es válido pero no tiene un usuario asociado, y el menú se arma vacío sin emitir error. Si el login sí está presente, el motivo habitual es que los ítems de `HTXMENU` no tengan `web_version = 1`. Al actualizar una instalación anterior a mayo de 2026 hay que asignarlo. ## Login con error 500 para todos los usuarios Falta la columna `HTXPROFILES.realm`, que el login usa para validar por qué canal puede entrar cada perfil. Como afecta también al administrador, no se puede corregir desde la interfaz: hay que agregar la columna directamente en la base. Ver [Autenticación y OIDC](https://docs.histrix.com.ar/es/autenticacion/). ## 401 con usuario y contraseña correctos El realm que se le exige al usuario sale del primer valor de `oauth_clients.scope`. Si ese campo empieza con algo distinto de `web` —por ejemplo `openid web offline_access`— el login pide un realm que ningún perfil declara y falla en silencio. El orden correcto es `web openid offline_access`. ## 403 en `.well-known/openid-configuration` o `jwks.json` Los endpoints de descubrimiento OIDC no están en la raíz del sitio sino bajo `/api/db/{db}/`. Varios proxies traen reglas que solo permiten `.well-known` en la raíz. El problema está en el proxy inverso, no en Histrix. ## 500 en `jwks.json`, `userinfo` o `authorize` El par de claves RSA de la base tiene el propietario equivocado. Las claves de `database/.oidc/{db}/` las tiene que generar el proceso que atiende el sitio (php-fpm o Apache); si se pre-generaron desde la línea de comandos como root, hay que corregir el propietario. ## Un mismo XML se comporta distinto en dos bases Las dos bases resuelven archivos distintos. Comparar el parámetro `CONFIG::baseModule` de cada una y el contenido de sus respectivos `xmlPath`: un XML propio de la base sobrescribe por completo al del módulo, y un override desactualizado se rompe en silencio cuando el módulo evoluciona. Ver [Arquitectura](https://docs.histrix.com.ar/es/arquitectura/). ## Un campo queda vacío y la grabación no ocurre Si el campo depende de un ``, revisar que todos los identificadores que la expresión menciona estén declarados como `` en el XML. Un identificador no declarado se evalúa como constante indefinida, el resultado queda nulo y se toma la rama falsa sin ningún mensaje de error. Si ese campo se usa además como `idCampoCond`, el registro no se graba. ## Un valor de fecha se graba como `0000-00-00` `setFieldValue` no evalúa funciones SQL: pasar `'now()'` como string a un campo de tipo entero graba una fecha nula sin emitir error y sin que se note en las lecturas posteriores. El valor hay que calcularlo en PHP antes de asignarlo. ## Al elegir una fila de un popup de ayuda no se llena el campo El click marca la fila pero el valor no vuelve al formulario. Las filas de la ayuda necesitan un campo clave para poder identificar el destino; cuando la grilla está sobre una vista de MySQL, el motor no puede descubrir la clave primaria por introspección. Declarar explícitamente `esClave="true"` en el campo identificador de la ayuda. ## Un popup de ayuda devuelve cero filas desde un cliente propio Las ayudas se sirven desde la instancia del formulario padre, no pidiendo el XML de la ayuda por separado: ``` POST /api/db/{db}/instance/{instance}/field/{field}/help/ ``` Esa ruta aplica las condiciones que el padre le impone al helper. Pedir el XML por `app/` ignora esas condiciones. ------------------------------------------------------------------------------ ## Ejemplos URL: https://docs.histrix.com.ar/es/ejemplos/ Casos resueltos con XML de Histrix: CRUD por API, PATCH transaccional, fichas de alta y movimientos encadenados. ------------------------------------------------------------------------------ Esta página reúne casos concretos y el XML que los resuelve. ## CRUD completo expuesto por API Un XML de tipo `crud` cubre las cuatro operaciones sobre una tabla: ```xml Titulo
``` Requisitos: la tabla tiene que tener clave primaria y el campo declararse como autoincremental. El motor decide si corresponde un insert, un update o un delete según el método HTTP de la request (`POST`, `PUT`, `DELETE`, `GET`). ## PATCH transaccional Para procesar un lote de registros en una sola transacción, con la estructura: - man/ - **ejemplo_ing.xml** ```xml {8} "process="true"" # ejemplo_ing.xml Titulo
``` :::caution[Atención] Para que el XML funcione transaccionalmente como un PATCH tiene que ser de tipo `fichaing` y llevar el atributo `process="true"`. ::: El XML padre llama a `inserta_campo_ins.xml` una vez por cada objeto del arreglo que recibe en la request. - man/ - ejemplo_ing.xml - **inserta_campo_ins.xml** ```xml # inserta_campo_ins.xml Titulo
``` Este segundo XML es el que efectivamente inserta en la base y cierra la transacción. :::caution[Atención] Los campos cuyo valor viene del XML padre necesitan `id_temp`; sin ese atributo llegan vacíos. ::: ## Ficha de alta Una ficha para dar de alta un empleado, con un combo de opciones: ```xml # empleados_ing.xml Titulo
varchar varchar date
``` El tipo `fichaing` genera el formulario de alta. Cada campo declara su tipo y su etiqueta; para los desplegables se agrega un `helper` de tipo `combo` apuntando al XML que provee las opciones. La grabación se define aparte, en el movimiento `empleados_ins.xml`: ```xml # empleados_ins.xml Titulo
``` La estructura resultante: - man/ - empleados_ing.xml - empleados_ins.xml ## Dos movimientos encadenados Dos inserciones en tablas distintas dentro de la misma transacción, donde la segunda necesita el id que generó la primera: - man/ - ficha_ejemplo_ing.xml - insert1.xml - insert2.xml El orden importa: primero se inserta en `TABLA1` y después en `TABLA2`, usando el id devuelto por la primera inserción. ```xml # ficha_ejemplo_ing.xml Titulo
varchar int
``` El XML padre declara los movimientos y los campos que completa el usuario. ```xml # insert1.xml Titulo
``` El primer movimiento inserta en `TABLA1` y deja disponible el id generado. ```xml # insert2.xml Titulo
``` El segundo movimiento inserta `descripcion` y `otro`, y toma el `id` del movimiento anterior mediante `lastID="insert1.xml"`: la fila de `TABLA2` queda ligada a la de `TABLA1`.