Справка

Реестр формы

Облачный Pyrus
Безоблачный Pyrus

Скрипты позволяют использовать в вычислениях реестры задачи текущей или сторонней формы. Для этого в глобальном объекте form есть методы fetchSelfRegister и fetchRegister.

interface form {
    fetchSelfRegister(
        filterFn?: (filter: RegisterFilter) => RegisterFilter,
        fieldNames?: string[],
        options?: RegisterFormOptions,
    ): Promise<RegisterResponse>;

    fetchRegister(
        formId: number,
        filterFn?: (filter: RegisterFilter) => RegisterFilter,
        fieldNames?: string[],
        options?: RegisterFormOptions,
    ): Promise<RegisterResponse>;
}

interface RegisterFilter {
    fieldEquals(fieldName: string, value: FieldValue): RegisterFilter;
    fieldLessThen(fieldName: string, value: FieldValue): RegisterFilter;
    fieldGreaterThen(fieldName: string, value: FieldValue): RegisterFilter;
}

interface RegisterFormOptions {
    activeOnly?: boolean;
    archivedOnly?: boolean;
    taskIds?: number[];
}

interface RegisterResponse {
    tasks: RegisterForm[];
}

interface RegisterForm {
    task_id: number;
    fields: FieldValue[];
}

Аргументы метода fetchSelfRegister:

  • filterFn — необязательная функция фильтрации реестра, получающая и возвращающая объект RegisterFilter. Функция определяет названия и значения (диапазоны значений) полей формы, по которым необходимо отфильтровать реестр;
  • fieldNames — необязательный список названий полей запрашиваемой формы, значения которых необходимо получить в ответе;
  • options — дополнительные параметры фильтрации реестра, позволяющие исключать открытые/закрытые задачи, а также ограничивать реестр фиксированным списком номеров задач.

Аргументы метода fetchRegister отличаются тем, что сперва идет обязательный параметр formId с id формы запрашиваемого реестра.

Методы возвращают Promise с объектом, включающим список задач. Для каждой задачи доступен её номер task_id, а также набор значений полей fields, которые были перечислены в аргументе fieldNames.

Рассмотрим пример. Есть форма «Публикация приказа» с полями «Год», «Номер» и «Документ» (файл с приказом). С помощью запроса реестра из скрипта можно убедиться, что приказ за тот же год и с тем же номером еще не был опубликован:

form.onChange(['Год', 'Номер'])
  .validateAsync('Номер', async state => {
    const [year, num] = state.changes;

    if (!year || !year.text || !num || !num.text)
      return null;

    const duplicates = await form.fetchSelfRegister(f => f
      .fieldEquals('Год', year)
      .fieldEquals('Номер', num), []
    );

    if (!duplicates || !duplicates.tasks)
      return null;

    const firstDuplicate = duplicates.tasks[0];
    if (firstDuplicate)
      return {
        errorMessage: `Приказ <a href="#id${firstDuplicate.task_id}">уже опубликован</a>`
      };

    return null;
  });

Теперь при попытке повторно заполнить форму теми же данными пользователь увидит ошибку со ссылкой на уже существующий приказ:

По умолчанию запрос вернёт все включенные в реестр задачи — как открытые, так и закрытые. Чтобы получить из реестра только активные задачи, используйте запрос вида:

const duplicates = await form.fetchSelfRegister(f => f
    .fieldEquals('Год', year)
    .fieldEquals('Номер', num), [], {
      activeOnly: true,
    }
  );

А чтобы отфильтровать и выгрузить из реестра только завершенные задачи, используйте запрос вида:

const duplicates = await form.fetchSelfRegister(f => f
    .fieldEquals('Год', year)
    .fieldEquals('Номер', num), [], {
      archivedOnly: true
    }
  );

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

С помощью скрипта можно из одной формы обращаться к реестру другой. Для этого используйте запрос вида:

const duplicates = await form.fetchRegister(id_form, f => f
  .fieldEquals('Номер', num), [] );

где в id_form следует указать id формы, реестр которой нужно получить.

Была ли эта статья полезной?