Russian (Русский) - Change language

Свойство Optional составного элемента

При создании составного элемента по умолчанию флажок Optional element у него снят, т.е. элемент является по умолчанию обязательным. При наложении гибкого описания для обязательного составного элемента формируется ненулевая гипотеза, даже если для всех его элементов сформированы нулевые гипотезы. У такой гипотезы можно обратиться в коде Advanced - секций к гипотезам подэлементов для проверки их свойств. Если составной элемент является опциональным, то для него также формируется нулевая гипотеза по обычным правилам, т.е. когда не нашлось ни одной ненулевой гипотезы с качеством выше, чем качество нулевой.

Рекомендуется не устанавливать флажок Optional element для составного элемента. Дело в том, что если составной элемент необязательный (Optional element) и не найден (его качество оказалось ниже качества нулевой гипотезы или для него была вызвана функция Dontfind()), то обращение к какому-либо из подэлементов составного элемента вызовет ошибку, т.к. у нулевой гипотезы группы гипотезы подэлементов не определены. Чтобы избежать такой ошибки, нужно предварительно сделать проверку на IsNull составного элемента. В случае, если IsNull возвращает True, обращаться к подэлементам нельзя.

Зачем может понадобиться опциональный групповой элемент и его нулевая гипотеза? Это нужно, если на изображении целая группа полей может отсутствовать. Тогда при некоторых условиях искать ее бессмысленно. Таким образом, можно ускорить поиск элементов, вызвав метод DontFind() для группового элемента.

Замечание. Под обращением подразумевается написание кода в любой из секций на вкладке Advanced или в свойствах блока в окне Expression. Если обращение к свойствам подэлемента составного элемента происходит при задании условий поиска в секции Relations , то проверка на IsNull осуществляется автоматически. В этом можно убедиться, нажав кнопку Code на вкладке Advanced.

Для иллюстрации был создан проект GroupSample.fsp (папка %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group).

В диалоге свойств составного элемента InvoiceRequisiteGroup мы установили флажок Optional element. На вкладке Advanced в секции Advanced pre-search relations задали следующий код:

if FormID.IsNull then Dontfind();
    

Мы проверяем наличие элемента - идентификатора типа формы. С помощью элемента FormID, созданного перед составным элементом InvoiceRequisiteGroup, ищем статический текст с определенным значением (“ID2015”). Если значение идентификатора на форме совпадает со значением, заданным в секции Search text, то для элемента FormID формируется ненулевая гипотеза. Иначе статический текст FormID не находится и мы сообщаем программе, что не надо искать составной элемент InvoiceRequisiteGroup. Т.е. мы таким способом сформировали нулевую гипотезу составного элемента InvoiceRequisiteGroup, который является необязательным.

В проекте создан элемент TotalSumHeader для поиска заголовка поля суммы. В секции Advanced pre-search relations этого элемента задан код:

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

Он означает, что поиск заголовка будет идти ниже заголовка поля даты, описанного элементом InvoiceDateHeader. А этот элемент в свою очередь является подэлементом составного элемента InvoiceRequisiteGroup.

Запустим процедуру наложения гибкого описания на обеих страницах пакета. Для страницы 1 процедура наложения прошла успешно. А при попытке наложить гибкое описание на страницу 2 программа выдала сообщение об ошибке: “Page 2: Error in element “SearchElements.TotalSumHeader”, Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup”.

Это произошло потому, что на второй странице значение идентификатора формы равно ID 2589. Поскольку это значение отличается от заданного в свойствах элемента FormID, для составного элемента InvoiceRequisiteGroup, благодаря вызову функции Dontfind(), оказалась сформирована нулевая гипотеза. Т.е. мы в коде попытались обратиться к несуществующей гипотезе.

Правильный код должен был бы выглядеть следующим образом.

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

Замечание. Если закомментировать код, приведенный в секции Advanced pre-search relations и включить флажок рядом с аналогичным условием поиска элемента TotalSumHeader в секции Relations, то, нажав кнопку Code на вкладке Advanced, можно увидеть, что автоматически скомпилированный код уже будет содержать проверку на IsNull.

01.12.2020 7:04:05


Please leave your feedback about this article