Private KeeperPrivate Keeper
Объект PK

Данные и состояние

Чтение и изменение парсеров, входных значений, динамических переменных и настроек через объект PK.

Методы этой страницы работают с уже созданными данными проекта. Они не создают парсер, динамическую переменную или настройку по имени: сначала объявите нужный элемент в Студии, затем обращайтесь к нему из JavaScript.

Карта данных

Результаты парсеров

getPars, setPars, getRegex и setRegex читают или заменяют результат одного из 101 разборщиков текущего рабочего потока.

Входная строка

getInputValue читает одну часть исходной строки после разделения по маске входа. Публичного метода записи для этих частей нет.

Переменные и настройки

getDV и setDV работают с динамическими переменными, а getDS читает снимок динамической настройки текущего запуска.

Общее изменение

enterCriticalSection и leaveCriticalSection объединяют несколько операций над общим состоянием в одну неделимую последовательность.

Все значения передаются строками

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

Два разных правила индексов

Парсеры: от 1

getPars, setPars, getRegex и setRegex принимают целое число от 1 до 101. Номер совпадает с записью |PARS|[1] или |REGEX|[1] в in-Line Kit.

Вход: от 0

getInputValue принимает номер от 0 до количества частей минус один. Ноль означает первую часть, один — вторую.

Индексы нельзя переносить между этими группами без пересчёта:

const firstParser = PK.getPars(1);
const firstInputPart = PK.getInputValue(0);

Не передавайте индекс вне диапазона парсеров

Для обычных и регулярных парсеров публичны только номера 1…101. Исполнитель обращается к ячейке напрямую, поэтому значение вне диапазона не имеет безопасного результата и может прервать сценарий.

Результаты парсеров

Каждый рабочий поток имеет собственные результаты парсеров. Перед обработкой входной строки ячейки 1…101 получают служебную строку |NOT USED|; действие разбора или метод записи заменяет значение выбранной ячейки. Позднее действие с тем же номером может заменить его снова.

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

PK.getPars(index)

Возвращает текущее значение обычного парсера с номером index.

Параметр

index: number — целое число 1…101.

Результат

string — текущее содержимое ячейки.

Изменение

Состояние не меняется.

const rawProfile = PK.getPars(1);
const profile = JSON.parse(rawProfile);
const userId = profile.user.id;

Пример предполагает, что первый парсер по договору проекта содержит объект JSON. Неверный JSON должен остановить сценарий, а не превращаться в пустой объект.

PK.setPars(index, value)

Немедленно заменяет значение обычного парсера. Следующие действия JavaScript и обращения |PARS|[index] в том же рабочем потоке увидят новую строку.

Параметры

index: number1…101; value: string — новое значение.

Результат

Полезного возвращаемого значения нет.

Изменение

Меняется одна ячейка текущего потока.

const normalizedLogin = PK.login.trim().toLowerCase();
PK.setPars(1, normalizedLogin);

После вызова PK.getPars(1) и |PARS|[1] возвращают normalizedLogin, пока другое действие не запишет в первый парсер новое значение.

Части входной строки

PK.getInputValue(index)

Возвращает часть исходной строки после разделения по маске входа проекта. В отличие от парсеров, здесь используется нумерация с нуля.

Параметр

index: number — целое число от 0 до количества частей минус один.

Результат

string — исходная часть входной строки.

Изменение

Состояние не меняется; публичной записи нет.

Для маски из трёх значений:

const login = PK.getInputValue(0);
const password = PK.getInputValue(1);
const recoveryEmail = PK.getInputValue(2);

if (login !== PK.login || password !== PK.pwd) {
  throw new Error("Входные значения не совпали");
}

Первые две части совпадают с PK.login и PK.pwd. Третья и последующие доступны только по номеру.

Ошибочный номер возвращает текст, а не отдельный признак

Если части с таким номером нет, текущий исполнитель возвращает точную строку no such input string. Такая же строка теоретически может находиться во входных данных, поэтому не стройте логику на сравнении с этим текстом: количество частей должно быть известно из маски проекта.

Динамические переменные

Имя динамической переменной сравнивается точно и с учётом регистра. Переменная должна быть объявлена в проекте заранее. Её область — локальная или глобальная — задаётся в Студии и не меняется методом PK.

Локальная

Каждый рабочий поток имеет собственное значение. getDV и setDV текущего потока не затрагивают соседние потоки.

Глобальная

Все потоки проекта читают и меняют одно значение. Одиночное чтение или запись защищены, но последовательность «прочитать → вычислить → записать» требует общей критической секции.

Области, начальные значения и сохранение в сессии подробно разобраны в справке по состоянию выполнения.

PK.getDV(name)

Ищет объявленную динамическую переменную по точному имени и возвращает её текущее значение.

Параметр

name: string — имя с тем же регистром, что в проекте.

Результат

string — текущее значение переменной.

Изменение

Состояние не меняется.

const currentPage = PK.getDV("CurrentPage");

Если имя не найдено, исполнитель возвращает точную строку no such dynamic variable. Она неотличима от такого же настоящего значения, поэтому правильный способ избежать двусмысленности — объявить переменную и использовать одно точное имя, а не разбирать диагностический текст.

PK.setDV(name, value)

Находит объявленную динамическую переменную и немедленно заменяет её значение.

Параметры

name: string — точное имя; value: string — новое значение.

Результат

Полезного возвращаемого значения нет.

Изменение

Меняется локальное или общее значение согласно области переменной.

const page = 7;
PK.setDV("CurrentPage", String(page));

Если имя не найдено, метод молча ничего не меняет. Он не создаёт новую переменную, поэтому ошибка в регистре, например currentPage вместо CurrentPage, оставит старое состояние без отдельного сообщения.

Динамические настройки

PK.getDS(name)

Возвращает содержимое динамической настройки, с которым начат текущий запуск проекта. Объект PK предоставляет для динамических настроек только чтение.

Параметр

name: string — точная команда настройки с учётом регистра.

Результат

string — сохранённое содержимое настройки.

Изменение

Состояние не меняется; публичной записи нет.

const apiBaseUrl = PK.getDS("ApiBaseUrl");

Если имя не найдено, исполнитель возвращает точную строку no such dynamic setting. Она может совпасть с настоящим содержимым, поэтому имя настройки должно задаваться проектом однозначно; не используйте этот текст как надёжный признак отсутствия.

Настройка и переменная решают разные задачи

Динамическая настройка задаётся пользователем перед запуском и читается как конфигурация. Динамическая переменная хранит изменяемое состояние выполнения. Если сценарию нужно новое значение, прочитайте настройку через getDS, а результат работы сохраните в заранее объявленную переменную через setDV.

Критическая секция

Критическая секция нужна только для составной операции над общим состоянием. Отдельные чтение и запись глобальной переменной уже защищены по одному, но между ними другой поток может успеть изменить значение.

PK.enterCriticalSection()

Ожидает освобождения общей секции проекта и входит в неё. После успешного входа остальные потоки, которым нужна эта же секция, ждут вызова PK.leaveCriticalSection().

Параметры

Параметров нет.

Результат

Полезного возвращаемого значения нет.

Изменение

Текущий поток становится владельцем общей секции.

PK.leaveCriticalSection()

Освобождает секцию, в которую текущий поток ранее успешно вошёл. Вызывайте метод только из finally: тогда ошибка преобразования или записи не оставит остальные потоки заблокированными.

Параметры

Параметров нет.

Результат

Полезного возвращаемого значения нет.

Изменение

Общая секция освобождается для следующего ожидающего потока.

Незакрытая секция задержит все потоки

После успешного enterCriticalSection ровно один leaveCriticalSection должен выполниться в том же потоке. Не помещайте между ними сетевой запрос, ожидание, большой цикл или вызов чужого кода: всё это время другие потоки не смогут войти в секцию.

Безопасное увеличение общего счётчика

До запуска создайте глобальную динамическую переменную Processed с начальным значением 0.

PK.enterCriticalSection();

try {
  const currentText = PK.getDV("Processed");
  const current = Number(currentText);

  if (!Number.isInteger(current)) {
    throw new Error("Processed должен содержать целое число");
  }

  PK.setDV("Processed", String(current + 1));
} finally {
  PK.leaveCriticalSection();
}

Секция охватывает чтение, проверку, сложение и запись, поэтому два потока не могут вычислить новое значение из одного старого. finally освобождает секцию и при успешной записи, и при исключении.

Та же последовательность для Скрипт-бокса показана в справке in-Line Kit.