> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Propiedades definidas por el usuario

> Propiedades definidas por el usuario en FlexiLayout language: declare variables tipadas en la sección Campo externo para compartir valores de hipótesis entre elementos.

Una **propiedad definida por el usuario** es una variable tipada que pertenece a un elemento. Estas propiedades se definen en la sección **Campo externo** de la pestaña **Advanced**.

Use el siguiente formato:

```text theme={null}
Type1 Name1;
...
TypeN NameN;
```

donde `Name` es el nombre de la variable y `Type` es su tipo.

Cuando se crean campos, se inicializan automáticamente. Por ejemplo, los campos numéricos se inicializan con valores de cero, y los rectángulos y las regiones se inicializan con valores vacíos.

<div id="field-scope-and-access">
  ## Ámbito y acceso de los campos
</div>

Los campos pueden usarse en el elemento al que pertenecen y en cualquier elemento situado por debajo de él en el árbol de búsqueda. El valor de un campo solo puede modificarse en el elemento al que pertenece. En los demás elementos, está disponible en modo de solo lectura.

Para acceder a un campo de un elemento, use el nombre completo del campo con el formato `ElementName.FieldName` (por ejemplo, `SearchElements.StaticText1.x`). Dentro de un elemento, se puede acceder a su campo por su nombre: `x`. En un elemento compuesto, sus subelementos (en cualquier nivel de anidamiento) también pueden acceder a sus campos por sus nombres cortos.

El valor de una expresión compleja que caracteriza la hipótesis de un elemento puede calcularse y escribirse en una propiedad. Después, se puede acceder a este valor desde cualquier elemento situado más abajo en el árbol de búsqueda, sin tener que calcularlo cada vez que se necesite. Esto reduce el tiempo necesario para realizar la coincidencia de FlexiLayout, elimina la necesidad de copiar una expresión extensa en cada elemento y hace que el código sea más legible.

<div id="field-naming-restrictions">
  ## Restricciones de nomenclatura de campos
</div>

* Dentro de un elemento, los nombres de los campos deben ser únicos.
* El nombre de un elemento dentro de un elemento compuesto no debe coincidir con el nombre de ningún campo de sus subelementos (en cualquier nivel de anidación).
* Los nombres de los campos de un elemento compuesto no deben coincidir con los nombres de ninguno de sus subelementos.

<div id="example-speed-up-matching-with-a-user-defined-property">
  ## Ejemplo: acelerar el emparejamiento con una propiedad definida por el usuario
</div>

Este ejemplo busca dos componentes de dirección: una ciudad (cadena de caracteres **City**) y una estación de metro (cadena de caracteres **Station**). La estación de metro se especifica solo si la ciudad es "Moscow". Para acelerar el emparejamiento de FlexiLayout, el ejemplo define una propiedad `fromMoscow` para el elemento **City**. Esta propiedad es `true` si se detecta el elemento **City** y tiene el valor "Moscow", y `false` en todos los demás casos.

Código para el elemento **City**, en la sección **Campo externo**:

```text theme={null}
logic fromMoscow;
```

En la sección **Relaciones avanzadas de posbúsqueda**:

```text theme={null}
if( not IsNull and Value.Find( "Moscow" ) >= 0 ) then fromMoscow = true;
else fromMoscow = false;
```

El elemento **Station** utiliza esta propiedad para buscar la estación solo si se detecta Moscú como el elemento **City**.

Código del elemento **Station**, en la sección **relación avanzada de prebúsqueda**:

```text theme={null}
if not City.fromMoscow then dontfind;
```

<Warning>
  Debido a estos campos, los elementos del mismo tipo no se consideran idénticos.

  Por lo tanto, la siguiente construcción está prohibida:

  ```text theme={null}
  Let e = SearchElements.StaticText1;
  e = SearchElements.StaticText2; // elemento del mismo tipo
  ```
</Warning>
