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

# La propiedad Optional de un elemento de grupo

> Descubra cuándo marcar un elemento de grupo como Optional en FlexiLayout Studio, cómo se comportan las hipótesis nulas y por qué las llamadas a subelementos requieren primero una comprobación de IsNull.

Al crear un elemento de grupo, la casilla **Optional element** está desmarcada de forma predeterminada; es decir, el elemento es obligatorio. Durante el emparejamiento de FlexiLayout, se genera una hipótesis no nula para un elemento de grupo obligatorio, incluso si se generan hipótesis nulas para todos sus subelementos.

Para comprobar las propiedades de los subelementos de una hipótesis de este tipo, llame al código en sus secciones **Advanced**. Si el elemento de grupo es opcional, puede generarse para él una hipótesis nula (si no hay hipótesis no nulas con una calidad superior a la de una hipótesis nula).

<div id="why-calls-to-an-undetected-optional-group-fail">
  ## Por qué fallan las llamadas a un elemento de grupo opcional no detectado
</div>

Evite seleccionar la casilla **Optional element** para los elementos de grupo.

La razón es que, si el elemento de grupo está marcado como **Optional element** y no se detecta (su calidad es inferior a la de una hipótesis nula, o se llama a la función `Dontfind()` para él), cualquier llamada a cualquiera de sus subelementos provocará errores. Esto se debe a que, en un grupo con una hipótesis nula, no se generan hipótesis para los subelementos.

Para evitar este error, primero debe comprobar el elemento de grupo. Si la comprobación `IsNull` devuelve `True`, no acceda a ninguno de los subelementos.

<div id="when-an-optional-group-element-is-useful">
  ## Cuándo resulta útil un elemento de grupo opcional
</div>

Se necesitan un elemento de grupo opcional y su hipótesis nula cuando todo el grupo de campos no está presente en la imagen, de modo que buscarlo no tiene ningún sentido. Puede acelerar la búsqueda de los elementos llamando al método `DontFind()` para el elemento de grupo.

<Note>
  Aquí, "llamar" significa escribir código en cualquiera de las secciones de la pestaña **Advanced** o en las propiedades del bloque de la ventana **Expression**. Si se llama a las propiedades de un elemento de grupo al configurar las restricciones de búsqueda en **Relations**, la comprobación de `IsNull` se realiza automáticamente. Puede verlo si hace clic en **Code** en la pestaña **Advanced**.
</Note>

<div id="the-groupsamplefsp-sample-project">
  ## El proyecto de ejemplo GroupSample.fsp
</div>

Esto se muestra en el proyecto `GroupSample.fsp` (carpeta `%public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group`).

En el cuadro de diálogo de **Propiedades** del elemento de grupo **InvoiceRequisiteGroup**, está marcada la casilla **Optional element**.

En la pestaña **Advanced**, la sección **relación avanzada de prebúsqueda** contiene el siguiente código:

```text theme={null}
if FormID.IsNull then Dontfind();
```

Este código comprueba la presencia del elemento que identifica el tipo de documento. El elemento **FormID**, creado antes del elemento de grupo **InvoiceRequisiteGroup**, busca el texto estático con un valor conocido ("ID2015").

Si el valor del identificador del documento coincide con el valor especificado en la sección **Texto a buscar**, se genera una hipótesis no nula para el elemento **FormID**. De lo contrario, no se detecta el texto estático **FormID** y se le indica a FlexiLayout Studio que no busque el elemento de grupo **InvoiceRequisiteGroup**. En ese caso, se crea una hipótesis nula para el elemento de grupo opcional **InvoiceRequisiteGroup**.

El proyecto contiene un elemento **TotalSumHeader** que se utiliza para buscar el nombre del campo de suma.

El siguiente código se introduce para el elemento en la sección **relación avanzada de prebúsqueda**:

```text theme={null}
Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;
```

Este código significa que la búsqueda del nombre se realizará debajo del campo de fecha definido por el elemento **InvoiceDateHeader**, que, a su vez, es un subelemento del elemento de grupo **InvoiceRequisiteGroup**.

<div id="reproduce-and-fix-the-undefined-hypothesis-error">
  ## Reproducir y corregir el error de hipótesis no definida
</div>

Ejecute el procedimiento de emparejamiento de FlexiLayout en ambas páginas del batch. En la página 1, el procedimiento se completa correctamente, pero cuando FlexiLayout se aplica a la página 2, FlexiLayout Studio muestra el siguiente mensaje de error:

```text theme={null}
"Página 2: Error en el elemento "SearchElements.TotalSumHeader", sección de parámetros del generador Advanced: Intento de acceder a una hipótesis no definida: SearchElements.InvoiceRequisiteGroup"
```

Esto sucede porque, en la página 2, el valor del identificador del documento es ID 2589. Como este valor es distinto del especificado en las Propiedades del elemento **FormID**, la función `Dontfind()` generó una hipótesis nula para el elemento de grupo **InvoiceRequisiteGroup**. Como resultado, el código intentó llamar a una hipótesis que no existía.

El código correcto debe verse así.

```text theme={null}
if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then
{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
```

<Note>
  Si comentas el código de la sección **relación avanzada de prebúsqueda** y seleccionas la casilla de verificación situada junto a la restricción de búsqueda similar del elemento **TotalSumHeader** en la sección **Relations**, al hacer clic en **Code** en la pestaña **Advanced** verás que el código compilado ya contiene la comprobación `IsNull`.
</Note>
