> ## 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.

# Propriétés définies par l’utilisateur

> Propriétés définies par l’utilisateur dans le langage FlexiLayout : déclarez des variables typées dans la section champs externes pour partager des valeurs d’hypothèse entre les éléments.

Une **propriété définie par l’utilisateur** est une variable typée qui appartient à un élément. Ces propriétés sont définies dans la section **Champs externes** de l’onglet **Avancé**.

Utilisez le format suivant :

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

où `Name` est le nom de la variable et `Type` son type.

Lorsque des champs sont créés, ils sont automatiquement initialisés. Par exemple, les champs numériques sont initialisés à zéro et les rectangles et les régions avec des valeurs vides.

<div id="field-scope-and-access">
  ## Portée et accès des champs
</div>

Les champs peuvent être utilisés dans l’élément auquel ils appartiennent ainsi que dans tout élément situé plus bas dans l’arbre de recherche. La valeur d’un champ ne peut être modifiée que dans l’élément auquel il appartient. Dans les autres éléments, elle est disponible en lecture seule.

Pour accéder au champ d’un élément, utilisez le nom complet du champ au format `ElementName.FieldName` (par exemple, `SearchElements.StaticText1.x`). Dans un élément, il est possible d’accéder à son champ par son nom : `x`. Pour un élément composé, ses sous-éléments (à n’importe quel niveau d’imbrication) peuvent également accéder à ses champs par leur nom court.

La valeur d’une expression complexe qui caractérise l’hypothèse d’un élément peut être calculée et écrite dans une propriété. Cette valeur peut ensuite être utilisée depuis n’importe quel élément situé plus bas dans l’arbre de recherche, sans devoir être recalculée chaque fois qu’elle est nécessaire. Cela réduit le temps nécessaire à l’exécution du FlexiLayout, évite d’avoir à copier une expression volumineuse dans chaque élément et rend le code plus lisible.

<div id="field-naming-restrictions">
  ## Restrictions de dénomination des champs
</div>

* Au sein d’un élément, les noms de champ doivent être uniques.
* Dans un élément composé, le nom d’un élément ne doit correspondre à aucun nom de champ de ses sous-éléments, quel que soit le niveau d’imbrication.
* Les noms de champ d’un élément composé ne doivent pas correspondre aux noms de ses sous-éléments.

<div id="example-speed-up-matching-with-a-user-defined-property">
  ## Exemple : accélérer la mise en correspondance avec une propriété définie par l’utilisateur
</div>

Cet exemple recherche deux composants d’adresse : une ville (Character String **City**) et une station de métro (Character String **Station**). La station de métro n’est spécifiée que si la ville est Moscou. Pour accélérer la mise en correspondance, l’exemple définit une propriété `fromMoscow` pour l’élément **City**. Cette propriété vaut `true` si l’élément **City** est détecté et a pour valeur `"Moscow"`, et `false` dans tous les autres cas.

Code de l’élément **City**, dans la section **Champs externes** :

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

Dans la section **Advanced post-search relations** :

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

L’élément **Station** utilise ensuite cette propriété pour rechercher la station uniquement si Moscou est détectée comme élément **City**.

Code de l’élément **Station**, dans la section **relations avancées de pré-recherche** :

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

<Warning>
  Du fait de ces champs, les éléments du même type ne sont pas considérés comme identiques.

  Par conséquent, l'écriture suivante est interdite :

  ```text theme={null}
  Let e = SearchElements.StaticText1;
  e = SearchElements.StaticText2; // élément du même type
  ```
</Warning>
