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

No se recomienda marcar la casilla **Optional element** para elementos de grupo. Esto se debe a que, si el elemento de grupo es **Optional element** y no se detecta (su calidad es inferior a la calidad de una hipótesis nula, o se llama para él a la función **Dontfind()**), cualquier llamada a cualquiera de sus subelementos provocará errores, porque 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 debe hacer referencia a ninguno de los subelementos.

Entonces, ¿por qué necesitamos un elemento de grupo opcional y su hipótesis nula? Se necesita cuando todo el grupo de campos no está presente en la imagen. En ese caso, no tiene sentido buscarlos. Además, la búsqueda de los elementos puede acelerarse llamando al método **DontFind()** para el elemento de grupo.

<Note>
  Por "call" nos referimos a 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 establecer las restricciones de búsqueda en Relations, la comprobación **IsNull** se realiza automáticamente. Puede verlo si hace clic en **Code** en la pestaña Advanced.
</Note>

Para ilustrarlo, creamos 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**, marcamos la casilla **Optional element**. En la pestaña Advanced, en la sección relación avanzada de prebúsqueda, escribimos el siguiente código:

**if** FormID.IsNull then Dontfind();

A continuación, comprobamos la presencia del elemento que identifica el tipo de documento. Mediante el elemento **FormID**, creado antes del elemento de grupo **InvoiceRequisiteGroup**, buscamos 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 **Search text**, se genera una hipótesis no nula para el elemento **FormID**. De lo contrario, el texto estático **FormID** no se detecta e indicamos al programa que no busque el elemento de grupo **InvoiceRequisiteGroup**; es decir, creamos una hipótesis nula para el elemento de grupo opcional **InvoiceRequisiteGroup**.

En el proyecto hay un elemento **TotalSumHeader** que se utiliza para buscar el nombre del campo de suma. Para este elemento, se introduce el siguiente código en la sección **relación avanzada de prebúsqueda**:

Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, **0** \* dot;

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

Ejecutemos el procedimiento de emparejamiento de FlexiLayout en ambas páginas del lote. En la página 1, el procedimiento se completó correctamente, pero al intentar aplicar FlexiLayout a la página 2, el programa muestra el siguiente mensaje de error: **"Page 2: Error in element "SearchElements.TotalSumHeader", Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup"**.

Esto sucede porque en la página 2 el valor del identificador del documento es ID 2589. Dado que este valor es distinto del especificado en las propiedades del elemento **FormID**, la función **Dontfind()** para el elemento de grupo **InvoiceRequisiteGroup** generó una hipótesis nula. Por lo tanto, en el código se llamó a una hipótesis inexistente.

El código correcto debe verse así.

**if** not( SearchElements.InvoiceRequisiteGroup.IsNull ) then
\{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, **0** \* dot;}

<Note>
  Si comenta el código en la sección relación avanzada de prebúsqueda y activa la marca 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á que el código compilado ya contiene la comprobación **IsNull**.
</Note>
