Заполнение полей
Для заполнения или редактирования поля необходимо подписаться на изменение необходимых полей формы через onChange и вызвать одну из функций: setValue, setValueAsync, setValues или setValuesAsync.
interface form { onChange( fieldNames: string[], executeOnLoad: boolean = false ): ChangeHandler } interface ChangeHandler { setValue( fieldName: string, calcSync: (state: FormState) => FieldValue ) setValueAsync( fieldName: string, calcAsync: (state: FormState) => Promise<FieldValue> ) setValues( fieldNames: string[], calcSync: (state: FormState) => FieldValue[] ) setValuesAsync( fieldNames: string[], calcAsync: (state: FormState) => Promise<FieldValue[]> ) setAssignee( calcSync: (state: FormState) => number | null ) setAssigneeAsync( calcAsync: (state: FormState) => number | null ) }
Аргументы метода setValue
:
fieldName
— название поля, значение которого нужно вычислитьcalcFunction
— функция вычисления значения поля.
Функция calcFunction
получает на вход единственным аргументом объект типа FormState и возвращает новое значение (см. Формат значений полей) вычисленного поля, объявленного в методе setValue
.
Для случаев, когда нужно вычислить сразу несколько полей на основе одних и тех же данных, удобно воспользоваться методом setValues
— он принимает массив имен полей, а calcFunction
в этом случае должна вернуть соответствующий массив значений этих полей.
Если для вычислений требуется произвести асинхронные операции (например, дождаться завершения запроса реестра или загрузки справочника), воспользуйтесь асинхронными версиями методов: setValueAsync
и setValuesAsync
. Их отличие в том, что в calcFunction
возвращается Promise («обещание»), который вернет значения полей. Пример использования приведен в разделе Реестр формы.
Обратите внимание: применение методов setValue
/setValues
/setValueAsync
/setValuesAsync
делает невозможным ручное заполнение автоматически вычисляемых полей.
Таблицы
Для форм с таблицами скрипты позволяют:
- вычислять значения полей таблицы по соседним полям строки;
- ссылаться на сумму колонки таблицы при вычислении обычных полей;
- описывать условия и поддерживать не только числовые поля.
Вычисляемое поле таблицы
Есть форма с таблицей товаров, в которой для каждого товара содержится «Название», «Цена», «Количество», «Сумма» и «Ставка НДС» (поле мультивыбор со значениями «0%», «10%» и «18%»): Поле «Сумма» можно заполнять автоматически с помощью следующего кода:
form.onChange(['Цена', 'Количество', 'Ставка НДС']) .setValue('Сумма', state => { const [price, quantity, ndsRate] = state.changes; if (!price || !price.value || !quantity || !quantity.value || !ndsRate) return 0; let cost = price.value * quantity.value; const nds = ndsRate.choice_name ? parseInt(ndsRate.choice_name) : 0; if (ndsRate.choice_name) cost += cost * (nds / 100); return cost; });
Сумма колонки таблицы
Добавим в форму с таблицей товаров два поля после таблицы: «Процент скидки» и «Итого». Следующий код позволит заполнить поле «Итого» по товарам из таблицы с учетом скидки:
form.onChange(['Сумма', 'Процент скидки']) .setValue('Итого', state => { const [cost, discount] = state.changes; if (!cost || !discount) return null; const total = cost.sum * (1 - discount.value / 100); return total; });
Оба блока кода могут работать совместно, образуя цепочку зависимых полей.
Назначение ответственного
Методы setAssignee
и setAssigneeAsync
позволяют устанавливать ответственного в зависимости от значений полей формы. В этом случае функция расчета должна вернуть id (число) пользователя, которого необходимо назначить ответственным в задаче.
Рассмотрим простой пример: значение поля «Исполнитель» будет копироваться в системное поле «Ответственный»:
form.onChange(['Исполнитель']) .setAssignee(state => { const [executor] = state.changes; return executor?.person_id; });