Данные и состояние
Чтение и изменение парсеров, входных значений, динамических переменных и настроек через объект PK.
Методы этой страницы работают с уже созданными данными проекта. Они не создают парсер, динамическую переменную или настройку по имени: сначала объявите нужный элемент в Студии, затем обращайтесь к нему из JavaScript.
Карта данных
Результаты парсеров
getPars, setPars, getRegex и setRegex читают или заменяют результат одного из 101 разборщиков текущего рабочего потока.
Входная строка
getInputValue читает одну часть исходной строки после разделения по маске входа. Публичного метода записи для этих частей нет.
Переменные и настройки
getDV и setDV работают с динамическими переменными, а getDS читает снимок динамической настройки текущего запуска.
Общее изменение
enterCriticalSection и leaveCriticalSection объединяют несколько операций над общим состоянием в одну неделимую последовательность.
Все значения передаются строками
Парсеры, части входной строки, динамические переменные и динамические настройки возвращают string. Перед числовым вычислением преобразуйте строку явно, проверьте ожидаемый вид и при записи снова передайте строку.
Два разных правила индексов
getPars, setPars, getRegex и setRegex принимают целое число от 1 до 101. Номер совпадает с записью |PARS|[1] или |REGEX|[1] в in-Line Kit.
getInputValue принимает номер от 0 до количества частей минус один. Ноль означает первую часть, один — вторую.
Индексы нельзя переносить между этими группами без пересчёта:
Не передавайте индекс вне диапазона парсеров
Для обычных и регулярных парсеров публичны только номера 1…101. Исполнитель обращается к ячейке напрямую, поэтому значение вне диапазона не имеет безопасного результата и может прервать сценарий.
Результаты парсеров
Каждый рабочий поток имеет собственные результаты парсеров. Перед обработкой входной строки ячейки 1…101 получают служебную строку |NOT USED|; действие разбора или метод записи заменяет значение выбранной ячейки. Позднее действие с тем же номером может заменить его снова.
Подробные различия обычного разбора и регулярного выражения показаны в .
PK.getPars(index)
Возвращает текущее значение обычного парсера с номером index.
index: number — целое число 1…101.
string — текущее содержимое ячейки.
Состояние не меняется.
Пример предполагает, что первый парсер по договору проекта содержит объект JSON. Неверный JSON должен остановить сценарий, а не превращаться в пустой объект.
PK.setPars(index, value)
Немедленно заменяет значение обычного парсера. Следующие действия JavaScript и обращения |PARS|[index] в том же рабочем потоке увидят новую строку.
index: number — 1…101; value: string — новое значение.
Полезного возвращаемого значения нет.
Меняется одна ячейка текущего потока.
После вызова PK.getPars(1) и |PARS|[1] возвращают normalizedLogin, пока другое действие не запишет в первый парсер новое значение.
Части входной строки
PK.getInputValue(index)
Возвращает часть исходной строки после разделения по маске входа проекта. В отличие от парсеров, здесь используется нумерация с нуля.
index: number — целое число от 0 до количества частей минус один.
string — исходная часть входной строки.
Состояние не меняется; публичной записи нет.
Для маски из трёх значений:
Первые две части совпадают с PK.login и PK.pwd. Третья и последующие доступны только по номеру.
Ошибочный номер возвращает текст, а не отдельный признак
Если части с таким номером нет, текущий исполнитель возвращает точную строку no such input string. Такая же строка теоретически может находиться во входных данных, поэтому не стройте логику на сравнении с этим текстом: количество частей должно быть известно из маски проекта.
Динамические переменные
Имя динамической переменной сравнивается точно и с учётом регистра. Переменная должна быть объявлена в проекте заранее. Её область — локальная или глобальная — задаётся в Студии и не меняется методом PK.
Каждый рабочий поток имеет собственное значение. getDV и setDV текущего потока не затрагивают соседние потоки.
Все потоки проекта читают и меняют одно значение. Одиночное чтение или запись защищены, но последовательность «прочитать → вычислить → записать» требует общей критической секции.
Области, начальные значения и сохранение в сессии подробно разобраны в .
PK.getDV(name)
Ищет объявленную динамическую переменную по точному имени и возвращает её текущее значение.
name: string — имя с тем же регистром, что в проекте.
string — текущее значение переменной.
Состояние не меняется.
Если имя не найдено, исполнитель возвращает точную строку no such dynamic variable. Она неотличима от такого же настоящего значения, поэтому правильный способ избежать двусмысленности — объявить переменную и использовать одно точное имя, а не разбирать диагностический текст.
PK.setDV(name, value)
Находит объявленную динамическую переменную и немедленно заменяет её значение.
name: string — точное имя; value: string — новое значение.
Полезного возвращаемого значения нет.
Меняется локальное или общее значение согласно области переменной.
Если имя не найдено, метод молча ничего не меняет. Он не создаёт новую переменную, поэтому ошибка в регистре, например currentPage вместо CurrentPage, оставит старое состояние без отдельного сообщения.
Динамические настройки
PK.getDS(name)
Возвращает содержимое динамической настройки, с которым начат текущий запуск проекта. Объект PK предоставляет для динамических настроек только чтение.
name: string — точная команда настройки с учётом регистра.
string — сохранённое содержимое настройки.
Состояние не меняется; публичной записи нет.
Если имя не найдено, исполнитель возвращает точную строку no such dynamic setting. Она может совпасть с настоящим содержимым, поэтому имя настройки должно задаваться проектом однозначно; не используйте этот текст как надёжный признак отсутствия.
Настройка и переменная решают разные задачи
Динамическая настройка задаётся пользователем перед запуском и читается как конфигурация. Динамическая переменная хранит изменяемое состояние выполнения. Если сценарию нужно новое значение, прочитайте настройку через getDS, а результат работы сохраните в заранее объявленную переменную через setDV.
Критическая секция
Критическая секция нужна только для составной операции над общим состоянием. Отдельные чтение и запись глобальной переменной уже защищены по одному, но между ними другой поток может успеть изменить значение.
PK.enterCriticalSection()
Ожидает освобождения общей секции проекта и входит в неё. После успешного входа остальные потоки, которым нужна эта же секция, ждут вызова PK.leaveCriticalSection().
Параметров нет.
Полезного возвращаемого значения нет.
Текущий поток становится владельцем общей секции.
PK.leaveCriticalSection()
Освобождает секцию, в которую текущий поток ранее успешно вошёл. Вызывайте метод только из finally: тогда ошибка преобразования или записи не оставит остальные потоки заблокированными.
Параметров нет.
Полезного возвращаемого значения нет.
Общая секция освобождается для следующего ожидающего потока.
Незакрытая секция задержит все потоки
После успешного enterCriticalSection ровно один leaveCriticalSection должен выполниться в том же потоке. Не помещайте между ними сетевой запрос, ожидание, большой цикл или вызов чужого кода: всё это время другие потоки не смогут войти в секцию.
Безопасное увеличение общего счётчика
До запуска создайте глобальную динамическую переменную Processed с начальным значением 0.
Секция охватывает чтение, проверку, сложение и запись, поэтому два потока не могут вычислить новое значение из одного старого. finally освобождает секцию и при успешной записи, и при исключении.
Та же последовательность для Скрипт-бокса показана в .