База знаний

Номер статьи: 1505 | Категория: Общие вопросы | Тип: Вопрос/Ответ | Последнее обновление: 11.01.2018

Как отлаживать скрипты FlexiCapture?

Описание

В программном продукте ABBYY FlexiCapture обширные возможности для кастомизации процесса обработки. В то же время, не все знают, как же можно отследить, что скрипт работает корректно или, что еще важнее, как найти ошибку, в случае, если скрипт работает некорректно?

Решение

Далее мы рассмотрим пример отладки скрипта экспорта ABBYY FlexiCapture 10.

Нам понадобится:

Для примера рассмотрим скрипт экспорта, который выполняет экспорт в txt-файл:
Script

В качестве отладчика мы используем Microsoft Visual Studio (см. http://www.microsoft.com/visualstudio/rus#2013-preview). В этом примере будет рассмотрен отладчик Microsoft Visual Studio 2010.

Шаг 1.  Устанавливаем программу-отладчик.

Шаг 2. После того, как отладчик установлен, включаем отладку скриптов в ABBYY FlexiCapture 10. Для этого нужно снять галочку «Не использовать внешние средства отладки скриптов» (Станция настройки проекта → Сервис Опции…Обработка документов).

Шаг 3. Смотрим, как работает наш скрипт. Для этого мы запускаем экспорт документа (Щелчок правой кнопкой мыши по документуЭкспорт). Из-за ошибок в коде скрипта, у нас появляется окно вызова отладчика:Debug

Шаг 4. Открываем отладчик, и нам сразу видно, на какой строке скрипта у нас прерывается выполнение:Debugger

Шаг 5. Изучаем сообщение об ошибке. Из текста сообщения об ошибке «Permission Denied» не сразу понятно, к чему у нас отсутствует доступ и почему. Поэтому мы:

  1. Закрываем программу-отладчик и FlexiCapture;
  2. Открываем папку, куда должен был быть произведен экспорт, в данном случае это корневой каталог диска D ( D:\ );
  3. Удаляем созданный файл;

Шаг 6. Вносим изменения в скрипт. Вставляем вызов отладчика в начало кода скрипта, для JScript это слово debugger:
Script2

Шаг 7. Снова запускаем экспорт. В этот раз выполнение остановилось по нашей инициативе, так как мы сами вызываем отладчик в первой строчке скрипта:
DebuggerCall

Шаг 8. Открываем отладчик:
Debugger2

Шаг 9. Начинаем выполнение скрипта построчно (клавишей F10), для того, чтобы понять, почему прерывается выполнение. Мы дошли до первой значимой переменной “fileName”:Debugger3
Стоит продолжить за ней следить, поэтому мы берем и добавляем ее в Watch (Щелчок правой кнопкой мыши → Add Watch):add watch
По аналогии добавляем переменную txtFile в Watch и выполняем скрипт дальше.  Так как в этом скрипте много циклов, мы ставим точку останова на строку var NoCuenta = Field("SOMEBANK["+k+"]\\NoCuenta").Value; и нажимаем F5:
Break point
Мы прошли все циклы, и сейчас значение переменой k увеличилось на 1 и все начинается заново. Нажимать F10 и снова доходим до txtFile:txtFile
Видим, что переменная fileName не изменилась.  Если бы она изменилась, то в поле Watch она была бы подсвечена красным. Еще шаг, и получаем сообщение об ошибке:
Error message
Сейчас мы заметили, что выполнение скрипта остановилось после второго прохода строчки:
var txtFile = fso.CreateTextFile(fileName, true);
значит проблема в создании файла.

Шаг 10.  Начинаем проводить ревизию скрипта:

Здесь мы замечаем логическую ошибку, так как файл, в который мы писали данные, не был закрыт (при выполнении скрипта, строка txtFile.Close(); не была выполнена) и мы пытаемся снова создать файл с таким же именем. Файл не может быть перезаписан, так как он все еще открыт и занят процессом, что и вызывает сообщение об ошибке.
Поэтому мы переносим строку txtFile.Close(); внутрь внешнего цикла.

Второй подозрительный момент состоит в том, что мы каждый раз создаем файл (CreateTextFile), а не открываем его. Для разрешения ситуации мы смотрим MSDN и ищем способ обойти эту ситуацию. Замечаем, что метод OpenTextFile подходит нам лучше.

Шаг 11. Удаляем ранее полученный текстовый файл и исправляем скрипт:
ScriptFixed

Мы перенесли txtFile.Close(); внутрь первого цикла и изменили метод CreateTextFile() на OpenTextFile().

Шаг 12. Запускаем скрипт – скрипт работает. Таким образом мы отладили скрипт экспорта. 

По аналогии можно проводить отладку кода любых скрипты FlexiCapture, кроме скриптов этапа. Так как скрипт этапа выполняется процессом станции обработки, отладчик для скрипта может быть вызван только из внешней сборки. О том, что такое внешняя сборка и как ее отлаживать смотрите в справке ABBYY FlexiCapture 10 и в статьи Поддержка .Net и Как отладить внешнюю сборку .NET?.

388 считают это полезным.
Была ли эта информация вам полезна?